《Java实战常用类》第11节:NumberFormat类和DecimalFormat类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Java实战常用类》第11节:NumberFormat类和DecimalFormat类相关的知识,希望对你有一定的参考价值。


NumberFormat类用于格式化数字,它位于java.text包下,是一个抽象类,因此不能通过构造方法创建对象,通常NumberFormat类是通过getInstance()或getXXXInstance()静态方法来获得它的子类对象,子类对象再通过format()方法完成数字的格式化。通过不同的静态方法所获得的子类对象也有着不同的格式化风格。下面的表11-11展示了NumberFormat类的getXXXInstance()所获得子类对象的作用。

表11-11NumberFormat类获得子类对象的静态方法

方法

getInstance()/getInstance(Locale loc)

作用

所获得的对象以默认形式格式化数字

方法

getNumberInstance()/getNumberInstance(Locale loc)

作用

所获得的对象以默认形式格式化数字

方法

getCurrencyInstance()/getCurrencyInstance(Locale loc)

作用

所获得的对象以货币形式格式化数字

方法

getIntegerInstance()/getIntegerInstance(Locale loc)

作用

所或对象以整数形式格式化数字

方法

getCompactNumberInstance()/getCompactNumberInstance(Locale loc, Style style)

作用

所获对象以最大单位表示数字

方法

getPercentInstance()/getPercentInstance(Locale loc)

作用

所或对象以百分比形式格式化数字

由于这些方法的名称很长,表11-11把每个方法和它们的作用分上下两行显示。从表中可以看到:getInstance()和getNumberInstance()所获得的对象具有相同的格式化效果。此外还可以看到,所有的方法都可以通过Locale类对象为参数设置不同语言环境下的数字格式。下面的【例11_30】展示了使用NumberFormat类完成数字格式化的效果。

【例11_30数字格式化1】

Exam11_30.java

import java.text.NumberFormat;
import java.util.Locale;
public class Exam11_30
public static void main(String[] args)
//获得默认格式化数字的对象
NumberFormat nf1 = NumberFormat.getNumberInstance();
//获得默认格式化数字的对象(法国法语)
NumberFormat nf2 = NumberFormat.getNumberInstance(Locale.FRANCE);
//获得以货币形式格式化数字的对象(默认)
NumberFormat nf3 = NumberFormat.getCurrencyInstance();
//获得以货币形式格式化数字的对象(美国)
NumberFormat nf4 = NumberFormat.getCurrencyInstance(Locale.US);
//获得以整数格式化数字的对象(默认)
NumberFormat nf5 = NumberFormat.getIntegerInstance();
//获得以最大单位表示数字的对象(默认)
NumberFormat nf6 = NumberFormat.getCompactNumberInstance();
//获得以最大单位表示数字的对象(美国,长风格)
NumberFormat nf7 =
NumberFormat.getCompactNumberInstance(Locale.US,NumberFormat.Style.LONG);
//获得以百分比形式格式化数字的对象(默认)
NumberFormat nf8 = NumberFormat.getPercentInstance();
System.out.print("以默认形式格式化数字123456789:");
System.out.println(nf1.format(123456789));
System.out.print("以法语形式格式化数字123456789.123789:");
System.out.println(nf2.format(123456789.123789));
System.out.print("以默认货币形式格式化数字123456789.123789:");
System.out.println(nf3.format(123456789.123789));
System.out.print("以美元形式格式化数字123456789.123789:");
System.out.println(nf4.format(123456789.123789));
System.out.print("以整数形式格式化数字123456789.123789:");
System.out.println(nf5.format(123456789.123789));
System.out.print("以默认最大单位表示数字123456789.123789:");
System.out.println(nf6.format(123456789.123789));
System.out.print("以默认最大单位表示数字23456789:");
System.out.println(nf6.format(23456789));
System.out.print("以美国英语的最大单位表示数字123456789.123789:");
System.out.println(nf7.format(123456789.123789));
System.out.print("以百分比形式格式化数字0.5:");
System.out.println(nf8.format(0.5));

【例11_30】的运行结果如图11-29所示。

第十一章《Java实战常用类》第11节:NumberFormat类和DecimalFormat类_Java

图11-29【例11_30】运行结果

从图11-29可以看出:以默认形式格式化一个整数时,会按每3位为一组,以逗号把数字隔开。这种写法能让人们在对数字进行核对时提高速度和准确率,会计在记账的时候往往都会采用这样的方式来书写数字。以法语的形式格式化数字时会把整数部分的每3位为一组以空格隔开,并且以逗号表示小数点,这是因为欧洲很多国家都是用逗号来表示小数点的。把数字格式化为货币形式时,会根据语言环境显示货币符号,例如在默认情况下显示表示人民币的¥符号,而把语言环境设置为美国英语时,显示表示美元的$符号,并且数字只保留小数点后面的两位。此外,把数字格式化为整数时并不是直接把小数点后面的部分直接去掉,而是采用四舍五入的方式保留整数部分。调用getCompactNumberInstance()方法时,如果给方法传递表示语言环境的Locale对象,必须还要传递一个表示显示风格的Style枚举值。如果以LONG枚举值设置显示数字的风格,数字的单位以全称显示,而以SHORT枚举值设置显示数字的风格则数字的单位以简写形式显示。当以最大单位显示一个数字时,都以整数显示,小数部分以四舍五入的方式舍弃。

从图11-29可以看出:使用getNumberInstance()方法所得到的对象在格式化浮点数时只能保留3位小数。如果希望在格式化浮点数时保留任意位数的小数,可以使用DecimalFormat类的对象完成格式化。DecimalFormat类在创建对象时允许程序员设置不同的格式化模式。实际上getNumberInstance()方法所得到的对象也属于DecimalFormat类,只是用getNumberInstance()得到的对象已经被设置好了模式,这种模式把小数点后面的部分定义为最多3位。

为DecimalFormat类的对象设置格式化模式时需要用到一些特殊字符,这就如同对日期进行格式化时用小写的y来表示年以及用大写的M表示月一样,小写的y和大写的M都是特殊字符。为数字设置格式化模式时最常用的特殊字符就是#,每一个#表示一个数字,例如:

DecimalFormat df = new DecimalFormat("###,###.##");

以上代码创建了一个DecimalFormat类的对象df,创建这个对象时设置了模式,这个模式表示整数部分的数字3位为一组,以逗号分隔,而小数部分最多保留2位。用以上方式创建的DecimalFormat类对象在格式化数字时,如果第2位小数是0,则这个0不会被显示出来,如果想把处于小数末位的0也显示出来,可以用0代替#,例如:

DecimalFormat df = new DecimalFormat("###,###.00");

这样设置的好处是能够方便数字方便数字的对齐,例如在显示消费账单时能够把每一笔消费金额都精确到小数点后2位。此外,在显示数字时还可以显示出数字的单位,例如:

DecimalFormat df = new DecimalFormat("###,###.00kg");

以这种方式创建出的对象在格式化数字时,数字的后面会自动添加kg作为重量单位。实际上,在创建DecimalFormat类对象是还可以把模式设置为科学计数法。科学计数法模式要用字母E来表示,字母E的前面是系数的格式,后面是指数的格式,例如:

DecimalFormat df = new DecimalFormat("0.00E000");

这种设置模式的方式就表示系数保留2位小数,而指数最少以3位数的形式显示。DecimalFormat类的对象除了能够以百分比的形式显示,还可以用千分比的形式显示。千分比的符号是一个Unicode字符,它的值是“\\u2030”,下面的语句创建了一个以千分比形式表示数字的对象。

DecimalFormat df = new DecimalFormat("0.00\\u2030");

可以看到,千分比符号前面是0.00,这表示数字被表示成千分比形式时最多保留2位小数。

如果想获得某个DecimalFormat类对象的模式,可以调用对象的toPattern()的方法来完成,这个方法能够以字符串的形式返回创建DecimalFormat类对象的模式。下面的【例11_31】展示了使用DecimalFormat类对象格式化数字的效果。

【例11_31数字格式化2】

Exam11_31.java

import java.text.DecimalFormat;
public class Exam11_31
public static void main(String[] args)
//显示数字时保留2位小数(末位0省略)
DecimalFormat df1 = new DecimalFormat("###,###.##");
//显示数字时保留2位小数(末位0不省略)
DecimalFormat df2 = new DecimalFormat("###,###.00");
//以人民币格式显示数字
DecimalFormat df3 = new DecimalFormat("¥###,###.00");
//数字后面自动加kg为重量单位(保留2位小数)
DecimalFormat df4 = new DecimalFormat("###,###.00kg");
//以科学计数法显示数字
DecimalFormat df5 = new DecimalFormat("0.00E000");
//以千分比形式显示数字
DecimalFormat df6 = new DecimalFormat("0.00\\u2030");
System.out.print("对数字12345.1005保留2位小数显示(末位0省略):");
System.out.println(df1.format(12345.1005));
System.out.print("对数字12345.1005保留2位小数显示(末位0不省略):");
System.out.println(df2.format(12345.1005));
System.out.print("以人民币格式显示数字12345.1005:");
System.out.println(df3.format(12345.1005));
System.out.print("数字12345.1005后面自动加kg为重量单位(保留2位小数):");
System.out.println(df4.format(12345.1005));
System.out.print("以科学计数法显示数字12345.1005:");
System.out.println(df5.format(12345.1005));
System.out.print("以千分比形式显示数字0.12345:");
System.out.println(df6.format(0.12345));

【例11_31】的运行结果如图11-30所示。

第十一章《Java实战常用类》第11节:NumberFormat类和DecimalFormat类_格式化_02

图11-30【例11_31】运行结果

从图11-30可以看出,通过对DecimalFormat设置模式可以实现自由定义数字的显示格式。

除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

以上是关于《Java实战常用类》第11节:NumberFormat类和DecimalFormat类的主要内容,如果未能解决你的问题,请参考以下文章

《Java实战常用类》第9节:Comparable接口和Comparator接口

阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第3节 Calendar类_2_Calendar类的常用成员方法

阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第6节 基本类型包装类_4_包装类_基本类型与字符串类型之间

阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第1节 Scanner类_3-Scanner的使用步骤

第3章 第4节 处理聚类问题常用算法

蚂蚁课堂(每特学院)-2期