Format類及其子類功能和用法詳解
? java.lang.Object
? java.text.Format
? All Implemented Interfaces:
Serializable, Cloneable
Direct Known Subclasses:
DateFormat, MessageFormat, NumberFormat
public abstract class Format
extends Object
implements Serializable, Cloneable
Format 是一個用于格式化語言環境敏感的信息(如日期、消息和數字)的抽象基類。 Format 定義了編程接口,用于將語言環境敏感的對象格式化為String(使用 format 方法)和將 String 重新解析為對象(使用 parseObject 方法)。
通常,一個 format 的 parseObject方法必須能解析任何由其 format 方法格式化的字符串。不過,也可能存在不能解析的異常情況。例如,format 方法可能創建中間無分隔符的兩個相鄰整數,在這種情況下,parseObject 無法判斷哪個數字屬于哪個數。
Java 平臺為格式化日期、消息和數字分別提供了三個特殊的Format 的子類:DateFormat、MessageFormat 和 NumberFormat。
具體的子類必須實現三個方法:
format(Object obj, StringBuffertoAppendTo, FieldPosition pos)
formatToCharacterIterator(Object obj)
parseObject(String source,ParsePosition pos)
這些常規方法允許對對象進行多態解析和格式化,還可以被使用(如被 MessageFormat 使用)。子類通常也為特定的輸入類型提供了另外的 format 方法,也為特定的結果類型提供了parse 方法。當在輸入文本的開始沒有任何所需格式的文本時,則任何不帶 ParsePosition 參數的 parse 方法都應該拋出 ParseException。
大多數子類還將實現以下工廠方法:
getInstance 獲取一個適合于當前語言環境的有用的格式對象
getInstance(Locale)獲取一個適合于指定語言環境的有用的格式對象。
此外,某些子類還可能為了更特殊的控制實現其它 getXxxxInstance 方法。例如,NumberFormat 類提供了 getPercentInstance 和 getCurrencyInstance 方法來獲取特殊的數字格式器。
Format 的子類如果允許程序員能為不同語言環境(比如用 getInstance(Locale) )創建對象,必須實現以下類方法:
public staticLocale[] getAvailableLocales()
最后子類定義一個常量集合來標識格式輸出中的不同字段。這些常量用于創建一個 FieldPosition 對象,該對象標識字段中所包含的信息及其在格式化結果中的位置。這些常量應當命名為item _FIELD,其中item 標識了該字段。有關這些常量的例子,請參閱 ERA_FIELD 及其在 DateFormat 中的同類。
因為Format是抽象類,所以我們無法通過Format 的構造方法(非公有的)來實例化Format類的對象。如下面的寫法是錯誤的:
Format format=new Format();
那么我們如何實例化Format類的實例呢?
我們可以利用Java面向對象語言的多態性來解決這個問題:
通過父類型的引用可以指向子類型的對象,說白了就是用子類去實例化父類的對象。如下面的做法:
Format format;
//通過子類直接實例化Format類的對象(適用于子類不是抽象類的情況)
format=new MessageFormat("hh");
//通過子類的getXxxxInstance()來實例化Format類的對象(適用于子類是抽象類的情況)
format=NumberFormat.getCurrencyInstance();
format=DateFormat.getDateInstance();
DateFormat 是Format類的抽象子類, 有一些static的getXxxxInstance()方法來獲得實例。通過設置結果的長度和地區,來獲得日期,時間等的格式。
DateFormat不太常用。一般會使用SimpleDateFormat子類,newSimpleDateFormat("yyyy-MM-dd")或newSimpleDateFormat("yyyy-MM-dd HH:mm:ss")等,來獲得常用的時間格式。
可以通過設置的getXxxxInstance()方法來實例化DateFormat類的對象。
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方法中使用。
Date d = new Date(); String s; /** Date類的格式: Sat Aug 30 13:05:56 CST 2014 */ System.out.println(d); System.out.println("******************************************");
/** 輸出格式: 2014-8-30 */ s = DateFormat.getDateInstance().format(d); System.out.println(s);
/** 輸出格式: 2014-8-30 */ s = DateFormat.getDateInstance(DateFormat.DEFAULT).format(d); System.out.println(s);
/** 輸出格式: 2014年8月30日 星期六 */ s = DateFormat.getDateInstance(DateFormat.FULL).format(d); System.out.println(s);
/** 輸出格式: 2014-8-30 */ s = DateFormat.getDateInstance(DateFormat.MEDIUM).format(d); System.out.println(s);
/** 輸出格式: 14-8-30 */ s = DateFormat.getDateInstance(DateFormat.SHORT).format(d); System.out.println(s);
/** 輸出格式: 2014-08-30 01:02:02 */ DateFormat format1 = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss"); s = format1.format(new Date()); System.out.println(s); |
NumberFormat 是所有數值格式的抽象基類。此類提供格式化和解析數值的接口。NumberFormat 還提供了一些方法來確定哪些語言環境具有數值格式,以及它們的名稱是什么。
NumberFormat 可用于格式化和解析任何語言環境的數值。使代碼能夠完全獨立于小數點、千位分隔符甚至所用特定小數位數的語言環境約定,并與數值格式是否為偶小數無關。
double num=868326.81472676; double test=3.1415926; //返回當前缺省語言環境的缺省數值格式。/*輸出結果:868,326.815*/ String myString = NumberFormat.getInstance().format(num); System.out.println(myString); //getCurrencyInstance()返回當前缺省語言環境的通用貨幣格式/*輸出結果:¥868,326.81*/ myString = NumberFormat.getCurrencyInstance().format(num); System.out.println(myString); //getNumberInstance()
生活不易,碼農辛苦 |