Java字符串+日期+数字格式化输出.docx
《Java字符串+日期+数字格式化输出.docx》由会员分享,可在线阅读,更多相关《Java字符串+日期+数字格式化输出.docx(8页珍藏版)》请在冰豆网上搜索。
Java字符串+日期+数字格式化输出
Java字符串日期数字格式化输出
在C中可以使用类似printf(“%d%8.2f\\n”,1001,52.335的方法实现格式化输出,可是Java中的System.out.println(并没有对应的功能。
要格式化输出,必须使用java.text包中的类来实现类似的操作(要不怎么体现面向对象的优越性呢,不过据说jdk1.5准备又补上。
当然了,java.text包的功能还是很强大的,奇怪的是很多书中都没有涉及,而一般谁又有工夫整天去看API?
注意:
由于这里说得很简略,因此请参照下面的Demo程序。
格式化数字
在NumberFormat类中为我们提供了格式化4种数字的方法:
整数、小数、货币和百分比,通过工厂方法getNumberInstance,getNumberIntance,getCurrencyInstance,getPercentInstance方法获得相应的实例对象就行。
例如我们要以字符串表示人民币88888.88元,这样来写就行:
NumberFormatnf=NumberFormat.getCurrencyInstance(;
System.out.println(nf.format(88888.88;
定制格式化数字
可是对于稍微复杂一点的需求,NumberFormat就满足不了了,幸好java还提供了DecimalFormat实现定制的格式化。
要使用DecimalFormat对象,必须提供给它提供一个格式化的模式(pattern:
Stringpattern=…
DecimalFormatdf=newDecimalFormat(pattern;
或者:
DecimalFormatdf=newDecimalFormat(;
df.applyPattern(pattern;
然后就调用它的format方法就行了。
所以关键就是这个模式怎么定义。
在DecimalFormat类的JavaDoc中有模式的语法表示,不过很难说清楚(是我说不清楚,呵呵,请看看Demo自己多试试吧。
下面是模式中某些字符的含义表:
字符
含义
一位数字,这一位缺失显示为0。
用来补零
#
一位数字,这一位缺失就不显示
.
小数点,不用多说了吧
千位分隔符
E
科学计数法
%
百分比
格式化日期
把日期转化为字符串最简单的方法就是调用Date类的toString或者toLocaleString方法:
System.out.println(newDate(;
输出:
2004-8-78:
16:
14。
可是如果我们想把月和日补成2位不要时分秒2004-08-07,这就不灵了。
java.text.DateFormat提供了大量的工厂方法:
getDateInstance(intstyle,getTimeInstance(intstyle,getDateTimeInstance(intdateStyle,inttimeStyle等等。
其中style必须是DateFormat.LONG,DateFormat.MEDIUM,DateFormat.SHORT之一。
Demo中的defaultDateFormat方法作了一个简单的实验。
定制格式化日期:
同样,java.text.SimpleDateFormat可以通过模式(pattern实现定制格式化:
Stringpattern=…
SimpleDateFormatdf=newSimpleDateFormat(pattern;
或者:
SimpleDateFormatdf=newSimpleDateFormat(;
df.applyPattern(pattern;
下面是SimpleDateFormat的javadoc中的一个模式符号简表:
符号
意义
合法数值
示例
y
Year
Year
1996;96
M
Monthinyear
Month
July;Jul;07
d[Page]
Dayinmonth
Number
10
a
Am/pmmarker
Text
PM
H
Hourinday(0-23
Number
h
Hourinam/pm(1-12
Number
12
m
Minuteinhour
Number
30
s
Secondinminute
Number
55
S
Millisecond
Number
978
z
Timezone
Generaltimezone
PacificStandardTime;PST;GMT-08:
00
Z
Timezone
RFC822timezone
-0800
注意的是,符号的大小写意义是不同的,符号的个数也会导致输出不一样。
例如用MM就会把1月份显示成01,而用M则不会补零。
对于年份,两个yy会只输出两位年份,yyyy则会输出4位年份。
实际上,上面的类还提供了很多其他方法,特别是用于本地化(Locale定制格式化的方法,以及从字符串表示转化为相应对象的parse方法,还有把格式化结果附加到一个StringBuffer的方法(应该是用来提高性能。
最后是一个小Demo和输出结果:
TestFormat.java:
importjava.text.*;
importjava.util.*;
publicclassTestFormat{
publicstaticvoidmain(String[]args{
defaultNumberFormat(;
System.out.println(;
customNumberFormat(;
System.out.println(;
defaultDateFormat(;
System.out.println(;
customDateFormat(;
System.out.println(;
}
publicstaticvoiddefaultNumberFormat({
inti=123456;
doublex=882323.23523;
doublep=0.528;
doublec=52.83;[Page]
NumberFormatnf=NumberFormat.getInstance(;
System.out.println(\"Integer\"+i+\"isdisplayedas\"+nf.format(i;
System.out.println(\"Double\"+x+\"isdisplayedas\"+nf.format(x;
NumberFormatnfInt=NumberFormat.getIntegerInstance(;
System.out.println(\"Integer\"+i+\"isdisplayedas\"+nfInt.format(i;
NumberFormatnfNumber=NumberFormat.getNumberInstance(;
System.out.println(\"Double\"+x+\"isdisplayedas\"+nfNumber.format(x;
NumberFormatnfPercent=NumberFormat.getPercentInstance(;
System.out.println(\"Percent\"+p+\"isdisplayedas\"+nfPercent.format(p;
NumberFormatnfCurrency=NumberFormat.getCurrencyInstance(;
System.out.println(\"Currency\"+p+\"isdisplayedas\"+nfCurrency.format(c;
//这里没有涉及相应的parse方法
}
publicstaticvoidcustomNumberFormat({
doublex=1000.0/3;
System.out.println(\"defaultoutputis\"+x;
patternPrint(\"###,###.##\",x;
patternPrint(\"####.##\",x;
patternPrint(\"####.00\",x;
patternPrint(\"####.0#\",x;[Page]
patternPrint(\"00000.##\",x;
patternPrint(\"$###,###.##\",x;
patternPrint(\"0.###E0\",x;
patternPrint(\"00.##%\",x;
doubley=23.0012;
System.out.println(\"defaultoutputis\"+y;
patternPrint(\"###,###.##\",y;
patternPrint(\"####.##\",y;
patternPrint(\"####.00\",y;
patternPrint(\"####.0#\",y;
patternPrint(\"00000.##\",y;
patternPrint(\"$###,###.##\",y;
patternPrint(\"0.###E0\",y;
patternPrint(\"00.##%\",y;
}
publicstaticvoidpatternPrint(Stringpattern,doublex{
DecimalFormatdf=newDecimalFormat(pattern;
System.out.println(\"outputforpattern\"+pattern+\"is\"+df.format(x;
}
publicstaticvoiddefaultDateFormat({
Datedate=newDate(;
System.out.println(\"simpledate\"+
date.toLocaleString(;
DateFormatdf=DateFormat.getDateTimeInstance(;
System.out.println(df.format(date;
DateFormatdfLong=
DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG;System.out.println(dfLong.format(date;
DateFormatdfMedium=
DateFormat.getDateTimeInstance(DateFormat.MEDIUM,[Page]
DateFormat.MEDIUM;
System.out.println(dfMedium.format(date;
DateFormatdfShort=
DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT;System.out.println(dfShort.format(date;
}
publicstaticvoidcustomDateFormat({
Datedate=newDate(;
patternPrint(\"yyyy.MM.ddHH:
mm:
ssz\",date;//两个MM,dd会导致补零
patternPrint(\"yy年M月d日HH时mm分\",date;//两个yy就显示为两位年份
patternPrint(\"EEE,MMMd,’’yy\",date;
patternPrint(\"h:
mma\",date;
patternPrint(\"hh’o’’clock’a,zzzz\",date;
patternPrint(\"yyyyy.MMMMM.ddGGGhh:
mmaaa\",date;
patternPrint(\"EEE,dMMMyyyyHH:
mm:
ssZ\",date;
patternPrint(\"yyMMddHHmmssZ\",date;
}
publicstaticvoidpatternPrint(Stringpattern,Datedate{
SimpleDateFormatdf=newSimpleDateFormat(pattern;
System.out.println(df.format(date;
}
}
输出:
Integer123456isdisplayedas123,456
Double882323.23523isdisplayedas882,323.235
Integer123456isdisplayedas123,456
Double882323.23523isdisplayedas882,323.235
Percent0.528isdisplayedas53%
Currency0.528isdisplayedas¥52.83
defaultoutputis333.3333333333333
outputforpattern###,###.##is333.33
outputforpattern####.##is333.33[Page]outputforpattern####.00is333.33
outputforpattern####.0#is333.33
outputforpattern00000.##is00333.33
outputforpattern$###,###.##is$333.33outputforpattern0.###E0is3.333E2
outputforpattern00.##%is33333.33%
defaultoutputis23.0012
outputforpattern###,###.##is23
outputforpattern####.##is23
outputforpattern####.00is23.00
outputforpattern####.0#is23.0
outputforpattern00000.##is00023
outputforpattern$###,###.##is$23
outputforpattern0.###E0is2.3E1
outputforpattern00.##%is2300.12%
simpledate2004-8-78:
16:
14
2004-8-78:
16:
14
2004年8月7日上午08时16分14秒
2004-8-78:
16:
1404-8-7上午8:
162004.08.0708:
16:
14GMT+08:
0004年8月7日08时16分星期六,八月7,’048:
16上午08o’clock上午,GMT+08:
0002004.八月.07公元08:
16上午星期六,7八月200408:
16:
14+0800040807081614+0800