具有特定格式和两位小数的双精度

时间:2017-04-20 14:19:50

标签: java decimal

我试图将数字格式化为某种方式。

所以,我喜欢数字 1007,2 ,我希望它看起来像 1 007,20

这需要两个因素:

  • 数千格式
  • 小数点后两位

我有一个设置千种格式的代码:

Double total_value = Double.valueOf(1007,2);

String formatedValue = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH).format(total_value);

输出是: 1 007,2€

我有两位小数的代码:

Double total_value = Double.valueOf(1007,2);

String formatedValue = String.format("%.2f", total_value);

问题是,对于同时使用这两种格式的方法,它们总是会出现问题,因为它们中的两个返回字符串,并且都需要在Double中接收格式化值。

如果我在String中收到一个,当我尝试将字符串解析为Double String value = Double.parseDouble(formatedValue);String value = Double.valueOf(formatedValue)时,它们总是会出错。我已经尝试了 DecimalFormat ,但它也返回了一个字符串。

所以,我不知道如何将两种方法结合在一起工作!

如果您有任何想法请评论:)

2 个答案:

答案 0 :(得分:3)

您不想将NumberFormatString.format()合并。

您可以进一步配置NumberFormat对象,告诉它使用两位小数:

    NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH);
    numberFormat.setMinimumFractionDigits(2);

    assertThat(numberFormat.format(1007.2), is("1 007,20"));

(可能setMaximumFractionDigits()等,视您的需要而定 - 请参阅Javadoc)

注意 - NumberFormat.format()不是线程安全的。

或者,您可以使用String.format(locale, format, args)

 assertThat(String.format(Locale.CANADA_FRENCH, "%,.2f", 1007.2), is("1 007,20"));

格式中的,标志告诉格式化程序使用千位分隔符,并且语言环境告诉它分隔符是空格。

答案 1 :(得分:0)

设置千种格式后,您可以执行以下操作:

String[] splitter = formatedValue.split("\\,");
int decimalDigits = 0;
if (splitter.length > 1) {
    formatedValue = splitter[1].length();
} else {
    formatedValue += ",";
}
for (int i = 0; i < 2 - decimalDigits; i++) {
    formatedValue += "0";
}

我没有测试过这个,它并不是真的很漂亮,但是我使用类似英语格式的东西。

为了确保您只有两位小数,您可能应该在开头围绕总值。