java.util.Formatter 詳解
1、java.util.Formatter
java.util.Formatter 是JDK1.5新增的類庫,功能很強大,可是很差掌握,就像下棋同樣,知道如何走棋子,和熟練應用徹底是兩碼事。
格式化主要用在文本輸出方面,好比,數字、日期、金額等,還有相似超市的購物單小票等等,都會用到格式化輸出的工具。在此類沒出現以前,只能經過空格縮進或這個製表符來對單據等格式作一些控制,如今只要掌握java.util.Formatter,一切問題就解決了。
shut!有關這個類javadoc文檔太難看懂了,經過猜想、嘗試、查看源碼、對文檔斷章取義基本搞明白了,寫了下面的例子:
import java.util.Calendar;
import java.util.Formatter;
import java.util.GregorianCalendar;
/**
* Formatter測試
*
* @author leizhimin 2009-7-16 16:31:02
*/
public
class TestFormatter {
public
static
void main(String[] args) {
//%[argument_index$][flags][width][.precision]conversion
Formatter f1 =
new Formatter(System.out);
//格式化輸出字符串和數字
f1.format(
"格式化輸出:%s %d",
"a", 1235);
System.out.println(
"\n--------");
//日期的格式化
Calendar c =
new GregorianCalendar();
f1.format(
"當前日期:%1$tY-%1$tm-%1$te", c);
System.out.println(
"\n--------");
//日期的格式化,並將格式化結果存儲到一個字符串變量中
String s = String.format(
"當前日期:%1$tY-%1$tm-%1$te", c);
System.out.println(s);
//2$:取第二個參數
//-: 指定爲左對齊,默認右對齊
//5:最大輸出寬度爲20,不夠會補空格,實際若超過則所有輸出
//.2:在此表示輸出參數2的最大字符數量,若是是浮點數字,則表示小數部分顯示的位數
//s :表示輸入參數是字符串
f1.format(
"%2$-5.2s %1$2s",
"123",
"456");
//將格式化的結果存儲到字符串
System.out.println(
"\n--------");
String fs = String.format(
"身高體重(%.2f , %d)", 173.2, 65);
System.out.println(fs);
//printf()本質上也是用System.out做爲輸出目標構造Formatter對象
//調用format方法,並將printf的參數傳給format方法而得。
System.out.println(
"\n--------");
System.out.printf(
"身高體重(%.2f , %d)", 180.2, 65);
}
}
運行結果:
格式化輸出:a 1235
--------
當前日期:2009-07-16
--------
當前日期:2009-07-16
45 123
--------
身高體重(173.20 , 65)
--------
身高體重(180.20 , 65)
Process finished with exit code 0
總結:
一、java.util.Formatter功能強大,主要用於自由格式的制定,也能夠指定金額、日期等格式。但以使用方便爲原則。
二、其餘格式化類:
java.text.DateFormatSymbols
java.text.DecimalFormatSymbols
java.text.FieldPosition
java.text.Format
java.text.DateFormat
java.text.SimpleDateFormat
java.text.MessageFormat
java.text.NumberFormat
java.text.ChoiceFormat
java.text.DecimalFormat
三、String.format()、System.out.printf()方法底層也是經過此類方法調用實現的。
四、Calendar類用來表示系統抽象時間,是日期格式化等操做中最重要的一個類,這個類的實例化方式是:
Calendar rightNow = Calendar.getInstance();
而且能夠經過下面的方法改變實例所表示的抽象時間:
void setTime(Date date)
使用給定的 Date 設置此 Calendar 的時間。
void setTimeInMillis(long millis)
用給定的 long 值設置此 Calendar 的當前時間值。
有關日期的格式化還比較複雜,不光與現實方式有關,其實還與時區、國家習慣等等有關,所以在處理日期格式化問題上必定要慎重對待,沒有理由不用專門的類作處理。
2、java.text.Format
Format 是一個用於格式化語言環境敏感的信息(如日期、消息和數字)的抽象基類。
光從類的層次結構上看,Java對格式的處理也算費了大勁了,但仍是不怎麼好用。
消息格式化類比較讓人鬱悶,SUN的API文檔看起來好像翻譯的有毛病。
import java.text.MessageFormat;
import java.util.Date;
/**
* 消息格式化類的使用
*
* @author leizhimin 2009-7-29 23:09:41
*/
public
class TestMsgFormat {
public
static
void main(String[] args) {
String msg =
"歡迎光臨,當前({0})等待的業務受理的顧客有{1}位,請排號辦理業務!";
MessageFormat mf =
new MessageFormat(msg);
String fmsg = mf.format(
new Object[]{
new Date(), 35});
System.out.println(fmsg);
}
}
歡迎光臨,當前(09-7-29 下午11:17)等待的業務受理的顧客有35位,請排號辦理業務!
Process finished with exit code 0
注意,這個參數索引時{0}到{9}的非負整數,多了不認!