7.7.7 使用NumberFormat格式化数字

7.7.7 使用NumberFormat格式化数字

MessageFormat是抽象类Format的子类, Format抽象类还有两个子类:NumberFormatDateFormat,它们分别用以实现数值、日期的格式化。 NumberFormatDateFormat可以将数值、日期转换成字符串,也可以将字符串转换成数值、日期。

图7.9显示了NumberFormatDateFormat的主要功能。
这里有一张图片

NumberFormatDateFormat都包含了format()parse()方法,其中

  • format()用于将数值、日期格式化成字符串,
  • parse()用于将字符串解析成数值、日期

如何获取NumberFormat对象

NumberFormat也是一个抽象基类,所以无法通过它的构造器来创建NumberFormat对象,它提供了如下几个类方法来得到NumberFormat对象。

方法 描述
getCurrencyInstance() 返回默认Locale货币格式器。如果要获取指定Locale的货币格式器,则在调用该方法时传入指定的Locale
getIntegerInstance() 返回默认Locale整数格式器。如果要获取指定Locale的整数格式器,则在调用该方法时传入指定的Locale
getNumberInstance() 返回默认Locale的通用数值格式器。也可以在调用该方法时传入指定的Locale,从而则获取指定Locale的通用数值格式器。
getPercentInstance() 返回默认Locale的百分数格式器。也可以在调用该方法时传入指定的Locale,获取指定Locale的百分数格式器。

一旦取得了NumberFormat对象后,就可以调用它的format()方法来格式化数值,包括整数和浮点数。

程序示例

如下例子程序示范了NumberFormat的三种数字格式化器的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
import java.text.*;

public class NumberFormatTest {
public static void main(String[] args) {
// 需要被格式化的数字
double db = 1234000.567;
// 创建四个Locale,分别代表中国、日本、德国、美国
Locale[] locales = { Locale.CHINA, Locale.JAPAN, Locale.GERMAN, Locale.US };
NumberFormat[] nf = new NumberFormat[12];
// 为上面四个Locale创建12个NumberFormat对象
// 每个Locale分别有通用数值格式器、百分比格式器、货币格式器
for (int i = 0; i < locales.length; i++) {
nf[i * 3] = NumberFormat.getNumberInstance(locales[i]);
nf[i * 3 + 1] = NumberFormat.getPercentInstance(locales[i]);
nf[i * 3 + 2] = NumberFormat.getCurrencyInstance(locales[i]);
}
for (int i = 0; i < locales.length; i++) {
String tip = i == 0 ? "----中国的格式----"
: i == 1 ? "----日本的格式----" : i == 2 ? "----德国的格式----" : "----美国的格式----";
System.out.println(tip);
System.out.println("通用数值格式:" + nf[i * 3].format(db));
System.out.println("百分比数值格式:" + nf[i * 3 + 1].format(db));
System.out.println("货币数值格式:" + nf[i * 3 + 2].format(db));
}
}
}

运行结果:

1
2
3
4
5
6
7
8
9
10
11
----中国的格式----
通用数值格式:1,234,000.567
百分比数值格式:123,400,057%
货币数值格式:¥1,234,001
----德国的格式----
通用数值格式:1.234.000,567
百分比数值格式:123.400.057 %
货币数值格式:1.234.000,57 ¤
----美国的格式----
百分比数值格式:123,400,057%
货币数值格式:$1,234,000.57

NumberFormat也有国际化的作用

德国的小数点比较特殊,它们采用逗号(,)作为小数点;
中国、日本使用作为货币符号,而美国则采用$作为货币符号。
同样的数值在不同国家的写法是不同的,而NumberFormat的作用就是把数值转换成不同国家的本地写法,所以NumberFormat其实也有国际化的作用。