JAVA中数字、日期、字符串的格式化输出

JAVA中数字、日期、字符串的格式化输出

在C中可以使用类似printf(“%d %8.2fn”, 1001, 52.335)的方法实现格式化输出,可是Java中的System.out.println()并没有对应的功能。要格式化输出,必须使用java.text包中的类来实现类似的操作(要不怎么体现面向对象的优越性呢,不过据说jdk1.5准备又补上)。当然了,java.text包的功能还是很强大的,奇怪的是很多书中都没有涉及,而一般谁又有工夫整天去看API。

JDK在java.text包中,提供了对显示对象格式化的接口、类及异常处理,这里我们只来谈一谈text包中 的format类及其子类。其中,最重要的是两个差不多互为“逆运算”的方法format(将某对象按设定格式化为字符串)与parse(将字符串反格式 化为对象)。

java.text.Format是一个抽象类,下面有三个子类:NumberFormat, DateFormat及MessageFormat,NumberFormat与DateFormat又是两个抽象类

注意:由于这里说得很简略,因此请参照下面的Demo程序。
1、格式化数字
(1)NumberFormat类
    在NumberFormat类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,通过工厂方法getIntegerInstance, getNumberIntance, getCurrencyInstance, getPercentInstance方法获得相应的实例对象就行。例如我们要以字符串表示人民币88888.88元,这样来写就行:
    NumberFormat nf = NumberFormat.getCurrencyInstance();
    System.out.println(nf.format(88888.88));
(2)DecimalFormat类,定制格式化数字
    可是对于稍微复杂一点的需求,NumberFormat就满足不了了,幸好java还提供了DecimalFormat实现定制的格式化。要使用DecimalFormat对象,必须提供给它提供一个格式化的模式(pattern):
String pattern = “0.##”;
    DecimalFormat df = new DecimalFormat(pattern);
    或者:
    DecimalFormat df = new DecimalFormat();
    df. applyPattern(pattern);
    然后就调用它的format方法就行了,比如df.format(double d);
    所以关键就是这个模式怎么定义。在DecimalFormat类的JavaDoc中有模式的语法表示,不过很难说清楚(是我说不清楚,呵呵),请看看Demo自己多试试吧。下面是模式字符串中字符含义表:
字符
含义
0
一位数字,这一位缺失显示为0。用来补零
#
一位数字, 这一位缺失就不显示
.
小数点,不用多说了吧
,
千位分隔符
E
科学计数法
%
百分比
2、格式化日期
(1)DateFormate类
    把日期转化为字符串最简单的方法就是调用Date类的toString或者toLocaleString方法:
    System.out.println(new Date());
    输出:2004-8-7 8:16:14。可是如果我们想把月和日补成2位不要时分秒2004-08-07,这就不灵了。java.text.DateFormat提供了大量的工厂方法:getDateInstance(int style), getTimeInstance(int style), getDateTimeInstance(int dateStyle, int timeStyle)等等。其中style必须是DateFormat.LONG, DateFormat.MEDIUM, DateFormat.SHORT之一。Demo中的defaultDateFormat方法作了一个简单的实验。
(2)SimpleDataFormat类,定制格式化日期
    同样,java.text.SimpleDateFormat可以通过模式(pattern)实现定制格式化:
    String pattern = “yyyy年mm月dd日,hh:mm:ss”;
    SimpleDateFormat df = new SimpleDateFormat(pattern);
    或者:
    SimpleDateFormat df = new SimpleDateFormat();
    df. applyPattern(pattern);
    下面是SimpleDateFormat的javadoc中的一个模式字符串符号简表:
符号
意义
合法数值
示例
y
Year
Year
1996; 96
M
Month in year
Month
July; Jul; 07
d
Day in month
Number
10
a
Am/pm marker
Text
PM;AM
H
Hour in day (0-23)
Number
0
h
Hour in am/pm (1-12)
Number
12
m
Minute in hour
Number
30
s
Second in minute
Number
55
S
Millisecond
Number
978
z
Time zone
General time zone
Pacific Standard Time; PST; GMT-08:00
Z
Time zone
RFC 822 time zone
-0800
    注意的是,符号的大小写意义是不同的,符号的个数也会导致输出不一样。例如用MM就会把1月份显示成01,而用M则不会补零。对于年份,两个yy会只输出两位年份,yyyy则会输出4位年份。
实际上,上面的类还提供了很多其他方法,特别是
1用于本地化(Locale)定制格式化的方法;
2从字符串表示转化为相应对象的parse方法;
3把格式化结果附加到一个StringBuffer的方法(应该是用来提高性能)。
最后是一个小Demo和输出结果:
[java]  view plain copy print ?
  1. TestFormat.java:  
  2.    
  3. import java.text.*;  
  4. import java.util.*;  
  5. public class TestFormat {  
  6. public static void main(String[] args) {  
  7.    
  8. defaultNumberFormat();  
  9. System.out.println();  
  10.    
  11. customNumberFormat();  
  12. System.out.println();  
  13.    
  14. defaultDateFormat();  
  15. System.out.println();  
  16.    
  17. customDateFormat();  
  18. System.out.println();  
  19. }  
  20.    
  21. public static void defaultNumberFormat() {  
  22. int i = 123456;  
  23. double x = 882323.23523;  
  24. double p = 0.528;  
  25. double c = 52.83;  
  26.    
  27. NumberFormat nf = NumberFormat.getInstance();  
  28. System.out.println("Integer " + i + " is displayed as " + nf.format(i));  
  29.        System.out.println("Double " + x + " is displayed as " + nf.format(x));  
  30.    
  31.        NumberFormat nfInt = NumberFormat.getIntegerInstance();  
  32.        System.out.println("Integer " + i + " is displayed as " + nfInt.format(i));  
  33.    
  34.        NumberFormat nfNumber = NumberFormat.getNumberInstance();  
  35.        System.out.println("Double " + x + " is displayed as " + nfNumber.format(x));  
  36.    
  37.        NumberFormat nfPercent = NumberFormat.getPercentInstance();  
  38.        System.out.println("Percent " + p + " is displayed as " + nfPercent.format(p));  
  39.    
  40.        NumberFormat nfCurrency = NumberFormat.getCurrencyInstance();  
  41.        System.out.println("Currency " + p + " is displayed as " + nfCurrency.format(c));  
  42.    
  43.        //这里没有涉及相应的parse方法  
  44.    }  
  45.    
  46.    public static void customNumberFormat() {  
  47.    
  48.        double x = 1000.0 / 3;  
  49.        System.out.println("default output is " + x);  
  50.    
  51.        patternPrint("###,###.##", x);  
  52.        patternPrint("####.##", x);  
  53.        patternPrint("####.00", x);  
  54.        patternPrint("####.0#", x);  
  55.        patternPrint("00000.##", x);  
  56.        patternPrint("$###,###.##", x);  
  57.        patternPrint("0.###E0", x);  
  58.        patternPrint("00.##%", x);  
  59.    
  60.        double y = 23.0012;  
  61.        System.out.println("default output is " + y);  
  62.    
  63.        patternPrint("###,###.##", y);  
  64.        patternPrint("####.##", y);  
  65.        patternPrint("####.00", y);  
  66.        patternPrint("####.0#", y);  
  67.        patternPrint("00000.##", y);  
  68.        patternPrint("$###,###.##", y);  
  69.        patternPrint("0.###E0", y);  
  70.        patternPrint("00.##%", y);  
  71. }  
  72.    
  73.     public static void patternPrint(String pattern, double x) {  
  74.            DecimalFormat df = new DecimalFormat(pattern);  
  75.            System.out.println("output for pattern " + pattern + " is " + df.format(x));  
  76.    
  77.     }  
  78.    
  79. public static void defaultDateFormat(){  
  80. Date date = new Date();  
  81. System.out.println("simple date " + date.toLocaleString());  
  82.    
  83. DateFormat df = DateFormat.getDateTimeInstance();  
  84. System.out.println(df.format(date));  
  85.    
  86. DateFormat dfLong = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);  
  87. System.out.println(dfLong.format(date));  
  88.    
  89. DateFormat dfMedium = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);  
  90. System.out.println(dfMedium.format(date));  
  91.    
  92. DateFormat dfShort = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);  
  93. System.out.println(dfShort.format(date));  
  94.    
  95. }  
  96.    
  97.  public static void customDateFormat() {  
  98.    
  99.            Date date = new Date();  
  100.    
  101.            patternPrint("yyyy.MM.dd HH:mm:ss z", date);  //两个MM, dd会导致补零  
  102.            patternPrint("yy年M月d日 HH时mm分", date);  //两个yy就显示为两位年份  
  103.            patternPrint("EEE, MMM d, ’’yy", date);  
  104.            patternPrint("h:mm a", date);  
  105.            patternPrint("hh ’o’’clock’ a, zzzz", date);  
  106.            patternPrint("yyyyy.MMMMM.dd GGG hh:mm aaa", date);  
  107.            patternPrint("EEE, d MMM yyyy HH:mm:ss Z", date);  
  108.            patternPrint("yyMMddHHmmssZ", date);  
  109.  }  
  110.  public static void patternPrint(String pattern, Date date){  
  111.            SimpleDateFormat df = new SimpleDateFormat(pattern);  
  112.            System.out.println(df.format(date));  
  113. }  
  114. }  
  115. 输出:  
  116.     Integer 123456 is displayed as 123,456  
  117.     Double 882323.23523 is displayed as 882,323.235  
  118.     Integer 123456 is displayed as 123,456  
  119.     Double 882323.23523 is displayed as 882,323.235  
  120.     Percent 0.528 is displayed as 53%  
  121.     Currency 0.528 is displayed as ¥52.83  
  122.    
  123.     default output is 333.3333333333333  
  124.     output for pattern ###,###.## is 333.33  
  125.     output for pattern ####.## is 333.33  
  126.     output for pattern ####.00 is 333.33  
  127.     output for pattern ####.0# is 333.33  
  128.     output for pattern 00000.## is 00333.33  
  129.     output for pattern $###,###.## is $333.33  
  130.     output for pattern 0.###E0 is 3.333E2  
  131.     output for pattern 00.##% is 33333.33%  
  132.     default output is 23.0012  
  133.     output for pattern ###,###.## is 23  
  134.     output for pattern ####.## is 23  
  135.     output for pattern ####.00 is 23.00  
  136.     output for pattern ####.0# is 23.0  
  137.     output for pattern 00000.## is 00023  
  138.     output for pattern $###,###.## is $23  
  139.     output for pattern 0.###E0 is 2.3E1  
  140.     output for pattern 00.##% is 2300.12%  
  141.    
  142.     simple date 2004-8-7 8:16:14  
  143.     2004-8-7 8:16:14  
  144.     200487日上午081614秒  
  145.     2004-8-7 8:16:14  
  146.     04-8-7 上午8:16  
  147.    
  148.     2004.08.07 08:16:14 GMT+08:00  
  149.     0487日 0816分  
  150.     星期六, 八月 7, ’’04  
  151.     8:16 上午  
  152.     08 o’clock 上午, GMT+08:00  
  153.     02004.八月.07 公元 08:16 上午  
  154.     星期六, 7 八月 2004 08:16:14 +0800  
  155.     040807081614+0800  

你可能感兴趣的:(JAVA中数字、日期、字符串的格式化输出)