DecimalFormat 包含一个模式 和一组符号
符号含义:
符号 | 位置 | 本地化? | 含义 |
0 |
数字 | 是 | 阿拉伯数字 |
# |
数字字 | 是 | 阿拉伯数字,如果不存在则显示为空 |
. |
数字 | 是 | 小数分隔符或货币小数分隔符 |
- |
数字 | 是 | 减号 |
, |
数字 | 是 | 分组分隔符 |
E |
数字 | 是 | 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 |
; |
子模式边界 | 是 | 分隔正数和负数子模式 |
% |
前缀或后缀 | 是 | 乘以 100 并显示为百分数 |
/u2030 |
前缀或后缀 | 是 | 乘以 1000 并显示为千分数 |
¤ (/u00A4 ) |
前缀或后缀 | 否 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 |
' |
前缀或后缀 | 否 |
用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#" 将 123 格式化为 "#123" 。要创建单引号本身,请连续使用两个单引号:"# o''clock" 。 |
例子:
DecimalFormat df1 = new DecimalFormat("0.0");
DecimalFormat df2 = new DecimalFormat("#.#");
DecimalFormat df3 = new DecimalFormat("000.000");
DecimalFormat df4 = new DecimalFormat("###.###");
System.out.println(df1.format(12.34));
System.out.println(df2.format(12.34));
System.out.println(df3.format(12.34));
System.out.println(df4.format(12.34));
运行结果:
12.3
12.3
012.340
12.34
DecimalFormat format = new DecimalFormat("###,####.000");
System.out.println(format.format(111111123456.1227222));
Locale.setDefault(Locale.US);
DecimalFormat usFormat = new DecimalFormat("###,###.000");
System.out.println(usFormat.format(111111123456.1227222));
DecimalFormat addPattenFormat = new DecimalFormat();
addPattenFormat.applyPattern("##,###.000");
System.out.println(addPattenFormat.format(111111123456.1227));
DecimalFormat zhiFormat = new DecimalFormat();
zhiFormat.applyPattern("0.000E0000");
System.out.println(zhiFormat.format(10000));
System.out.println(zhiFormat.format(12345678.345));
DecimalFormat percentFormat = new DecimalFormat();
percentFormat.applyPattern("#0.000%");
System.out.println(percentFormat.format(0.3052222));
运行结果 :
1111,1112,3456.123
111,111,123,456.123
111,111,123,456.123
1.000E0004
1.235E0007
30.522%
如果使用具有多个分组字符的模式,则最后一个分隔符和整数结尾之间的间隔才是使用的分组大小。所以 "#,##,###,####" == "######,####" == "##,####,####"。
我们经常要将数字进行格式化,比如取2位小数,这是最常见的。Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子。下面是常用的例子:
import java.text.DecimalFormat;
public class Test{
public static void main(String[] args){
double pi=3.1415927;//圆周率
//取一位整数
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整数和两位小数
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(new DecimalFormat("00.000").format(pi));//03.142
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
long c=299792458;//光速
//显示为科学计数法,并取五位小数
System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8
//显示为两位整数的科学计数法,并取四位小数
System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7
//每三位以逗号进行分隔。
System.out.println(new DecimalFormat(",###").format(c));//299,792,458
//将格式嵌入文本
System.out.println(new DecimalFormat("光速大小为每秒,###米").format(c)); //光速大小为每秒299,792,458米
}
}
DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。上面的例子包含了差不多所有的基本用法,如果你想了解更多,请参考 DecimalFormat 类的文档。
今天遇到一个奇怪的问题,就是java.text.DecimalFormat的format方法遇到小数位5不进位的问题。
例如:
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("#.##");
String testStr = df.format(3.165);
System.out.println(testStr);
输出的结果是:
3.16
Process finished with exit code 0
原因是这个函数的默认舍入策略是四舍六入五奇偶。具体策略如下:
如4.56就是4.6,最后一位小数大于等于6就向前进一位.
4.54就是4.5,最后一位小数小于等于4,就舍去
4.45就是4.4 4.55就是4.6最后一位小数是5的时候,当前一位是奇数的时候就进一位凑成偶数,当前一位是偶数的时候就舍去.
所以如果要使用我们常用的四舍五入,需要加一句:
df.setRoundingMode(RoundingMode.HALF_UP);
搞定!
DecimalFormat适用于十进制数字的格式化
//没有带数字格式的实例化
// DecimalFormat format = new DecimalFormat();
// format.applyPattern("#");//当实例化没有传递数字格式的时候,使用该方法传入数字格式
//数字格式的实例化
DecimalFormat format = new DecimalFormat("#");
/**
* java.math.RoundingMode
* 远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值。
* RoundingMode.UP 舍入为一位数1.1-> 2 2.5->3 -1.1->-2
* 向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值。
* RoundingMode.DOWN 舍入为一位数 1.1->1 2.5->2 -1.1->-1
* 向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.UP;如果结果为负,则舍入行为类似于 RoundingMode.DOWN
* RoundingMode.CEILING 舍入为一位数 1.1->2 2.5->3 -1.1->-1 -2.5->-2
* 向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于RoundingMode.UP
* RoundingMode.FLOOR 舍入为一位数 1.1->1 2.5->2 -1.1->-2 -2.5->-3
* 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。注意,此舍入模式就是通常学校里讲的四舍五入。
* RoundingMode.HALF_UP 舍入为一位数 1.1->1 2.5->2 -1.1->-1 -2.5->-3
* ...
*/
format.setRoundingMode(RoundingMode.HALF_UP);//设置格式化时的舍入方式
// public final String format (Object obj) 表示可以传递任意参数
// public final String format(double number)\
// public final String format(long number)...
String result = format.format(123123.123123);//参数表示需要格式化的数字或者数字类型的字符串 result就是格式化后的字符串
特殊字符说明
“0” 指定位置不存在数字则显示为0 123.123 ->0000.0000 ->0123.1230
"#" 指定位置不存在数字则不显示 123.123 -> ####.#### ->123.123
"." 小数点
"%" 会将结果数字乘以100 后面再加上% 123.123 ->#.00->1.3212%
api中文帮助文档关于"#"的翻译是错误的,原文为“zero shows as absent”译为“如果为0,则不显示”。
代码示例:
new java.text.DecimalFormat("#.###").format(3.0)
new java.text.DecimalFormat("0.000").format(3.0)
输出的结果为: 3 和3.000
"#"可以理解为在正常的数字显示中,如果前缀与后缀出现不必要的多余的0,则将其忽略。
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛