行业资讯 2025年08月6日
0 收藏 0 点赞 768 浏览 12480 个字
摘要 :

文章目录 前言 一、NumberFormat 数值格式化 货币格式化 百分比格式化 二、DecimalFormat 符号含义: 分析问题和实战 1.最基本的使用 2.科学计数法 E 3.分组分隔符和……




  • 前言
  • 一、NumberFormat
  • 数值格式化
  • 货币格式化
  • 百分比格式化
  • 二、DecimalFormat
    • 符号含义:
    • 分析问题和实战
      • 1.最基本的使用
      • 2.科学计数法 E
      • 3.分组分隔符和减号
      • 4. 关于前缀、后缀
      • 5. 四舍五入
      • 6. 同步
      • 7. 特殊值

      本文主要讲解关于如何使用DecimalFormat 和 NumberFormat 格式化数字千分位、百分号相关内容,让我们来一起学习下吧!

      前言

      在工作当中,可能经常会遇到比如数据保留两位小数显示,去除后面多余0,按指定格式输出数据这种需求,有时隔得时间久了也难免会忘记,所以就稍作总结方便今后查看,同时最后提供一个工具类方便今后使用。NumberFormat为数值格式化的工具类,DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。

      一、NumberFormat

      • NumberFormat 是所有数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。
      • NumberFormat 可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。

      数值格式化

      1. getInstance()、getNumberInstance()。返回当前默认语言环境的通用数值格式。
      2. getInstance(Locale)、getNumberInstance(Locale)。返回指定语言环境的通用数值格式。
      3. NumberFormat.setMinimumIntegerDigits(int)。设置数的整数部分所允许的最小位数。
      4. NumberFormat.setMaximumIntegerDigits(int)。设置数的整数部分所允许的最大位数。
      5. NumberFormat.setMinimumFractionDigits(int)。设置最少小数点位数,不足的位数以0补位,超出的话按实际位数输出。
      6. NumberFormat.setMaximumFractionDigits(int)。设置最多保留小数位数,不足不补0。
      import java.text.NumberFormat;
      import java.util.Locale;
      
      public class HelloWorld {
          public static void main(String[] args) {
              numberFormat();
          }
      
       private static void numberFormat() {
              double d = 12345.676688000;
              NumberFormat nf = NumberFormat.getNumberInstance();
              System.out.println(nf.format(d));//12,345.677 默认只保留到小数点后三位
              nf.setMinimumIntegerDigits(2);
              System.out.println(nf.format(d));//12,345.677 整数部分大于2位按默认最大小数位数3位输出
              d = 1234.0;
              nf.setMaximumIntegerDigits(3);
              System.out.println(nf.format(d));//234
              nf = NumberFormat.getInstance();
              d = 12345.6766;
              nf.setMinimumFractionDigits(1);
              System.out.println(nf.format(d));//12,345.677 小数部分大于1位,按默认最大小数位数3位输出
              nf.setMinimumFractionDigits(5);
              System.out.println(nf.format(d));//12,345.67660 不够位数补0
              nf.setMaximumFractionDigits(1);
              System.out.println(nf.format(d));//12,345.7
              nf = NumberFormat.getNumberInstance(Locale.US);
              d = 12345.6789;
              System.out.println(nf.format(d));//12,345.679
              nf = NumberFormat.getNumberInstance(Locale.FRANCE);
              System.out.println(nf.format(d));//12 345,679
          }
      }
      

      货币格式化

      1. getCurrencyInstance()。静态方法,建立一个NumberFormat类的对象并返回引用,该引用指定货币格式为系统预设的货币格式。
      2. getCurrencyInstance(Locale) 。静态方法,建立一个NumberFormat类的对象,并返回引用,该引用的货币格式由Locale指定。Locale类在java.util包中。
      import java.text.NumberFormat;
      import java.util.Locale;
      
      public class HelloWorld {
          public static void main(String[] args) {
              currencyFormat();
          }
      
          private static void currencyFormat() {
              //按系统预设的货币格式输出,这里是人民币
              NumberFormat nf = NumberFormat.getCurrencyInstance();
              System.out.println(nf.format(123.456));//¥123.46
              //按指定的货币格式输出,这里是美元
              //Locale locale = Locale.US;
              nf = NumberFormat.getCurrencyInstance(Locale.US);
              System.out.println(nf.format(123.456));//$123.46
          }
      }
      

      百分比格式化

      1. getPercentInstance()。静态方法,创建一个NumberFormat类的对象并返回其引用。该对象指定百分比格式为系统预设格式。
      2. getPercentInstance(Locale)。静态方法,创建一个NumberFormat类的对象并返回引用。该对象的百分比格式由Locale来指定。
       private static void percentFormat() {
              //按系统预设百分比格式输出
              double d = 123.456;
              NumberFormat nf = NumberFormat.getPercentInstance();
              System.out.println(nf.format(d));//12,346%
              //按指定百分比格式输出,这里是法国格式
              nf = NumberFormat.getPercentInstance(Locale.FRANCE);
              System.out.println(nf.format(d));//12 346 %
          }
      

      工具类

      import java.text.DecimalFormat;
      import java.text.NumberFormat;
      
      public class NumberDealUtil {
          /**
           * 移除数字前面和后面冗余的0,只保留3位小数
           *
           * @param isFormat 是否需要千位分隔符(,)这种格式输出
           * @param num
           * @return
           */
          public static String trim0(boolean isFormat, double num) {
              NumberFormat nf = NumberFormat.getInstance();
              if (!isFormat) {
                  //设置输出格式是否使用“,”分组,默认是使用的
                  nf.setGroupingUsed(false);
              }
              String result = nf.format(num);
      //        return isFormat ? result : result.replace(\",\", \"\"); //用上面代码替换去除分隔符操作
              return result;
          }
      
          /**
           * 移除数字前面和后面冗余的0
           *
           * @param isFormat      是否需要千位分隔符(,)这种格式输出
           * @param num
           * @param fractionDigit 要保留的小数位数
           * @return
           */
          public static String trim0(boolean isFormat, double num, int fractionDigit) {
              NumberFormat nf = NumberFormat.getInstance();
              nf.setMaximumFractionDigits(fractionDigit);
              //setMaximumFractionDigits不会保留小数点和后面多余的0,不需下面正则去除
      //        if (result.contains(\".\") && result.endsWith(\"0\")) {
      //            result = result.replaceAll(\"0+?$\", \"\");//去掉多余的0
      //            result = result.replaceAll(\"[.]$\", \"\");//如最后一位是.则去掉
      //        }
              if (!isFormat) {
                  //设置输出格式是否使用“,”分组,默认是使用的
                  nf.setGroupingUsed(false);
              }
              String result = nf.format(num);
      //        return isFormat ? result : result.replace(\",\", \"\");
              return result;
          }
      
          /**
           * 指定位数输出,不足补0
           * 整数部分如果位数大于需要的位数按实际位数输出
           * 小数部分如果大于需要的位数四舍五入
           *
           * @param num
           * @param integerDigit  整数部分位数
           * @param fractionDigit 小数部分位数
           * @return
           */
          public static String add0Format(double num, int integerDigit, int fractionDigit) {
              StringBuilder rule = new StringBuilder();
              if (integerDigit <= 0) {
                  rule.append(\"#\");
              } else {
                  for (int i = 0; i < integerDigit; i++) {
                      rule.append(\"0\");
                  }
              }
              if (fractionDigit > 0) {
                  rule.append(\".\");
                  for (int i = 0; i < fractionDigit; i++) {
                      rule.append(\"0\");
                  }
              }
              DecimalFormat df = new DecimalFormat(rule.toString());
              return df.format(num);
          }
      
          /**
           * 保留几位小数,不足不补0,小数部分冗余的0也不显示
           *
           * @param num
           * @param fractionDigit 要保留小数的位数
           * @return
           */
          public static String fractionDigitFormat(double num, int fractionDigit) {
              /*方法一*/
      //        StringBuilder rule = new StringBuilder(\"#\");
      //        if (fractionDigit > 0) {
      //            rule.append(\".\");
      //            for (int i = 0; i < fractionDigit; i++) {
      //                rule.append(\"#\");
      //            }
      //        }
      //        DecimalFormat df = new DecimalFormat(rule.toString());
      //        return df.format(num);
      
              /*方法二*/
              NumberFormat nf = NumberFormat.getInstance();
              nf.setMaximumFractionDigits(fractionDigit);
              //设置输出格式是否使用“,”分组,这里不使用
              nf.setGroupingUsed(false);
              return nf.format(num);
          }
      }
      

      二、DecimalFormat

      符号含义:

      符号 位置 本地化 含义
      0 数字 阿拉伯数字
      # 数字 阿拉伯数字如果不存在就显示为空
      . 数字 小数分隔符或货币小数分隔符
      数字 减号
      , 数字 分组分隔符
      E 数字 分割科学技术法中的尾数和指数。在前缀和后缀中无需添加引号
      ; 子模式边界 分隔正数和负数子模式
      % 前缀或后缀 乘以100并显示为百分数
      /u2030 前缀或后缀 乘以1000并显示为千分数
      ¤ (u00A4) 前缀或后缀 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符
      前缀或后缀 用于在前缀或或后缀中为特殊字符加引号,例如 “‘#’#” 将 123 格式化为 “#123″。要创建单引号本身,请连续使用两个单引号:”# o”clock”

      分析问题和实战

      当真的要写实战分析的时候发现真的不知道怎么写了,尴尬了啊!
      先来说一下最常用的写法。

      1.最基本的使用

      1.1 0和#配合使用

      网上的例子还是比较多的,我也感觉很有代表性,我也借鉴一下。下面直接上代码:

      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%
      
       /**
        * 上面的代码就是网上很经典的案例,下面我们来分析另外的一个值
        */      
      pi=12.34567;
      //取一位整数
      System.out.println(new DecimalFormat(\"0\").format(pi));//12
      //取一位整数和两位小数
      System.out.println(new DecimalFormat(\"0.00\").format(pi));//12.35
      //取两位整数和三位小数,整数不足部分以0填补。
      System.out.println(new DecimalFormat(\"00.000\").format(pi));// 12.346
      //取所有整数部分
      System.out.println(new DecimalFormat(\"#\").format(pi));//12
      //以百分比方式计数,并取两位小数
      System.out.println(new DecimalFormat(\"#.##%\").format(pi));//1234.57%
      
      /**
       * 扩展,如果是其他的数字会是下面的效果
       */
      pi=12.34;
      //整数
      System.out.println(new DecimalFormat(\"6\").format(pi));//612
      System.out.println(new DecimalFormat(\"60\").format(pi));//612
      System.out.println(new DecimalFormat(\"06\").format(pi));//126
      System.out.println(new DecimalFormat(\"00600\").format(pi));//00126
      System.out.println(new DecimalFormat(\"#####60000\").format(pi));//00126
      //小数
      System.out.println(new DecimalFormat(\".6\").format(pi));//12.6
      System.out.println(new DecimalFormat(\".06\").format(pi));//12.36
      System.out.println(new DecimalFormat(\".60\").format(pi));//12.36
      System.out.println(new DecimalFormat(\".0600\").format(pi));//12.3406
      System.out.println(new DecimalFormat(\".6000\").format(pi));//12.3406
      System.out.println(new DecimalFormat(\".600000##\").format(pi));//12.340006
      

      上面的例子基本满足我们想要的格式化的一些东西了。我们来对比分析一下上面两个值,很明显.就是我们常用的小数点分隔符,前面是整数,后面是小数。

      1.整数:若是n个0,就从个位开始向高位填充,如果有值就是原来的值,没有就填充0。
      若都是#,没有实际意义,不管是几个#,最后的结果都是原来的整数。
      0和#配合使用,只能是\"##00\",不能是\"00##\",就是#在前0在后。实现是上面的合集。
      2.小数:是可以保留小数点后几位的(几个0后或几个#)。
      若n个0,就是保留n位小数,小数不足的部分用0填充。
      若n个#,就是保留n位小数,小数不足部分没有就是没有。
      0和#配合使用,只能是\".00##\",不能是\".##00\",就是0在前#在后。实现和上面一样。
      3.数字(1-9):上面的分析不是#就是0,如果是其他的数值会怎样呢?
      上面的扩展很详细的说明这个问题。
      整数:若没有0或#,默认在后面拼接整数;若有0或#,找到第一个0或#的位置,然后找出所有的0或#拼在一起,按照上面的规则,在第一个0或#出现的位置插入响应的格式化以后的值。
      小数:若没有0或#,格式化是什么就显示什么;若有0或#,找出所有的0或#拼在一起,按照上面的规则,在小数点的后面插入响应的格式化以后的值。

      有了上面的总结,想生成什么就是什么,就是这么人性!

      2.科学计数法 E

      在使用double的时候如果后面的小数为过多就会自动转换为科学计数法,你听听这名字多么高级,科学计数法。(这一块写的我心力憔悴?)
      来吧我们直接上代码然后分析:

      pi = 123456789.3456;
      System.out.println(new DecimalFormat(\"0E0\").format(pi));//1E8
      System.out.println(new DecimalFormat(\"0E00\").format(pi));//1E08
      System.out.println(new DecimalFormat(\"#E0\").format(pi));//.1E9
      System.out.println(new DecimalFormat(\"##E0\").format(pi));//1.2E8
      System.out.println(new DecimalFormat(\"###E0\").format(pi));//123E6
      System.out.println(new DecimalFormat(\"####E0\").format(pi));//1.235E8
      System.out.println(new DecimalFormat(\"#####E0\").format(pi));//1234.6E5
      System.out.println(new DecimalFormat(\"######E0\").format(pi));//123.457E6
      System.out.println(new DecimalFormat(\"#######E0\").format(pi));//12.34568E7
      System.out.println(new DecimalFormat(\"########E0\").format(pi));//1.2345679E8
      System.out.println(new DecimalFormat(\"#########E0\").format(pi));//123456789E0
      System.out.println(new DecimalFormat(\"##########E0\").format(pi));//123456789.3E0
            
      pi = 12345678.3456;
      System.out.println(new DecimalFormat(\"0E0\").format(pi));//1E7
      System.out.println(new DecimalFormat(\"0E00\").format(pi));//1E07
      System.out.println(new DecimalFormat(\"#E0\").format(pi));//.1E8
      System.out.println(new DecimalFormat(\"##E0\").format(pi));//12E6
      System.out.println(new DecimalFormat(\"###E0\").format(pi));//12.3E6
      System.out.println(new DecimalFormat(\"####E0\").format(pi));//1235E4
      System.out.println(new DecimalFormat(\"#####E0\").format(pi));//123.46E5
      System.out.println(new DecimalFormat(\"######E0\").format(pi));//12.3457E6
      System.out.println(new DecimalFormat(\"#######E0\").format(pi));//12.34568E7
      System.out.println(new DecimalFormat(\"########E0\").format(pi));//12345678E0
      System.out.println(new DecimalFormat(\"#########E0\").format(pi));//12345678.3E0
      System.out.println(new DecimalFormat(\"##########E0\").format(pi));//12345678.35E0
      
      /**
       * 0的个数决定最后输出结果的位数
       * 并且与0的位置无关
       */
      pi = 12345;
      System.out.println(new DecimalFormat(\"###.##E0\").format(pi));//12.345E3
      System.out.println(new DecimalFormat(\"##0.##E0\").format(pi));//12.345E3
      System.out.println(new DecimalFormat(\"##0.0##E0\").format(pi));//12.345E3
      System.out.println(new DecimalFormat(\"##0.00000##E0\").format(pi));//12.3450E3
      System.out.println(new DecimalFormat(\"#00.0000##E0\").format(pi));//12.3450E3
      System.out.println(new DecimalFormat(\"#00.00000##E0\").format(pi));//12.34500E3
      

      上面的例子我感觉还是比较全的,看看例子分析一下,就能明白了。

      总结:
      1.使用科学计数法,首先保证E前面有0或者#,否则就不是科学计数法。
      2.E后面必须是0,0的个数对后面的显示是有影响的,多余就会填充0.
      3.E前面只有一个#,得到的结果肯定是.开头的结果。
      4.E前面#与0的总个数决定后面的指数,具体:总个数和指数比较,如果指数的值大于总个数,那么得到的指数的值是个数的倍数;如果指数的值小于等于总个数,那么得到的指数的值等于总个数;
      5.整个模式中的0的总个数决定最后输出结果的位数,并且与0的位置无关。
      6.如果整数部分需要保留几位数,就使用几个0。

      3.分组分隔符和减号

      3.1分组分隔符 ,

      这不就是逗号么?不这是分隔符,哈哈!
      直接上代码:

      pi = 1299792458;
      //每三位以逗号进行分隔。
      System.out.println(new DecimalFormat(\",###\").format(pi));//1,299,792,458
      System.out.println(new DecimalFormat(\",##\").format(pi));//12,99,79,24,58
      System.out.println(new DecimalFormat(\"###,##\").format(pi));//12,99,79,24,58
      

      上面的代码,最常用的就是千位分隔符。
      不管模式中有多少个分隔符,最右边的那一个有效;每一组的个数就是最右边的分隔符之右的整数位数。

      3.2 减号 –

      -表示输出为负数, 要放在最前面。代码如下:

      pi = 3.14;
      System.out.println(new DecimalFormat(\"-0.00\").format(pi));//-3.14
      

      4. 关于前缀、后缀

      4.1 % 将数字乘以100

      pi = 0.1234;
      System.out.println(new DecimalFormat(\"0.00%\").format(pi));//12.34%
      System.out.println(new DecimalFormat(\"0%.00\").format(pi));//12.34%
      System.out.println(new DecimalFormat(\"%0.00\").format(pi));//%12.34
      

      %处理最前面不能放置之外,其他的地方都可以放置。

      4.2 \\u2030 将数字乘以1000

      pi = 0.1234;
      System.out.println(new DecimalFormat(\"0.00\\u2030\").format(pi));//123.40‰
      System.out.println(new DecimalFormat(\"0.0\\u20300\").format(pi));//123.40‰
      System.out.println(new DecimalFormat(\"\\u20300.00\").format(pi));//‰123.40
      

      \\u2030%用法是一样的。

      4.3 ¤(u00A4) 本地化货币符号

      如果连续出现两次,代表货币符号的国际代号。

      pi = 1234.5678;
      System.out.println(new DecimalFormat(\",000.00¤\").format(pi));//1,234.57¥
      System.out.println(new DecimalFormat(\",000.¤00\").format(pi));//1,234.57¥
      System.out.println(new DecimalFormat(\"¤,000.00\").format(pi));//¥1,234.57
      System.out.println(new DecimalFormat(\",00¤0.¤00\").format(pi));//1,234.57¥¥
      System.out.println(new DecimalFormat(\"¤,000.¤00\").format(pi));//¥1,234.57¥
      System.out.println(new DecimalFormat(\",000.00¤¤\").format(pi));//1,234.57CNY
      

      4.4 ‘ 用于引用特殊的字符,作为前缀或后缀。

      pi = 4.5678;
      System.out.println(new DecimalFormat(\"\'#\'0.00\").format(pi));//#4.57
      System.out.println(new DecimalFormat(\"\'^ _ ^\'0.00\").format(pi));//^ _ ^4.57
      //使用\'本身作为前缀或后缀
      System.out.println(new DecimalFormat(\"\'\'0.00\").format(pi));//\'4.57
      

      5. 四舍五入

      说的就是我们数学上常说的四舍五入的问题。DecimalFormat 提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN

      6. 同步

      DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。

      7. 特殊值

      NaN 被格式化为一个字符串,通常具有单个字符 uFFFD。此字符串由 DecimalFormatSymbols 对象所确定。这是唯一不使用前缀和后缀的值。

      无穷大的值被格式化为一个字符串,通常具有单个字符 u221E,具有正数或负数前缀和后缀。无穷大值的字符串由 DecimalFormatSymbols 对象所确定。

      将负零(”-0″)解析为

      • 如果 isParseBigDecimal() 为 true,则为 BigDecimal(0),
      • 如果 isParseBigDecimal() 为 false 并且 isParseIntegerOnly() 为 true,则为 Long(0),
      • 如果 isParseBigDecimal() 和 isParseIntegerOnly() 均为 false,则为 Double(-0.0)。

      以上就是关于如何使用DecimalFormat 和 NumberFormat 格式化数字千分位、百分号相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客,学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10134.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号