16

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

例如,我有这些值:

double d1 = 123456.78;
double d2 = 567890;

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

123,456.78
567,890.00

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

编辑:

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

123 456,78
567 890,00

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

4

5 回答 5

45

如果您愿意阅读 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

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

于 2012-05-02T14:53:44.260 回答
9

改编自定制格式

  public void localizedFormat(double value,Locale loc ) {

  NumberFormat nf = NumberFormat.getNumberInstance(loc);
  DecimalFormat df = (DecimalFormat)nf;
  df.applyPattern("###,###.00");
  String output = df.format(value);

  }

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

于 2012-05-02T10:12:47.360 回答
1

你可以使用类似的东西

DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance();
formatter.applyPattern("#,###,##0.00");
formatter.format(yourDoubleHere)
于 2012-05-02T09:55:57.897 回答
0

很老的问题,但与其他答案类似,我写了这个有一个快速的解决方案

public static String formatDecimal(Double decimal) {
        return new DecimalFormat(
                "###,###,###,###.##",
                DecimalFormatSymbols.getInstance(Locale.getDefault())
        )
                .format(decimal);
    }
于 2021-12-27T22:32:17.077 回答
-1

将 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();
    }
于 2016-12-10T06:53:29.310 回答