格式化数字和货币

-- 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) //最少小数位数, 默认值 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.78000000.000000123.780
12345.67$###,###.###$12,345.67
12345.67 ¥###,###.### ¥12,345.67

--- 更多参见: Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-11
-- Written by ShangBo on 2012-05-09
-- End
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值