美文网首页
DecimalFormat - 格式化数据

DecimalFormat - 格式化数据

作者: Super_Clark | 来源:发表于2017-10-20 10:04 被阅读0次

    开发过程中,通常会遇到一个问题:我们需要将一个数值转换为格式化的数值,比:3.145678保留两位有效数字,这时候我们该用什么方法来转换呢?
    这篇笔记,将教会我们如何将Stringdoublefloat格式化为我们所需要的格式(比如:保留两位小数),而我们要用到的对象就是:DecimalFormat


    1、DecimalFormat的介绍

    • 全路径名:java.text.DecimalFormat
    • JavaSE官方文档的描述:

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

    • 舍入
      DecimalFormat 提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN。
    • 以上是JavaSE官方文档的一些描述,下面我们需要进行一些自己的使用总结。

    2、使用方法

    2.1、占位符的使用

    我们要实现格式化数据,需要使用到DecimalFormat的其中一个构造方法:

    public DecimalFormat(String pattern)
    

    构造参数pattern就是用来格式化的:一个非本地化的模式字符串。
    0#都是常用的占位符,但是他们俩还有些区别。
    下面我们举几个例子看看pattern的具体使用,以及0#的区别。

    2.1.1 - 0占位符的使用

    占位符比实际数字多
    new DecimalFormat("00.00").format(3.14567);//结果:03.15
    new DecimalFormat("0.000").format(3.14);//结果:3.140
    new DecimalFormat("00.000").format(3.14);//结果:03.140
    
    占位符比实际数字少
    new DecimalFormat("00.00").format(13.14567);//结果:13.15
    new DecimalFormat("0.000").format(13.14567);//结果:13.146
    new DecimalFormat("0.00").format(13.14567);//结果:13.15
    
    总结

    使用0占位符的时候:
    1、 比实际数字的位数多,不足的地方用0补上。
    2、 比实际数字的位数少:整数部分不改动,小数部分,四舍五入(其实并不是四舍五入,而是默认的RoundingMode.HALF_EVEN方式,下面会讲到DecimalFormat的舍入方式)。

    2.1.2 - #占位符的使用

    占位符比实际数字多
    new DecimalFormat("##.##").format(3.14567);//结果:3.15
    new DecimalFormat("#.###").format(3.14);//结果:3.14
    new DecimalFormat("##.###").format(3.14);//结果:3.14
    
    占位符比实际数字少
    new DecimalFormat("#.###").format(13.145678);//结果:13.146
    new DecimalFormat("##.##").format(13.14567);//结果:13.15
    new DecimalFormat("#.##").format(13.14567);//结果:13.15
    
    总结

    使用#占位符的时候:
    1、 比实际数字的位数多,不变。
    2、 比实际数字的位数少:整数部分不改动,小数部分,四舍五入(其实并不是四舍五入,而是默认的RoundingMode.HALF_EVEN方式,下面会讲到DecimalFormat的舍入方式)。

    2.1.3 占位符使用总结

    通过上面的例子,可以看到0和#占位符的区别,在实际使用的时候,可以根据不同需来选择占位符。
    比如:
    1、格式化数字,保留两位小数,不足的小数部分用0代替,这时候,我们就可以使用:"0.00"
    2、格式化数字,只保留有效数字,最多保留两位小数,这时候,我们就可以使用:"#.##"

    2.2 DecimalFormat的格式化方式(舍入方式)

    在以上的几个例子,我们可以发现,当要格式化的数字超过占位符的时候,格式化的结果会进行四舍五入。这并不是按照四舍五入的方式舍入的,而是因为没有指定格式化的RoundingMode,而默认使用了RoundingMode.HALF_EVEN方式。
    关于RoundingMode,这里就不做介绍了,可以参照另一篇笔记BigDecimal - 用于加、减、乘、除计算的工具类
    ,里面对RoundingMode进行了详细的介绍。

    使用方式

    下面举两个例子,指定舍入方式的格式化。

    DecimalFormat format = new DecimalFormat("#.##");
    //指定舍入方式为:RoundingMode.DOWN,直接舍去格式化以外的部分
    format.setRoundingMode(RoundingMode.DOWN);
    String formatDown = format.format(13.14567);//结果:13.14
    //指定舍入方式为:RoundingMode.HALF_UP,四舍五入
    format.setRoundingMode(RoundingMode.HALF_UP);
    String formatHalfUp = format.format(13.14567);//结果:13.15
    

    总结

    关于DecimalFormat 的舍入方式,可以参考以上的例子,根据需求的不同,使用对应的RoundingMode

    3、封装

    BigDecimal - 用于加、减、乘、除计算的工具类这篇笔记中,我们说过,要用String类型进行加、减、乘、除运算。所以,我们接受服务器返回的数据都是用String类型接收的,这时候我们用DecimalFormat 如何格式化String类型的数据呢?
    下面是个例子来实现String类型的格式化,将String类型的数据,格式化为只保留有效数字,最多保留两位小数,采用截取方式的方法(这个方法返回的是double,至于返回String、float、int都是可以的)。

        /**
         * @param str 需要格式化的字符串
         * @return 格式化后的double型数值
         */
        public static double stringToDouble(String str) {
            if (TextUtils.isEmpty(str)) {
                return 0;
            }
            DecimalFormat format = new DecimalFormat("#.##");
            //提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN。
            format.setRoundingMode(RoundingMode.DOWN);
            //使用BigDecimal对象来将String类型转换为DecimalFormat可以格式化的类型。
            String formatStr = format.format(new BigDecimal(str));
            //将格式化后的类型,转换为double类型(当然,也可以转换为float或int,视需求而定)。
            BigDecimal bigDecimal = new BigDecimal(formatStr);
            return bigDecimal.doubleValue();
        }
    

    4、总结

    以上是DecimalFormat的一些基础使用,在实际开发过程中:
    1、根据不同需求,来判断使用哪种占位符:0#
    2、根据不同需求,来判断使用哪种舍入方式:RoundingMode.DOWNRoundingMode.HALF_UP等等。

    相关文章

      网友评论

          本文标题:DecimalFormat - 格式化数据

          本文链接:https://www.haomeiwen.com/subject/uxvmuxtx.html