2017-04-20 103 views
0

我试图格式化数字看起来像某种方式。双特定格式和两位小数

所以,我有一个像数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中,当我尝试解析,以双倍的字符串像String value = Double.parseDouble(formatedValue);String value = Double.valueOf(formatedValue)他们总是得到一个错误。我已经尝试了DecimalFormat但它也返回一个字符串。

所以,我不知道如何做两个方法共同工作!

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

+0

您是否试图单独处理数字和小数部分,然后连接结果(去除十进制字符串的两个第一个字符)? – Anis

+0

请注意,'Double.valueOf(1007,2);'不能编译。虽然我们可以猜出您的意思,但最好将实际代码复制/粘贴到您的问题中。 – slim

回答

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")); 

格式的,标志告诉格式化使用千位分隔符,和现场告诉它的分隔符是空格。

+0

这是第一个选择真的很好!谢谢你这样:) –

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"; 
} 

我没有测试过这一点,它是不是很漂亮,但我使用了英文格式类似的东西。

为确保您只有两位小数位,您应该在开始时将您的总价值舍入。