JDK在java.text包中,提供了對顯示對象格式化的接口、類及異常處理,這里我們只來談一談text包中的format類及其子類。其中,最重要的是兩個差不多互為“逆運算”的方法format(將某對象按設定格式化為字符串)與parse(將字符串反格式化為對象)。
java.text.Format是一個抽象類,下面有三個子類:NumberFormat, DateFormat及MessageFormat,NumberFormat與DateFormat又是兩個抽象類。
在使用下列代碼的時候,記得要引入java的text和util包
1.首先,我們來談談NumberFormat的第一個子類DecimalFormat:
DecimalFormat類的作用是將數值型數據格式化成我們需要的格式的字符串或將字符串數據反格式化為一個Number型對象。例如:
1 String decimalPattern = "\u00A4#,##0.00"; //\u00A4表示貨幣字符;#表示數字,0時不顯示;0表示數字,0時顯示 2 DecimalFormat df = new DecimalFormat(decimalPattern); //構造DecimalFormat對象 3 //TO DO... 4 System.out.println(df.format(4350.3D)); //輸出¥4,350.30 5 System.out.println(df.format(2345)); //輸出¥2,345.00 6 System.out.println(df.parse(df.format(4350.3D))); //輸出4350.3 7 8 //System.out.println(df.parse("1234")); //This will throw a ParseException
上面顯示的貨幣字符在本例中依賴於系統的區域設置,如果我們在中文區域上,要顯示美元的貨幣形式,則需要在上面
//TO DO...位置加上下面語句
1 DecimalFormatSymbols dfs = df.getDecimalFormatSymbols(); 2 3 dfs.setCurrencySymbol("$"); 4 5 df.setDecimalFormatSymbols(dfs); //此時,輸出變為$4,350.30與$2,345.00
接下來,我們來看看NumberFormat的另一個子類ChoiceFormat:
ChoiceFormat類可以將數值型數據轉化為我們需要顯示的字符串,或將一個字符串轉換為一個Number型對象,
需要注意的是,該類對數據的轉換並不是精確匹配。
該類有兩個構造函數 public ChoiceFormat(double[] limits, String[] formats); public ChoiceFormat(String newPattern); 兩者實現方式稍有不同,例如: double[] limits = {ChoiceFormat.nextDouble(0D, false), 0D, ChoiceFormat.nextDouble(0D, true)};
/* ChoiceFormat.nextDouble(0D, false)與ChoiceFormat.previousDouble(0D)意義一樣,
表示比0小的最大Double值,同樣ChoiceFormat.nextDouble(0D, true)與ChoiceFormat.nextDouble(0D)意義相同,
表示比0大的最小Double值 */
1 double[] limits = {ChoiceFormat.nextDouble(0D, false), 0D, ChoiceFormat.nextDouble(0D, true)}; 2 String[] monthNames = {"負數", "零", "正數"}; 3 4 ChoiceFormat cf = new ChoiceFormat(limits, monthNames); 5 6 for (double i = 0.0; i <= 4.0; i++) { 7 8 System.out.print("*" + i + "是一個" + cf.format(i)); 9 } 10 11 /* 輸出: 12 13 *-4.0是一個負數*-3.0是一個負數*-2.0是一個負數*-1.0是一個負數*0.0是一個零*1.0是一個正數*2.0是一個正數*3.0是一個正數*4.0是一個正數 */ 14 15 16 17 System.out.println(cf.parse("零")); //輸出:0.0 18 19 //System.out.println(cf.parse("other")); //This will throw a ParseException
另一構造函數: String pattern = "-1#負數|0#零|0<正數";
//這個位置不能寫反,數值大小一定要從小到大,改變參數位置會運行時會拋異常
1 ChoiceFormat cf2 = new ChoiceFormat(pattern); 2 3 for (double i = -4.0; i <= 4.0; i++) { 4 5 System.out.println(i + "是一個" + cf2.format(i)); 6 7 }
//得到與上面例子同樣的輸出
下面,我們再來看看DateFormat的唯一子類SimpleDateFormat,
這個類可能是我們使用比較多的類,這里只舉一個簡單的例子:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s = sdf.format(Calendar.getInstance().getTime()); Date d = sdf.parse(s); System.out.println("當前時間是 :" + s); //輸出:當前時間是 :當前時間是 :2013-11-07 09:09:48
System.out.println("當前時間的日期對象是 : " + d); //輸出:當前時間的日期對象是 : 當前時間的日期對象是 : Thu Nov 07 09:09:48 CST 2013
sdf.setLenient(true); //這句是我在原文的基礎上加的。因為我自己運行的時候沒有這句就是會報錯。 //setLenient用於設置Calendar是否寬松解析字符串,如果為false,則嚴格解析;默認為true,寬松解析。
最后,我們來看一下Format類中的最后一個非抽象子類MessageFormat,
這個類可以讓我們利用匹配規則,非常方便的顯示一些字符串,
再不用自己去組合字串了。
該類提供了一個靜態的format方法(public static String format(String pattern, Object[] arguments)),
可以讓我們比較方便的使用,例如:
1 String pattern = "特大喜訊:公司上半年營業額為{0, number,#,##0.00}萬元," + "比去年同期增長{1, number, percent},公司董事會決定發放獎金每人" + "{2, number, currency}元現金" + "({3, date,yyyy-MM-dd} {4, time,HH:mm:ss} 發布者:{5, choice,0#系統信息|1#公司董事會})"; 2 3 Date d = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2005-10-12 18:10:20"); 4 5 Object[] arguments = {new Double(7825.36), new Double(0.65), new Double(1000),d,d,new Double(1) }; 6 7 System.out.println(MessageFormat.format(pattern, arguments));
/*特大喜訊:公司上半年營業額為7,825.36萬元,比去年同期增長65%,公司董事會決定發放獎金每人¥1,000.00元現金(2013-11-07 09:09:48 發布者:公司董事會)*/
需要提一下的是,對於匹配字符串{id, type,pattern} ,在使用自定義的pattern時,實際進行匹配的匹配符是從type后面的逗號后開始,一直到最后的大括號前面結束,所以最好在逗號與pattern之間不要有空格存在,否則轉換出的字符串中,前面將會出現相應數量的空格;另外一定要注意,pattern位置的字串不需要引號(加上引號后匹配結果外面將會出現一對引號)
該類的匹配規則稍微復雜些,具體內容參考下JDK文檔就OK了。
上面內容只是java.text包中有關Format的部分功能,與CharacterIterator接口有關的部分。
本文轉自http://blog.sina.com.cn/s/blog_49d2f09d01000bab.html,
但是也是在原文的基礎上修改了一些東西。
我是java新手。在這個方面需要大家的多多指導才是啊!
