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

时间:2012-05-02 09:52:43

标签: java number-formatting

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

例如,我有这些值:

Locale

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

double d1 = 123456.78;
double d2 = 567890;

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

修改

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

cs_CZ

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

4 个答案:

答案 0 :(得分:41)

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

我相信这正是您所寻找的,而且您不必弄乱模式。我不这样做 - 例如,有一些区域设置将数字分组,而不是三组(这就是我们讨论分组分隔符 的原因)千位分隔符)。

答案 1 :(得分:8)

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

  }

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

答案 2 :(得分:1)

您可以使用类似

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

答案 3 :(得分:-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();
    }