如何格式化给定区域设置和小数位数的双精度值?

2022-09-03 03:28:44

如何使用给定值(默认区域设置就足够了)和给定小数位数的值进行格式化?NumberFormatdoubleLocale

例如,我有这些值:

double d1 = 123456.78;
double d2 = 567890;

我想按以下方式打印它们,例如使用美国区域设置和2个小数位:

123,456.78
567,890.00

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

编辑:

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

123 456,78
567 890,00

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


答案 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

我相信这就是你正在寻找的,你不必搞砸模式。我不会这样做 - 例如,有些区域设置将数字分组为二,而不是三(这就是我们谈论分组分隔符而不是千位分隔符的原因)。


答案 2

改编自定制格式

  public void localizedFormat(double value,Locale loc ) {

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

  }

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