-- Start
--- 更多参见: Java 精萃什么是格式化呢? 所谓的格式化是指套用一定的格式将数字,日期或消息等转换成字符串, 或将具有一定格式的字符串还原成数字或日期. 我们为什么要格式化数字,日期和消息呢? 主要是为了在显示或打印的时候符合本地用户的习惯. 本节我们主要关注如何格式化数字和货币.
预定义格式
不同国家和地区显示数字和货币的方式是不同的, 显然格式化数字或货币和本地的语言环境有密切关系. 利用 NumberFormat 类提供的方法, 我们可以很容易的将数字或货币格式化成符合本地语言环境的形式.
格式化数字
下面的例子演示了各个国家和地区是如何显示数字的.
public static void main(String[] args) throws Exception { int testInt = 987654321; double testDouble = 987654321.123456789; for (Locale locale : NumberFormat.getAvailableLocales()) { NumberFormat nf = NumberFormat.getNumberInstance(locale); System.out.println("整数:" + nf.format(testInt) + " 小数:" + nf.format(testDouble) + " " + locale.getDisplayName(Locale.CHINA)); } }
部分结果如下整数:987,654,321 小数:987,654,321.123 中文 (中国) 整数:987,654,321 小数:987,654,321.123 日文 (日本) 整数:987,654,321 小数:987,654,321.123 英文 (美国) 整数:987.654.321 小数:987.654.321,123 德文 (德国)
从上面例子的结果中我们可以看出, 大部分国家都采用逗号作为千分位分隔符, 点号作为小数分隔符, 而德国却相反.在默认情况下, 格式化后只保留了3位小数, 在很多时候, 这不是我们想要的, 幸运的是, NumberFormat 类还提供了如下方法, 从而使我们能够自定义对格式化的行为.
void setMinimumFractionDigits(int newValue) //最少小数位数, 默认值 0 void setMaximumFractionDigits(int newValue) //最多小数位数, 默认值 3 void setMaximumIntegerDigits(int newValue) //最少小数位数, 默认值 1 void setMinimumIntegerDigits(int newValue) //最多小数位数, 默认值 40 void setRoundingMode(RoundingMode roundingMode) //四舍五入模式, 默认值 RoundingMode.HALF_EVEN
格式化百分比
有了格式化数字的经验, 格式化百分比是非常简单的, 我们只需使用 getPercentInstance 来得到 NumberFormat 的实例即可.
格式化货币
格式化货币也是非常简单的, 我们只需使用 getCurrencyInstance 来得到 NumberFormat 的实例即可.
国际标准化组织发布了 ISO 4217 标准, 它定义了用三个大写字母表示货币, Java 用 Currency 类来封装这个概念, 有些时候我们可能要用到这个CurrencyCode. 下面是一个简单的例子.
public static void main(String[] args) throws Exception { double testPercent = 987654321.123456789; for (Locale locale : Locale.getAvailableLocales()) { Currency ccy = null; try { ccy = Currency.getInstance(locale); } catch (IllegalArgumentException e) { continue; } NumberFormat nf = NumberFormat.getCurrencyInstance(locale); System.out.println(nf.format(testPercent) + " " + ccy.getCurrencyCode() + " " + locale.getDisplayName(Locale.CHINA)); } }
部分结果如下:¥987,654,321.12 CNY 中文 (中国) ¥987,654,321 JPY 日文 (日本) $987,654,321.12 USD 英文 (美国) 987.654.321,12 € EUR 德文 (德国)
自定义格式
NumberFormat 类提供的方法可以很容易的使我们把数字格式化成符合用户语言习惯的形式, 但是我们并不能自定义格式, 当用户需要特殊格式的时候, DecimalFormat 和 DecimalFormatSymbols 就有了用武之地.
DecimalFormat 允许我们
1. 给数字前后加0
2. 给数字加前缀和后缀
3. 指定千分位分隔符的位置
4. 指定小数位数及四舍五入的方式
下面是一个简单的例子
public static void main(String[] args) throws Exception { for (Locale locale : NumberFormat.getAvailableLocales()) { NumberFormat nf = NumberFormat.getNumberInstance(locale); DecimalFormat df = (DecimalFormat) nf; df.applyPattern("####,####.##"); System.out.println(df.format(987654321.123456789) + " " + locale.getDisplayName(Locale.CHINA)); } }
部分结果如下:9,8765,4321.12 中文 (中国) 9,8765,4321.12 日文 (日本) 9,8765,4321.12 英文 (美国) 9.8765.4321,12 德文 (德国)
下面我们分析一下格式化模式 ####,####.##
井号(#)代表数字.
逗号(,)代表千分位. 值得注意的是并不是说千分位就是逗号, 千分位到底是什么取决于本地语言环境.
点号(.)代表小数点. 同样, 小数点到底是什么取决于本地语言环境.
从上面的结果中我们可以看到, 德国和千分位和小数点和我们相反. 通过 DecimalFormatSymbols 类, 我们可以指定任何分隔符. 下面是一个简单的例子.
public static void main(String[] args) throws Exception { for (Locale locale : NumberFormat.getAvailableLocales()) { DecimalFormatSymbols mySymbols = new DecimalFormatSymbols(locale); mySymbols.setDecimalSeparator('|'); mySymbols.setGroupingSeparator(' '); DecimalFormat df = new DecimalFormat("####,####.##", mySymbols); System.out.println(df.format(987654321.123456789) + " " + locale.getDisplayName(Locale.CHINA)); } }
部分结果如下:9 8765 4321|12 中文 (中国) 9 8765 4321|12 日文 (日本) 9 8765 4321|12 英文 (美国) 9 8765 4321|12 德文 (德国)
我们采用竖线(|)作为小数点, 空格作为千分位, 可以看到小数点和千分位不再随语言环境的变化而变化了.下面是更多的例子
值 模式 结果 123456.789 ###,###.### 123,456.789 123456.789 ###.## 123456.79 123.78 000000.000 000123.780 12345.67 $###,###.### $12,345.67 12345.67 ¥###,###.### ¥12,345.67
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-11
-- Written by ShangBo on 2012-05-09
-- End