java.text.NumberFormat 抽象類提供與地區無關的數值/貨幣/百分比格式化。五大工廠方法獲取地區化實例:
getCurrencyInstance():貨幣getInstance()/getNumberInstance():通用數值getIntegerInstance():整數 (J2SE 1.4 新增)getPercentInstance():百分比各方法提供無參(當前地區)與 Locale 參數版本。範例:54321 在美國 (54,321) 與德國 (54.321) 顯示差異。
NumberFormat us = NumberFormat.getIntegerInstance(Locale.US);
NumberFormat de = NumberFormat.getIntegerInstance(Locale.GERMANY);
System.out.println(us.format(54321)); // 54,321
System.out.println(de.format(54321)); // 54.321
DecimalFormat 為 NumberFormat 具體子類,允許顯式指定字符模式控制正/負/小數/指數顯示。J2SE 1.4 新增 formatToCharacterIterator() 返回 AttributedCharacterIterator,可遍歷格式化輸出每字符屬性(整數、分組分隔符、百分號等)。範例:50.25 格式為百分比「5,025%」,迭代輸出每字符屬性 Map。
NumberFormat us = NumberFormat.getPercentInstance(Locale.US);
if (us instanceof DecimalFormat) {
AttributedCharacterIterator iter = ((DecimalFormat)us).formatToCharacterIterator(new Double(50.25));
for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
System.out.println("Char: " + c + " / " + iter.getAttributes());
}
}
ChoiceFormat 將數值區間映射為文本,常與 MessageFormat 結合產生語言無關拼接訊息。範例:0→「is no content」、1→「is one item」、≥2→「are many items」。
double[] limits = {0,1,2};
String[] msgs = {"is no content","is one item","are many items"};
ChoiceFormat cf = new ChoiceFormat(limits, msgs);
MessageFormat mf = new MessageFormat("There {0}.");
mf.setFormats(new Format[]{cf});
for (int i=0;i<5;i++)
System.out.println(i + ": " + mf.format(new Object[]{new Integer(i)}));
輸出:0→There is no content.、1→There is one item.、2-4→There are many items.
J2SE 1.4 新增 java.util.Currency 類,對應 ISO 4217 貨幣代碼。NumberFormat.getCurrency()/setCurrency() 獲取/設置貨幣實例。Currency.getInstance(Locale) 或代碼字串獲取實例,getSymbol() 取符號。注意:直接獲取 Currency 實例的 getSymbol() 可能返回三字母代碼(如 EUR、GBP),而透過 NumberFormat.getCurrencyInstance() 格式化則顯示真實符號(€、£)。
Currency usd = Currency.getInstance("USD");
Currency gbp = Currency.getInstance(Locale.UK);
NumberFormat usFmt = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat deFmt = NumberFormat.getCurrencyInstance(Locale.GERMANY);
System.out.println(usFmt.format(5000.25)); // $5,000.25
System.out.println(deFmt.format(5000.25)); // 5.000,25 €

軟體全球化不止文本本地化,數值/貨幣格式同樣關鍵。善用地區化 NumberFormat 實例,讓程式真正國際化。