8.2.11 NumberFormat类
NumberFormat类是Format类的一个抽象子类。该类可以将数值格式化成符合某个国家地区习惯的格式字符串,也可以将表示数值的字符串解析成数值。
1. 获得NumberFormat类的对象实例
由于NumberFormat类是一个抽象类,因此,该类不能直接创建对象实例。要想获得NumberFormat类的对象实例,需要使用NumberFormat类的一系列getXxxInstance静态方法。这些getXxxInstance方法可分为如下两类:
(1)不带任何参数的getXxxInstance方法。这些getXxxInstance方法使用操作系统默认的本地信息,这些方法如下:
1 getInstance()和getNumberInstance():使用操作系统默认的本地信息获得处理多种数值类型的NumberFormat对象实例。
2 getIntegerInstance():使用操作系统默认的本地信息获得处理整数的NumberFormat对象实例。
3 getCurrencyInstance():使用操作系统默认的本地信息获得处理货币的NumberFormat对象实例。
4 getPercentInstance():使用操作系统默认的本地信息获得处理百分数的NumberFormat对象实例。
(2)带一个Locale类型的参数的getXxxInstance方法。这些方法如下:
1 getInstance(Locale inLocale)和getNumberInstance(Locale inLocale):使用指定的Locale对象所封装的本地信息获得处理多种数值类型的NumberFormat对象实例。
2 getIntegerInstance(Locale inLocale):使用指定的Locale对象所封装的本地信息获得处理整数的NumberFormat对象实例。
3 getCurrencyInstance(Locale inLocale):使用指定的Locale对象所封装的本地信息获得处理货币的NumberFormat对象实例。
4 getPercentInstance(Locale inLocale):使用指定的Locale对象所封装的本地信息获得处理百分数的NumberFormat对象实例。
2. 数值的格式化和解析
NumberFormat类的format方法可以将一个数值格式化为符合某个国家地区习惯的数值字符串。NumberFormat类的parse方法可以将一个表示数值的字符串解析成数值。
使用默认的本地信息和format方法格式化数值的代码如下:
NumberFormat nf1 = NumberFormat.getInstance();
NumberFormat nf2 = NumberFormat.getCurrencyInstance();
System.out.println(nf1.format(12345));
System.out.println(nf2.format(1234.56));
运行上面的代码将输出如下的结果:
12,345
¥1,234.56
使用默认的本地信息和parse方法解析表示数值的字符串的代码如下:
NumberFormat nf1 = NumberFormat.getInstance();
NumberFormat nf2 = NumberFormat.getCurrencyInstance();
Number number1 = nf1.parse("1234.56");
Number number2 = nf2.parse("¥1,234.56");
在使用parse方法分析表示数值的字符串时应注意如下几点:
1 表示数值的字符串的首字符必须是数字,否则将抛出java.text.ParseException异常。如parse方法在解析“a123”时将抛出异常。
2 表示数值的字符串除了首字符外,其他的字符可以是非数字,但parse方法只会解析非数字字符前面的部分。如parse方法会将“123a4.12”解析成123。
3 表示数值的字符串的尾部如果在非数字字符,这些字符将被忽略。
3. 控制数值的格式化和解析
NumberFormat类还有一些方法可以控制对数值的格式化和解析。这些方法如下:
1 setMinimumIntergerDigits和setMaximumIntegerDigits:这两个方法只对格式化数值起作用。它们分别设置了格式化后的十进制数值字符串的整数部分的最小位数和最大位数。最大位数不能小于最小位数,否则最小位数将被重新设置成当前的最大位数。如果数值的整数部分的实际位数小于最小位数,则前面补0,如果大于最大位数,则截断前面超出的部分。最小位数的默认值是1,最大位数的默认值是Integer.MAX_VALUE。假设最小位数是3,最大位数是5,则格式化12后的字符串是“012”,格式化1234567后的字符串是“34567”。
2 setMinimumFractionDigits和setMaximumFractionDigits:这两个方法只对格式化数值起作用。它们分别设置了格式化后的十进制数值字符串的小数部分的最小位数和最大位数。最大位数不能小于最小位数,否则最小位数将被重新设置成当前的最大位数。如果数值的小数部分的实际位数小于最小位数,则后面补0。如果大于最大位数,则截断后面超出的部分。最小位数的默认值是0,最大位数的默认值是3。假设最小位数是2,最大位数是4,则格式化12.1后的字符串是“12.10”,格式化12.12367后的字符串是“12.1237”。
3 setGroupingUsed:该方法用于设置是否采用组分隔符的方式格式化数值。默认值是true,也就是说在默认的情况下会使用组分隔符的方式格式化数值。假设采用组分隔符的方式格式化数值,格式化12345后的字符串为“12,345”。
4 setParseIntegerOnly:该方法只对解析表示数值的字符串起作用。如果设为true,表示parse方法只解析数值的整数部分,相当于使用getIntegerInstance()或getIntegerInstance(Locale inLocale)方法获得的NumberFormat对象。默认值为false。假设该方法的参数值为true,则解析“123.456”后的数值为123。