如何使用java.text.MessageFormat格式化小数百分比

Lor*_*rin 35 java text localization

我的百分比被默认的java.text.MessageFormat函数截断,如何格式化百分比而不会丢失精度?

例:

String expectedResult = "12.5%";
double fraction = 0.125;

String actualResult = MessageFormat.format("{0,number,percent}", fraction);
assert expectedResult.equals(actualResult) : actualResult +" should be formatted as "+expectedResult;
Run Code Online (Sandbox Code Playgroud)

dav*_* a. 52

看起来像这样:

String actualResult = MessageFormat.format("{0,number,#.##%}", fraction);
Run Code Online (Sandbox Code Playgroud)

... 工作中.

编辑:要查看#和%的解释,请参阅java.text.DecimalFormat的javadoc.

编辑2:是的,国际化是安全的.格式字符串中的点被解释为小数点分隔符,而不是硬编码点.:-)


Che*_*hei 52

我认为正确的方法如下:

NumberFormat percentFormat = NumberFormat.getPercentInstance();
percentFormat.setMaximumFractionDigits(1);
String result = percentFormat.format(0.125);
Run Code Online (Sandbox Code Playgroud)

它还考虑了内部化.例如,在我的匈牙利语语言环境的机器上,我得到了"12,5%".初始化percentFormat NumberFormat.getPercentInstance(Locale.US)当然会给出"12.5%".


Ste*_* B. 6

怎么样

DecimalFormat f = new DecimalFormat( "###.#" );
System.out.println( f.format( 12.5 ) );
Run Code Online (Sandbox Code Playgroud)

char'#'格式不打印0表示不存在.所以12.5 - >"12.5",12.0 - >"12",而不是"12.0".您当然可以使用例如"###,###.##"来设置格式化程序,只有在您需要精度时才会显示hundreths位置.