【问题标题】:How to format double value for a given locale and number of decimal places?如何为给定的语言环境和小数位数格式化双精度值?
【发布时间】:2012-05-11 18:56:59
【问题描述】:

如何使用NumberFormat 为给定的Locale(默认语言环境就足够了)和给定的小数位数格式化double 值?

例如,我有这些值:

double d1 = 123456.78;
double d2 = 567890;

我想用以下方式打印它们,例如使用美国语言环境和 2 个小数位:

123,456.78
567,890.00

在这种情况下,我实际上并不关心舍入模式,因为这些双精度值是从具有给定比例的BigDecimal 获得的,因此它们的小数位数总是小于或等于我的小数位数想打印。

编辑:

为了让事情更清楚一点,问题是我想以依赖于语言环境的方式显示货币,但小数位数是固定的。上面的示例显示,如果系统区域设置为en_US,则应如何格式化这些值。现在让我们说,系统语言环境是cs_CZ(捷克语),所以相同的数字应该这样格式化:

123 456,78
567 890,00

现在,如何设置 NumberFormat 以始终​​显示 2 位小数,但根据当前语言环境显示千位分隔符和小数点?

【问题讨论】:

    标签: java number-formatting


    【解决方案1】:

    如果您愿意阅读 NumberFormat 的文档,解决方案将是显而易见的:

    double d1 = 123456.78;
    double d2 = 567890;
    // self commenting issue, the code is easier to understand
    Locale fmtLocale = Locale.getDefault(Category.FORMAT);
    NumberFormat formatter = NumberFormat.getInstance(fmtLocale);
    formatter.setMaximumFractionDigits(2);
    formatter.setMinimumFractionDigits(2);
    System.out.println(formatter.format(d1));
    System.out.println(formatter.format(d2));
    System.out.println(fmtLocale.toLanguageTag());
    

    在我的机器上打印出来:

    123 456,78
    567 890,00
    PL-PL

    我相信这就是您要寻找的东西,而且您不必弄乱模式。我不会那样做 - 例如,有些语言环境将数字按两位而不是三位分组(这就是我们谈论 分组分隔符not 的原因千位分隔符)。

    【讨论】:

    • @Paweł Dyda 我应该如何将美国语言环境中的字符串 123,456.78 转换为双精度值 123456.78?
    【解决方案2】:

    改编自Customizing Formats

      public void localizedFormat(double value,Locale loc ) {
    
      NumberFormat nf = NumberFormat.getNumberInstance(loc);
      DecimalFormat df = (DecimalFormat)nf;
      df.applyPattern("###,###.00");
      String output = df.format(value);
    
      }
    

    此函数应该为您提供所需的格式。

    【讨论】:

      【解决方案3】:

      你可以使用类似的东西

      DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
      formatter.applyPattern("#,###,##0.00");
      formatter.format(yourDoubleHere)
      

      【讨论】:

        【解决方案4】:

        相当老的问题,但与其他答案类似,我写这个是为了快速解决

        public static String formatDecimal(Double decimal) {
                return new DecimalFormat(
                        "###,###,###,###.##",
                        DecimalFormatSymbols.getInstance(Locale.getDefault())
                )
                        .format(decimal);
            }
        

        【讨论】:

          【解决方案5】:

          将双精度值转换为小数点后任意位数的双精度值。 我在 Utility 类中创建了这个方法,以便在整个项目中访问它。

          public static double convertToDecimal(double doubleValue, int numOfDecimals)  {
                  BigDecimal bd = new BigDecimal(doubleValue);
                  bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP);
                  return bd.doubleValue();
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-17
            • 1970-01-01
            相关资源
            最近更新 更多