使用java.text包格式化数字和日期
在C中可以使用类似printf(“%d %8.2fn”, 1001, 52.335)的方法实现格式化输出,可是Java中的System.out.println()并没有对应的功能。要格式化输出,必须使用java.text包中的类来实现类似的操作(要不怎么体现面向对象的优越性呢,不过据说jdk1.5准备又补上)。当然了,java.text包的功能还是很强大的,奇怪的是很多书中都没有涉及,而一般谁又有工夫整天去看API?
注意:由于这里说得很简略,因此请参照下面的Demo程序。
格式化数字
在NumberFormat类中为我们提供了格式化4种数字的方法:整数、小数、货币和百分比,通过工厂方法getNumberInstance, getNumberIntance, getCurrencyInstance, getPercentInstance方法获得相应的实例对象就行。例如我们要以字符串表示人民币88888.88元,这样来写就行:
NumberFormat nf = NumberFormat.getCurrencyInstance();System.out.println(nf.format(88888.88));
String pattern = …DecimalFormat df = new DecimalFormat(pattern);
DecimalFormat df = new DecimalFormat();df. applyPattern(pattern);
System.out.println(new Date());
SimpleDateFormat df = new SimpleDateFormat();df. applyPattern(pattern);
TestFormat.java:import java.text.*;import java.util.*;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("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("Integer " + i + " is displayed as " + nfInt.format(i));NumberFormat nfNumber = NumberFormat.getNumberInstance();System.out.println("Double " + x + " is displayed as " + nfNumber.format(x));NumberFormat nfPercent = NumberFormat.getPercentInstance();System.out.println("Percent " + p + " is displayed as " + nfPercent.format(p));NumberFormat nfCurrency = NumberFormat.getCurrencyInstance();System.out.println("Currency " + p + " is displayed as " + nfCurrency.format(c)); //这里没有涉及相应的parse方法}public static void customNumberFormat() {double x = 1000.0 / 3;System.out.println("default output is " + x);patternPrint("###,###.##", x);patternPrint("####.##", x);patternPrint("####.00", x);patternPrint("####.0#", x);patternPrint("00000.##", x);patternPrint("$###,###.##", x);patternPrint("0.###E0", x);patternPrint("00.##%", x);double y = 23.0012;System.out.println("default output is " + y);patternPrint("###,###.##", y);patternPrint("####.##", y);patternPrint("####.00", y);patternPrint("####.0#", y);patternPrint("00000.##", y);patternPrint("$###,###.##", y);patternPrint("0.###E0", y);patternPrint("00.##%", y);}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());DateFormat df = DateFormat.getDateTimeInstance();System.out.println(df.format(date));DateFormat dfLong = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);System.out.println(dfLong.format(date));DateFormat dfMedium = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);System.out.println(dfMedium.format(date));DateFormat dfShort = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);System.out.println(dfShort.format(date));}public static void customDateFormat() {Date date = new Date();patternPrint("yyyy.MM.dd HH:mm:ss z", date); //两个MM, dd会导致补零patternPrint("yy年M月d日 HH时mm分", date); //两个yy就显示为两位年份patternPrint("EEE, MMM d, ''yy", date);patternPrint("h:mm a", date);patternPrint("hh 'o''clock' a, zzzz", date);patternPrint("yyyyy.MMMMM.dd GGG hh:mm aaa", date);patternPrint("EEE, d MMM yyyy HH:mm:ss Z", date);patternPrint("yyMMddHHmmssZ", date);}public static void patternPrint(String pattern, Date date){SimpleDateFormat df = new SimpleDateFormat(pattern);System.out.println(df.format(date));}}