JDK在java.text包中,提供了對顯示對象格式化的接口、類及異常處理,這裏咱們只來談一談text包中的format類及其子類。其中,最重要的是兩個差很少互爲「逆運算」的方法format(將某對象按設定格式化爲字符串)與parse(將字符串反格式化爲對象)。html
java.text.Format是一個抽象類,下面有三個子類:NumberFormat, DateFormat及MessageFormat,NumberFormat與DateFormat又是兩個抽象類。java
在使用下列代碼的時候,記得要引入java的text和util包函數
1.首先,咱們來談談NumberFormat的第一個子類DecimalFormat:spa
DecimalFormat類的做用是將數值型數據格式化成咱們須要的格式的字符串或將字符串數據反格式化爲一個Number型對象。例如:code
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
上面顯示的貨幣字符在本例中依賴於系統的區域設置,若是咱們在中文區域上,要顯示美圓的貨幣形式,則須要在上面orm
//TO DO...位置加上下面語句htm
1 DecimalFormatSymbols dfs = df.getDecimalFormatSymbols(); 2 3 dfs.setCurrencySymbol("$"); 4 5 df.setDecimalFormatSymbols(dfs); //此時,輸出變爲$4,350.30與$2,345.00
接下來,咱們來看看NumberFormat的另外一個子類ChoiceFormat:對象
ChoiceFormat類能夠將數值型數據轉化爲咱們須要顯示的字符串,或將一個字符串轉換爲一個Number型對象,blog
須要注意的是,該類對數據的轉換並非精確匹配。接口
該類有兩個構造函數 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新手。在這個方面須要你們的多多指導纔是啊!