Java魔法堂:初探MessageFormat.format和ChoiceFormat
一、前言
? 剛開始從.net的轉(zhuǎn)向java的時候總覺得?String.format?用得不習慣,希望格式模版會這樣?{0}, this is {1}'s cat.{1},this is {0}'s?dog.?而不是?%1$s,this is %2$s's cat.%2$s,this is %1$s's dog.?。后來發(fā)現(xiàn)?java.text.MessageFormat.format?可以滿足我這個小小的愿望。
?
二、靜態(tài)方法?java.text.MessageFormat.format? ?
? 方法定義:
String MessageFormat.format(String fmt, Object...args)? 入?yún)mt為MessageFormat模式參數(shù)。
?
三、MessageFormat模式 ?
? 格式:??ArgumentIndex[,FormatType[,FormatStyle]]?
??ArgumentIndex?,是從0開始的入?yún)⑽恢盟饕?/p>
??FormatType?,指定使用不同的Format子類對入?yún)⑦M行格式化處理。值范圍如下:
? ? ?number:調(diào)用NumberFormat進行格式化
? ? ?date:調(diào)用DateFormat進行格式化
? ? ?time:調(diào)用DateFormat進行格式化
? ? ?choice:調(diào)用ChoiceFormat進行格式化
??FormatType?,設置FormatType中使用的格式化樣式。值范圍如下:
? ? short,medium,long,full,integer,currency,percent,SubformPattern(子格式模式,形如#.##)
? 注意:?FormatType?和?FormatStyle?主要用于對日期時間、數(shù)字、百分比等進行格式化。
? 示例——將數(shù)字1.23格式為1.2:
double num = 1.23; String str = MessageFormat.format("{0,number,#.#}", num);?
四、MessageFormat注意點
? 1. 兩個單引號才表示一個單引號,僅寫一個單引號將被忽略。
? 2.?單引號會使其后面的占位符均失效,導致直接輸出占位符。
MessageFormat.format("{0}{1}", 1, 2); // 結(jié)果12 MessageFormat.format("'{0}{1}", 1, 2); // 結(jié)果{0}{1} MessageFormat.format("'{0}'{1}", 1, 2); // 結(jié)果{0}因此可以用于輸出左花括號(單寫左花括號會報錯,而單寫右花括號將正常輸出)
MessageFormat.format("'{'{0}}", 2); // 結(jié)果{2因此前言中的示例應該寫為
{0}, this is {1}''s cat.{1},this is {0}''s dog.?
五、類層級關(guān)系
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|-- java.text.MessageFormat
頂層抽象類java.text.Format—| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |--java.text.ChoiceFormat
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|--java.text.NumberFormat—|
| ?|--java.text.DecimalFormat
|
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|--java.text.DateFormat—java.text.SimpleDateFormat
? ?1. DecimalFormat
? ? ? ?用于格式化十進制實數(shù)。通過格式字符串來自定義格式化類型,舍入方式為half-even(四舍五入)。
? ? ? ?格式化模式:?正數(shù)子模式;負數(shù)子模式?,如?0.00;-0.00?,簡寫為?0.00?。
? ? ? ?模式中的占位符:
?0?,代表該為位為數(shù)字,若不存在則用0填充
? ? ???#?,代表該為位為數(shù)字
?,?,代表分隔符, 如模式為?#,#?,那么格式化10時會返回1,0
? ?2. ChoiceFormat
? 相當于以數(shù)字為鍵,字符串為值的鍵值對。分別使用一組double類型的數(shù)組作為鍵,一組String類型的數(shù)組作為值,兩數(shù)組相同索引值的元素作為一對。
? ? 示例——基本用法
double[] limit = {0,1,3}; String[] format = {"hello0", "hello1", "hello3"}; ChoiceFormat cf = new ChoiceFormat(limit, format); for(int i = 0; i < 4; ++i){System.out.println(cf.format(i)); } /* 輸出* hello0* hello1* hello0* hello3*/? ?注意:當找不到對應的鍵值對時,則使用第一或最后一對鍵值對。
? ?示例——結(jié)合MessageFormat使用
double[] limit = {0, 1}; String[] format = {"Hello0", "Hello1{1}"}; ChoiceFormat cf = new ChoiceFormat(limit, format); MessageFormat mf = new MessageFormat("{0}"); mf.setFormatByArgumentIndex(0, cf); for (int i = 0; i < 2; ++i){System.out.println(mf.format(new Object[]{new Integer(i), new Integer(i+1)})); } /* 輸出* Hello0* Hello12*/?
六、性能問題 ?
? 由于靜態(tài)方法?MessageFormat.format?內(nèi)部是
public static String format(String pattern, Object ... arguments) { MessageFormat temp = new MessageFormat(pattern); return temp.format(arguments); }? 因此若要多次格式同一個模式的字符串,那么創(chuàng)建一個MessageFormat實例在執(zhí)行格式化操作比較好些。
?
七、總結(jié)
? 對于簡單的格式化或字符串組裝,?MessageFormat.format方法?使用更方便些,但要格式化處理更豐富的話要是用?String.format方法?吧!??
? 尊重原創(chuàng),轉(zhuǎn)載請注明來自:http://www.cnblogs.com/fsjohnhuang/p/4095059.html? ^_^肥仔John ?
?
八、參考
??http://zqc-0101.iteye.com/blog/114014
?
轉(zhuǎn)載于:https://www.cnblogs.com/fsjohnhuang/p/4095059.html
總結(jié)
以上是生活随笔為你收集整理的Java魔法堂:初探MessageFormat.format和ChoiceFormat的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二章 二进制数值和记数系统
- 下一篇: 第二部分_搭建Java Web开发环境与