博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
格式化数字和货币
阅读量:4049 次
发布时间:2019-05-25

本文共 3963 字,大约阅读时间需要 13 分钟。

-- Start

什么是格式化呢? 所谓的格式化是指套用一定的格式将数字,日期或消息等转换成字符串, 或将具有一定格式的字符串还原成数字或日期. 我们为什么要格式化数字,日期和消息呢? 主要是为了在显示或打印的时候符合本地用户的习惯. 本节我们主要关注如何格式化数字和货币.

预定义格式

不同国家和地区显示数字和货币的方式是不同的, 显然格式化数字或货币和本地的语言环境有密切关系. 利用 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) //最少小数位数, 默认值 0void 	setMaximumFractionDigits(int newValue) //最多小数位数, 默认值 3void 	setMaximumIntegerDigits(int newValue) //最少小数位数, 默认值 1void 	setMinimumIntegerDigits(int newValue) //最多小数位数, 默认值 40void 	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
你可能感兴趣的文章
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt 创建异形窗体
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
GNU hello代码分析
查看>>