首页 文章

如何格式化给定语言环境的双精度值和小数位数?

提问于
浏览
14

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

例如,我有以下值:

double d1 = 123456.78;
double d2 = 567890;

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

123,456.78
567,890.00

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

Edit:

为了使事情更清楚,问题是我想以依赖于语言环境的方式显示钱,但是具有固定数量的小数位 . 上面的示例显示了如果系统区域设置为 en_US ,应如何格式化值 . 现在假设,系统区域设置是 cs_CZ (捷克语),因此应以这种方式格式化相同的数字:

123 456,78
567 890,00

现在,如何设置NumberFormat以始终显示2个小数位,但是根据当前区域设置显示千位分隔符和小数点?

4 回答

  • -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

    我相信这就是你在寻找的东西,你不要这样做 - 例如,有一些区域设置将数字组合为两个,而不是三组(这就是我们讨论的原因 grouping separator 而不是 thousands separator ) .

  • 41

    改编自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);
    
      }
    

    此功能应该为您提供所需的格式 .

  • 1

    你可以用类似的东西

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

    将double值转换为double值后面的任意位数 . 我在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();
        }
    

相关问题