如何根据特定的语言环境和小数位数格式化双精度浮点数?

17

如何使用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位小数,但根据当前语言环境显示千位分隔符和小数点?

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

我相信这就是你要找的内容,而且你不需要使用模式来搞乱它们。我不会这样做 - 例如,有些语言环境按两个数字分组,而不是三个数字(这就是我们谈论分组分隔符而不是千位分隔符的原因)。


@Paweł Dyda 我应该如何将美国区域设置下的字符串 123,456.78 转换为双精度值 123456.78? - KJEjava48

9

转自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)

0

这是一个比较古老的问题,但跟其他答案类似,我写了这个快捷解决方案

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

-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();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接