关于DecimalFormat类的数字格式化


当我们遇到小数时,必定会设置保留小数的位数,也可能会涉及数字的格式转换
那么在Java中肯定也有这样的一个类,就是DecimalFormat类能帮助我们方便快捷的解决此类小数格式的问题

DecimalFormat 类路径 java.text.DecimalFormat
DecimalFormat 的父类也是抽象类NumberFormat 类路径 java.text.NumberFormat 很有意思的是 NumberFormat 的父类是 Format
Format应该很熟悉吧,说熟悉的原因是因为他的子类 DateFormat 与 SimpleDateFormat 在日期格式的转换上经常使用到的
DecimalFormat :用于格式化十进制数字

先大概了解下 DecimalFormat 是如何进行格式化的?

基本格式化:

/*定义一个浮点型变量 Π*/
double pai = 3.1415926535;//圆周率

/*1.创建DecimalFormat对象
(在创建对象时就可以填入特殊符号格式,也可以使用applyPattern(String pattern)方法填入)
DecimalFormat decimalFormat = new DecimalFormat("0.00");就可以直接省去第二步的代码*/
DecimalFormat decimalFormat = new DecimalFormat();

/*2.定制格式
(参数就是根据DecimalFormat中的多种特殊符号来进行格式化)*/
decimalFormat.applyPattern("0.00");//比如这里的 格式:"0" 就代表只取整数部分

/*3.传入值并转换数字(format是个重载方法)单个参数返回String,多个参数返回StringBuffer*/
String format = decimalFormat.format(pai);

/*4.打印输出(保留两位小数 = 3.14)*/
System.out.println(format);


/*一行代码搞定:链式编程(节省代码量) 格式:"0.00" 代表取整数并保留两位小数*/
System.out.println(new DecimalFormat("0.00").format(pai));

上面介绍了如何对数字进行简单的格式化,下面了解 DecimalFormat 类中的几种特殊符号,不同符号代表不同的格式

不同特殊符号代码的格式:

先了解下在格式化中会用到的特殊符号(可以参考Java官方文档)DecimalFormat 类官方中文API 下图是从官方文档截的图:

在这里插入图片描述

不同符号的使用:

注:下面为了方便测试多种格式,这里就直接链式编程简化为一行代码后输出结果
给大家举一些不同格式的例子:

  1. #和0配合使用
/* 
0
	整数位的0:取所有整数位,多余位数填充0
   小数位的0:保留小数的位数,是几个0就保留几位,多余位数也会填充0
#.##
	整数位的#:取全部整数部分,多余的#不会填充0(所以写一个#就行了)
	小数位的#:代表保留小数多少位,多余的#也不会填充0
	作用与0相同,但是多余位数不会填充0
#.##%
	将数字 * 100 然后取整数部分并保留两位小数
	3.1415926 * 100 = 314.15926 格式化后为 314.16(舍入的小数部分会四舍五入)
*/

double pai = 3.1415926;//圆周率

//取一位整数
System.out.println(new DecimalFormat("0").format(pai));//3
//取一位整数和两位小数
System.out.println(new DecimalFormat("0.00").format(pai));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(new DecimalFormat("00.000").format(pai));// 03.142
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pai));//3
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pai));//314.16%
  1. 科学计数法 E
double number = 123456789.1234;

System.out.println(new DecimalFormat("0E0").format(number));//1E8
System.out.println(new DecimalFormat("0E00").format(number));//1E08
System.out.println(new DecimalFormat("#E0").format(number));//.1E9
System.out.println(new DecimalFormat("##E0").format(number));//1.2E8
System.out.println(new DecimalFormat("###E0").format(number));//123E6
System.out.println(new DecimalFormat("####E0").format(number));//1.235E8
System.out.println(new DecimalFormat("#####E0").format(number));//1234.6E5
System.out.println(new DecimalFormat("######E0").format(number));//123.457E6
System.out.println(new DecimalFormat("#######E0").format(number));//12.34568E7
System.out.println(new DecimalFormat("########E0").format(number));//1.2345679E8
System.out.println(new DecimalFormat("#########E0").format(number));//123456789E0
System.out.println(new DecimalFormat("##########E0").format(number));//123456789.1E0
  1. 分组分隔符和减号
  • 分隔符 ,
int number = 123456789;

//每两位以逗号,进行分隔
System.out.println(new DecimalFormat(",##").format(number));//1,23,45,67,89        

//每三位以逗号,进行分隔
System.out.println(new DecimalFormat(",###").format(number));//123,,456,789

//每四位以逗号进行分隔
System.out.println(new DecimalFormat(",####").format(number));//1,2345,6789

System.out.println(new DecimalFormat("0,00").format(number));//12,99,79,24,58
  • 减号 -
    代表输出负数
double number = 3.1415926;

/*多余的整数位填充0,并保留两位小数点*/
System.out.println(new DecimalFormat("-00.00").format(number));//结果:-03.14

4.关于前缀、后缀

  • % 将数字乘以100(放大100倍)
double number = 0.05731;

System.out.println(new DecimalFormat("0.00%").format(number));//5.73%
System.out.println(new DecimalFormat("0%.00").format(number));//5.73%
System.out.println(new DecimalFormat("%0.00").format(number));//%5.73

/*0.05731 乘以 100 = 5.731 取一位整数并保留两位小数,但是如果有多余的整数位或小数位会被填充为0, % 可作为前缀 %5.73 也可做为后缀 5.73%*/
  • \u2030 将数字乘以1000(放大1000倍)
double number = 0.05731;

System.out.println(new DecimalFormat("0.00\u2030").format(number));//57.31‰
System.out.println(new DecimalFormat("0.0\u20300").format(number));//57.31‰
System.out.println(new DecimalFormat("\u20300.00").format(number));//‰57.31

/*0.05731 乘以 1000 = 57.31 取一位整数并保留两位小数,如果有多余的整数位或小数位会被填充为0, ‰ 可作为前缀 ‰57.71 也可做为后缀 57.31‰*/
  • ¤(\u00A4) 本地化货币符号
double number = 8361.123;

System.out.println(new DecimalFormat(",000.00¤").format(number));//8,361.12¥
System.out.println(new DecimalFormat(",000.¤00").format(number));//8,361.12¥
System.out.println(new DecimalFormat("¤,000.00").format(number));//¥8,361.12
System.out.println(new DecimalFormat(",00¤0.¤00").format(number));//8,361.12¥¥
System.out.println(new DecimalFormat("¤,000.¤00").format(number));//¥8,361.12¥
System.out.println(new DecimalFormat(",000.00¤¤").format(number));//8,361.12CNY

/*CNY: 人民币*/
  • 用于引用特殊的字符(自定义字符),作为前缀或后缀
double number = 9.73;

System.out.println(new DecimalFormat("'#'0.00").format(number));	//#9.73
System.out.println(new DecimalFormat("&0.00").format(number));		//&9.73
//使用'本身作为前缀或后缀 注意是两个 '
System.out.println(new DecimalFormat("''0.00").format(number));		//'9.73
System.out.println(new DecimalFormat("'^ _ ^'0.00").format(number));//^ _ ^9.73

注:DecimalFormat 提供 RoundingMode 中定义的舍入方式进行四舍五入然后格式。默认情况下,它使用 RoundingMode.HALF_EVEN
舍入方式在上一篇中已经讲到 关于BigDecimal类的常用方法与的舍入方式 其中 RoundingMode.HALF_EVEN 方式使用的是银行家舍入法
银行家舍入法:即四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一(可以去网上了解下)

大多数人如果能给更多事情一个机会的话,他们的问题都能解决

猜你喜欢

转载自blog.csdn.net/weixin_45377770/article/details/109753102