浮点格式:最大精度但不固定

时间:2018-01-29 09:52:38

标签: java

我尝试格式化最多3位数的浮点数,但避免尾随零。我使用这种格式字符串:

 %1$,.3f

它正确地将数字1000.123格式化为我所期望的:1.000,123

但是对于浮动1000.12,我得到格式化结果1.000,120,而我希望将结尾归零,从而产生1.000,12

我对格式化字符串的错误有所了解吗?

3 个答案:

答案 0 :(得分:3)

以前,这个答案采用正则表达式来处理String / double的格式化float,但这不是一个好方法。对于格式double / float,有一个DecimalFormat类:

String formatted = new DecimalFormat("#,###.###").format(1000.120);
System.out.println(formatted);

#,###.###相当于具有所需格式的%1$,.3f:它从输出String中删除尾随零。

,是分组分隔符,#代表缺席数字,.是小数分隔符。因此,#,###.###表示它会将1000000.190格式化为1,000,000.19并将1000.199格式化为1,000.199

答案 1 :(得分:1)

不是直接的答案,但是,你会考虑这个吗,

double[] numbers = {1000.123, 1000.12};
NumberFormat currencyFormatter = 
            NumberFormat.getInstance(Locale.US);
for(double d:numbers)
    System.out.format("%1$,.3f\n", d);
for(double d:numbers)
    System.out.println(currencyFormatter.format(d));

似乎可以胜任。

答案 2 :(得分:1)

要使代码与语言环境无关,应考虑使用返回系统中使用的小数分隔符分组分隔符的方法。在小数分隔符后只留下3位数的格式化后,调用方法replaceAll()来剪切尾随零:

DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());
char groupingSeparator = formatter.getDecimalFormatSymbols().getGroupingSeparator();
char decimalSeparator = formatter.getDecimalFormatSymbols().getDecimalSeparator();
String s = String.format("%1$"+ groupingSeparator + decimalSeparator + "3f" , floatYouWantToFormat).replaceAll("\\.?0*$", ""); // floatYouWantToFormat is, of course, float you want to format to meet your expectations