首页 > 编程语言 > 第十一章《Java实战常用类》第11节:NumberFormat类和DecimalFormat类

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

时间:2023-01-02 14:00:17浏览次数:71  
标签:11 格式化 数字 NumberFormat System Java DecimalFormat out

​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.9:");
System.out.println(nf5.format(123456789.9));
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类_DecimalFormat

图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类_DecimalFormat_02

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

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

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。


标签:11,格式化,数字,NumberFormat,System,Java,DecimalFormat,out
From: https://blog.51cto.com/mugexuetang/5983681

相关文章

  • Java 中基本类型和字符串之间的转换-2023-1-2
    在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。其中,基本类型转换为字符串有三种方法:1.使用包装类的toString()方法2.使用String类的valueOf()......
  • javascript-数据类型-数据类型,获取数据变量的类型,数据类型的转换
    javascript-数据类型-数据类型,获取数据变量的类型,数据类型的转换目录javascript-数据类型-数据类型,获取数据变量的类型,数据类型的转换学习目标:1.数据类型简介1.1为什么......
  • 浅谈Java并发
    Java并发是比较难的知识点,难于对并发的理解。并发要从操作系统和硬件层面去理解,才会比较深入,而不单单是从编程语言的逻辑去理解。首先对于并发要清楚的几点:线程可能在任......
  • /home/software/python/Modules/_ctypes/_ctypes.c:118:17: fatal error: ffi.h: No s
     001、python3.11编译报错/home/software/python/Modules/_ctypes/_ctypes.c:118:17:fatalerror:ffi.h:Nosuchfileordirectory  002、解决方法[root@PC......
  • Java编程技术期末复习总结
    Java编程技术期末复习总结一、Java编程基础下列软件包中,不需要使用import指令就可直接使用的是____。A.java.langB.java.textC.java.sqlD.java.utilA在java......
  • JAVA-基础知识-2023-1-2
    “==”和equals()有什么区别呢?==:判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象equals():比较存储在两个字符串对象中的内容是否一致PS:字节......
  • 第十一章《Java实战常用类》第6节:Object类
    ​Java语言中,Object类是所有类的祖先,因此,Object类的特性就成为了Java语言中所有类的特性。Java语言之所以要给所有类都定义一个共同的祖先,就是为了让Java世界万物归于一统,这......
  • 第十一章《Java实战常用类》第7节:Objects类
    ​Objects类位于Java.util包,这个类与Object类的名称很相像,Java语言定义Objects类是为了让程序员能够以更加合理的方式操作对象。Objects类中定义的方法很多,这些方法可以分为......
  • 第十一章《Java实战常用类》第8节:Arrays类
    ​Arrays类位于java.util包,它是一个数组工具类,可以帮助程序员完成一些对数组常见的操作。这些常见的操作包括对数组元素排序,从数组中查找特定的元素、比较两个数组元素是不......
  • java多线程
    1、线程:进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 线程不能独立存在,必须依赖进程,在进程中运行每一个进......