我尝试格式化最多3位数的浮点数,但避免尾随零。我使用这种格式字符串:
%1$,.3f
它正确地将数字1000.123
格式化为我所期望的:1.000,123
但是对于浮动1000.12
,我得到格式化结果1.000,120
,而我希望将结尾归零,从而产生1.000,12
。
我对格式化字符串的错误有所了解吗?
答案 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