java.text.Format 格式化 总结

java.text.Format体系总结
[url]http://jianzong2000.iteye.com/blog/406304[/url][quote]
1.1. Format的方法
java.text.Format做为一个抽象类,有二个抽象方法,
format(Object obj, StringBuffer toAppendTo, FieldPosition pos):格式化一个对象,并将得到的文本追加到给定的字符缓冲区。是将obj格式化为字符串,并加入到toAppendTo中。
parseObject(String source, ParsePosition pos): 分析字符串文本,生成一个对象。是format方法的逆向方法,将String转化为Object。
另外的format和parseObject这两个方法的重载。
方法formatToCharacterIterator(Object obj)并非抽象方法,api上要求子类必须实现这个方法。

1.2. Format的子类
Java 2 平台为格式化日期、消息和数字分别提供了三个特殊的 Format 的子类:DateFormat(抽象类)、MessageFormat 和 NumberFormat(抽象类)。
——>DateFormat ——>SimpleDateFormat
Format ——>MessageFormat
——>NumberFormat——>ChoiceFormat
——> DecimalFormat用于格式化十进制数字

1.3. DateFormat的用法
DateFormat 是日期/时间格式化子类的抽象类, 有一些static的get***Instance()方法来获得实例。通过设置结果的长度和地区,来获得日期,时间等的格式formatter。不太常用。
一般会使用SimpleDateFormat子类,new SimpleDateFormat("yyyy-MM-dd")或new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),来获得常用的时间格式。DateFormat 的get***Instance()方法一般也是获得SimpleDateFormat。
看DateFormat的源代码有个疑问,如果继承了DateFormat类,那DateFormat. get***Instance()的方法还是返回SimpleDateFormat? DateFormat.get是私有的,也不能覆盖。
DateFormat类中还有一些static的字段,如WEEK_OF_MONTH_FIELD, WEEK_OF_YEAR_FIELD。api上说在FieldPosition中使用,用于对齐。
java.util.Calendar也是日期操作相关的类,实现类为GregorianCalendar。主要对日期进行操作。注意add方法和roll方法的区别,roll方法不更改更大的字段。还有一些静态的变量DAY_OF_MONTH,DAY_OF_WEEK等,在get/set/add/roll方法中使用。

1.4. MessageFormat的用法
和SimpleDateFormat一样,也需要传入一个pattern。如
String result = MessageFormat.format(
"At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
7, new Date(), “ a message ”);
其中
{1,time}中1是指第几个参数,time是指格式化的类型。根据api进行设置,是调用NumberFormat和DateFormat进行格式化的。
还可以调用parse方法将字符串转化为Obejct。

1.5. NumberFormat的用法
1.5.1. NumberFormat的介绍
NumberFormat 是所有数字格式的抽象基类。类结构与DateFormat类似。主要也是通过get***Instance方法获得实现类DecimalFormat。
比较常用的方法有:
setParseIntegerOnly:只影响分析。设为true,则忽略小数点以后的位置。
setDecimalSeparatorAlwaysShown:只影响格式化,且只影响小数点后没有数字的情况?设置分组符号是否显示。例如1,234中的,号是否显示。
setGroupingUsed:是否分组。如果此格式中使用了组,则返回 true。例如,在英国语言环境中,如果设置了组,则数 1234567 可能被格式化为 "1,234,567"。
还可以设置小数/整数部分的最大/小位数。
关于parse方法中的ParsePosition 和 format方法中的FieldPosition待研究。

1.5.2. 子类DecimalFormat
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。在DecimalFormat中传入pattern,可以自定义格式化类型。舍入方式是half-even(四舍五入)。
DecimalFormat 模式包含正数和负数子模式,例如 "#,##0.00;-#,##0.00"。;后面的代表负数模式。单独的 "0.00" 等效于 "0.00;-0.00"。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;
0:代表是数字;如果不存在则显示为0;
#:代表是数字;
,:分组分隔符;没有则不分组

1.5.3. 子类ChoiceFormat
ChoiceFormat通常用于在 MessageFormat 中处理复数。创建 ChoiceFormat 时,可以指定一个 format 数组和一个 limit 数组。这些数组的长度必须相同。
如api中用于转换星期的例子
double[] limits = {1,2,3,4,5,6,7};
String[] monthNames = {"Sun","Mon","Tue","Wed","Thur","Fri","Sat"};
ChoiceFormat form = new ChoiceFormat(limits, monthNames);
ParsePosition status = new ParsePosition(0);
for (double i = 0.0; i <= 8.0; ++i) {
status.setIndex(0);
System.out.println(i + " -> " + form.format(i) + " -> "
+ form.parse(form.format(i),status));
}
form.format(i)根据limits的数字转换为星期几的名称。limits中的数字必须按升序排列,如果提供的数字不在limits中,则选择使用第一个或最后一个索引。
form.parse(form.format(i),status),则根据Name转换为limits中的值。

1.5.4. ChoiceFormat的例子
下面是ChoiceFormat的api中一个较复杂的带模式格式的例子, 和MessageFormat一起使用:
//生成ChoiceFormat
double[] filelimits = {0,1,2};
String[] filepart = {"are no files","is one file","are {2} files"};//这里的2是指从testArgs中取第二个元素的值
ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);

//定义Format数组testFormats,分别为ChoiceFormat,null, NumberFormat
//ChoiceFormat用于{0}, null用于{1}, NumberFormat用于{2}
Format[] testFormats = {fileform, null, NumberFormat.getInstance()};

//将MessageFormat的formats设为testFormats
//testFormats中的格式顺序对应于模式字符串中的格式元素的顺序
//最好使用setFormatsByArgumentIndex方法,而不是使用setFormats
MessageFormat pattform = new MessageFormat("There {0} on {1}");
pattform.setFormats(testFormats);

//进行fomat
Object[] testArgs = {null, "ADisk", null};
for (int i = 0; i < 4; ++i) {
testArgs[0] = new Integer(i);
testArgs[2] = testArgs[0];
//此时的testArgs值为{0, "ADisk",0}
//根据MessageFormat的定义,对testArgr元素进行处理
System.out.println(pattform.format(testArgs));
}

1.5.5. ChoiceFormat的pattern构造方法
ChoiceFormat还有另外一个构造方法,传入pattern。
为 ChoiceFormat 对象指定一个模式是相当直接的。例如:
ChoiceFormat fmt = new ChoiceFormat(
"-1#is negative| 0#is zero or fraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2.");
其中数字#是按照大小顺序排列的, formate方法中传入参数x,如果x在0,1之间,则按照0处理。

1.5.6. 其它的数字格式化
另外在对数字进行格式化时,也可以考虑使用java.math.BigDecimal。
如setScale(int newScale,int roundingMode):newScale指精确度,即保留几位小数。roundingMode指舍入模式,常用的是四舍五入。DecimalFormat貌似只能使用四舍五入,如果使用别的舍入方式,就要使用BigDecimal了。
java.lang.Integer中的几个转换进制的方法也比较实用
toBinaryString(int i): 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
toHexString(int i): 以十六进制的无符号整数形式返回一个整数参数的字符串表示形式
toOctalString(int i) :以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
[/quote]


import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestFormat {

public static void main(String[] args) {

defaultNumberFormat();
System.out.println();

customNumberFormat();
System.out.println();

defaultDateFormat();
System.out.println();

customDateFormat();
System.out.println();
}

public static void defaultNumberFormat() {

int i = 123456;

double x = 882323.23523;

double p = 0.528;

double c = 52.83;

NumberFormat nf = NumberFormat.getInstance();
System.out.println("NumberFormat.getInstance()");
System.out.println("Integer " + i + " is displayed as " + nf.format(i));
System.out.println("Double " + x + " is displayed as " + nf.format(x));

NumberFormat nfInt = NumberFormat.getIntegerInstance();
System.out.println("NumberFormat.getIntegerInstance()");
System.out.println("Integer " + i + " is displayed as "
+ nfInt.format(i));

NumberFormat nfNumber = NumberFormat.getNumberInstance();
System.out.println("NumberFormat.getNumberInstance()");
System.out.println("Double " + x + " is displayed as "
+ nfNumber.format(x));

NumberFormat nfPercent = NumberFormat.getPercentInstance();
System.out.println("NumberFormat.getPercentInstance()");
System.out.println("Percent " + p + " is displayed as "
+ nfPercent.format(p));

NumberFormat nfCurrency = NumberFormat.getCurrencyInstance();
System.out.println("NumberFormat.getCurrencyInstance()");
System.out.println("Currency " + c + " is displayed as "
+ nfCurrency.format(c));

// 这里没有涉及相应的parse方法

}

public static void customNumberFormat() {

double x = 1000.0 / 3;

System.out.println("default output is " + x);//333.3333333333333
patternPrint("###,###.##", x);//333.33
patternPrint("####.##", x);//333.33
patternPrint("####.00", x);//333.33
patternPrint("####.0#", x);//333.33
patternPrint("00000.##", x);//00333.33
patternPrint("$###,###.##", x);//$333.33
patternPrint("0.###E0", x);//3.333E2
patternPrint("00.##%", x);//33333.33%
double y = 23.0012;
System.out.println("default output is " + y);//23.0012
patternPrint("###,###.##", y);//23
patternPrint("####.##", y);//23
patternPrint("####.00", y);//23.00
patternPrint("####.0#", y);//23.0
patternPrint("00000.##", y);//00023
patternPrint("$###,###.##", y);//$23
patternPrint("0.###E0", y);//2.3E1
patternPrint("00.##%", y);//2300.12%

}

public static void patternPrint(String pattern, double x) {

DecimalFormat df = new DecimalFormat(pattern);
System.out.println("output for pattern " + pattern + " is "
+ df.format(x));

}

public static void defaultDateFormat() {

Date date = new Date();
System.out.println("simple date " + date.toLocaleString());//2007-8-31 14:40:24

DateFormat df = DateFormat.getDateTimeInstance();
System.out.println(df.format(date));//2007-8-31 14:40:24

DateFormat dfLong = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG);
System.out.println(dfLong.format(date));//2007年8月31日 下午02时40分24秒

DateFormat dfMedium = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.MEDIUM);
System.out.println(dfMedium.format(date));//2007-8-31 14:40:24
DateFormat dfShort = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.SHORT);
System.out.println(dfShort.format(date));//07-8-31 下午2:40

}

public static void customDateFormat() {

Date date = new Date();
patternPrint("yyyy.MM.dd HH:mm:ss z", date); // 两个MM, dd会导致补零//2007.08.31 14:40:24 CST
patternPrint("yy年M月d日 HH时mm分", date); // 两个yy就显示为两位年份//07年8月31日 14时40分
patternPrint("EEE, MMM d, ''yy", date);//星期五, 八月 31, '07
patternPrint("h:mm a", date);//2:40 下午
patternPrint("hh 'o''clock' a, zzzz", date);//02 o'clock 下午, 中国标准时间
patternPrint("yyyyy.MMMMM.dd GGG hh:mm aaa", date);//02007.八月.31 公元 02:40 下午
patternPrint("EEE, d MMM yyyy HH:mm:ss Z", date);//星期五, 31 八月 2007 14:40:24 +0800
patternPrint("yyMMddHHmmssZ", date);//070831144024+0800

}

public static void patternPrint(String pattern, Date date) {

SimpleDateFormat df = new SimpleDateFormat(pattern);
System.out.println(df.format(date));
}

}
输出:[quote]
NumberFormat.getInstance()
Integer 123456 is displayed as 123,456
Double 882323.23523 is displayed as 882,323.235
NumberFormat.getIntegerInstance()
Integer 123456 is displayed as 123,456
NumberFormat.getNumberInstance()
Double 882323.23523 is displayed as 882,323.235
NumberFormat.getPercentInstance()
Percent 0.528 is displayed as 53%
NumberFormat.getCurrencyInstance()
Currency 52.83 is displayed as ¥52.83

default output is 333.3333333333333
output for pattern ###,###.## is 333.33
output for pattern ####.## is 333.33
output for pattern ####.00 is 333.33
output for pattern ####.0# is 333.33
output for pattern 00000.## is 00333.33
output for pattern $###,###.## is $333.33
output for pattern 0.###E0 is 3.333E2
output for pattern 00.##% is 33333.33%
default output is 23.0012
output for pattern ###,###.## is 23
output for pattern ####.## is 23
output for pattern ####.00 is 23.00
output for pattern ####.0# is 23.0
output for pattern 00000.## is 00023
output for pattern $###,###.## is $23
output for pattern 0.###E0 is 2.3E1
output for pattern 00.##% is 2300.12%

simple date 2010-3-19 20:48:09
2010-3-19 20:48:09
2010年3月19日 下午08时48分09秒
2010-3-19 20:48:09
10-3-19 下午8:48

2010.03.19 20:48:09 CST
10年3月19日 20时48分
星期五, 三月 19, '10
8:48 下午
08 o'clock 下午, 中国标准时间
02010.三月.19 公元 08:48 下午
星期五, 19 三月 2010 20:48:09 +0800
100319204809+0800
[/quote]


格式化时间日期
[url]http://www.blogjava.net/youling/archive/2008/11/05/238759.html[/url][quote]
/**
* 格式化时间类
* DateFormat.FULL = 0
* DateFormat.DEFAULT = 2
* DateFormat.LONG = 1
* DateFormat.MEDIUM = 2
* DateFormat.SHORT = 3
* @author Michael
* @version 1.0, 2007/03/09
*/

public class Test{
public static void main(String []args){
Date d = new Date();
String s;

/** Date类的格式: Sat Apr 16 13:17:29 CST 2006 */
System.out.println(d);

System.out.println("******************************************");

/** getDateInstance() */
/** 输出格式: 2006-4-16 */
s = DateFormat.getDateInstance().format(d);
System.out.println(s);

/** 输出格式: 2006-4-16 */
s = DateFormat.getDateInstance(DateFormat.DEFAULT).format(d);
System.out.println(s);

/** 输出格式: 2006年4月16日 星期六 */
s = DateFormat.getDateInstance(DateFormat.FULL).format(d);
System.out.println(s);

/** 输出格式: 2006-4-16 */
s = DateFormat.getDateInstance(DateFormat.MEDIUM).format(d);
System.out.println(s);

/** 输出格式: 06-4-16 */
s = DateFormat.getDateInstance(DateFormat.SHORT).format(d);
System.out.println(s);

/** 输出格式: 2006-01-01 00:00:00 */
java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
s = format1.format(new Date());
System.out.println(s);

/** 输出格式: 2006-01-01 00:00:00 */
System.out.println((new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss")).format(new Date()));

/** 输出格式: 20060101000000***/
java.text.DateFormat format2 = new java.text.SimpleDateFormat("yyyyMMddhhmmss");
s = format2.format(new Date());
System.out.println(s);
}
}
[/quote]

[url]http://inter12.iteye.com/blog/585502[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值