您现在的位置: 365建站网 > 365学习 > Java DecimalFormat数字格式化的主要功能及使用方法

Java DecimalFormat数字格式化的主要功能及使用方法

文章来源:365jz.com     点击数:411    更新时间:2018-05-28 16:28   参与评论
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。 

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,则将其忽略。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (411人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------