【问题标题】:How to set thousands separator in Java?如何在 Java 中设置千位分隔符?
【发布时间】:2011-07-16 11:04:28
【问题描述】:

如何在 Java 中设置千位分隔符?
我有一个 BigDecimal 的字符串表示形式,我想用千位分隔符对其进行格式化并以字符串形式返回。

【问题讨论】:

    标签: java number-formatting bigdecimal


    【解决方案1】:

    您可以使用格式功能与“,”;

    int no = 124750;
    String str = String.format("%,d", no);
    
    //str = 124,750
    

    "," 包括特定于区域设置的分组字符。

    docs

    【讨论】:

    • 如果我想使用. 作为分隔符怎么办?
    • 因为我通常使用 String.format,它对我来说是最好和最简单的!
    • @Enissay 使用明确的语言环境调用format()(已知Local.US 使用, 作为分隔符),然后将, 替换为您的自定义分隔符:String.format(Locale.US, "%,d", n).replace(',', '.')。跨度>
    • java.util.IllegalFormatConversionException: %d 无法格式化 java.lang.String 参数
    • @ImanMarashi 将其转换为 int。或long。或BigInteger。如果您想使用doublefloatBigDecimal,请使用 f。
    【解决方案2】:

    这应该可以工作(未经测试,基于 JavaDoc):

    DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
    DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
    
    symbols.setGroupingSeparator(' ');
    formatter.setDecimalFormatSymbols(symbols);
    System.out.println(formatter.format(bd.longValue()));
    

    根据 JavaDoc,第一行中的转换应该保存在大多数语言环境中。

    【讨论】:

    • 对此未经测试的评论:getDecimalFormatSymbols() 的 Javadoc 说:Returns: a copy of the desired DecimalFormatSymbols。所以你应该在修改副本后使用setDecimalFormatSymbols(theCopy)
    • bd.longValue() 的文档说“任何小数部分都将被丢弃”。所以我不知道如果你关心精度,这是否是最好的方法
    • 我猜你可以使用new并将其设置回格式化程序:DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();customSymbol.setDecimalSeparator(decimalSeperator.charAt(0));customSymbol.setGroupingSeparator(thousandSeperator);formatter.setDecimalFormatSymbols(customSymbol);
    • 我想你会想使用 \u00a0 (不间断空格)作为分组分隔符。这是某些语言环境的默认设置。
    • 为什么叫longValue?问题是为 BigDecimal 设置数千个运算符,时间不长。
    【解决方案3】:
    BigDecimal bd = new BigDecimal(300000);
    
    NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));
    
    System.out.println(formatter.format(bd.longValue()));
    

    编辑

    要获得自定义分组分隔符,例如空格,请执行以下操作:

    DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
    symbols.setGroupingSeparator(' ');
    
    DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
    System.out.println(formatter.format(bd.longValue()));
    

    【讨论】:

    • 我知道我需要使用 DecimalFormatSymbols setGroupingSeparator,但我不知道如何在我的 BigDecimal 上应用它
    • @Funtime:您不会“将其应用于您的 BigDecimal”。您构建一个具有所需属性的NumberFormat 对象并使用它来格式化您的BigDecimalBigDecimal 只有一个指定的值,它没有有一个指定的格式。
    • 请注意,千位分隔符通常是一个非换行空格(当它是空格时)
    • 必须将第二个选项的第一行更改为 DecimalFormatSymbols symbols = new DecimalFormatSymbols();让这个工作。
    【解决方案4】:

    尝试将此代码格式化为巴西使用的格式:

        DecimalFormat df = new DecimalFormat(
          "#,##0.00", 
          new DecimalFormatSymbols(new Locale("pt", "BR")));
    
        BigDecimal value = new BigDecimal(123456.00);
    
        System.out.println(df.format(value.floatValue()));
    
        // results: "123.456,00"
    

    【讨论】:

    • 你也试试这个,在 JasperReports 的情况下,强制格式正确:parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); 将此参数发送到报告。
    【解决方案5】:

    如果您对整数数据类型使用千位分隔符,请使用 1。

    1. 对于整数数据类型

    String.format("%,d\n", 58625) 输出将是58,625

    1. 对于浮点数据类型 String.format("%,.2f",58625.21) 输出为58,625.21

    【讨论】:

    【解决方案6】:
    DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
    formatSymbols.setDecimalSeparator('|');
    formatSymbols.setGroupingSeparator(' ');
    
    String strange = "#,##0.###";
    DecimalFormat df = new DecimalFormat(strange, formatSymbols);
    df.setGroupingSize(4);
    
    String out = df.format(new BigDecimal(300000).doubleValue());
    
    System.out.println(out);
    

    【讨论】:

      【解决方案7】:

      必须真正改变接受的答案,否则无法正常工作。 getDecimalFormatSymbols 制作防御性副本。因此,

      DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
      DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
      
      symbols.setGroupingSeparator(' ');
      formatter.setDecimalFormatSymbols(symbols);
      System.out.println(formatter.format(bd.longValue()));
      

      新行是这一行:formatter.setDecimalFormatSymbols(symbols);

      【讨论】:

        【解决方案8】:
        NumberFormat nf = DecimalFormat.getInstance(myLocale);
        DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
        customSymbol.setDecimalSeparator(',');
        customSymbol.setGroupingSeparator(' ');
        ((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
        nf.setGroupingUsed(true);
        

        【讨论】:

          【解决方案9】:

          对于小数

          DecimalFormatSymbols symbols = new DecimalFormatSymbols();
          symbols.setGroupingSeparator(' ');
          DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
          dfDecimal.setDecimalFormatSymbols(symbols);
          dfDecimal.setGroupingSize(3);
          dfDecimal.setGroupingUsed(true);
          System.out.println(dfDecimal.format(number));
          

          【讨论】:

            【解决方案10】:

            如上所述,下面的link 为您提供了特定的国家代码,以允许Java 本地化该号码。每个国家都有自己的风格。

            在上面的链接中,你会找到应该放在这里的国家代码:

            ...(new Locale(<COUNTRY CODE HERE>));
            

            例如瑞士的数字格式如下:

            1000.00 --> 1'000.00

            country code

            为了实现这一点,以下代码对我有用:

            NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
            nf.setMaximumFractionDigits(2);
            DecimalFormat df = (DecimalFormat)nf;
            System.out.println(df.format(1000.00));
            

            结果如预期:

            1'000.00
            

            【讨论】:

              【解决方案11】:
              public String formatStr(float val) {
               return String.format(Locale.CANADA, "%,.2f", val);
              }
              
              formatStr(2524.2) // 2,254.20
              
              
              
              

              【讨论】:

              • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
              【解决方案12】:

              使用下划线 (_) 使代码本身中的文字数值更具可读性:

              int example = 12_004_953; // Twelve million four thousand nine hundred fifty-three
              

              【讨论】:

                猜你喜欢
                • 2016-01-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多