java.text.MessageFormat增加了BigDecimal/Number的小数位数精度



我使用java.text.MessageFormat来替换显示单位价格的模板中的占位符。以下是执行此操作的代码。

public String format(Object[] arguments, String pattern) {
MessageFormat formatter = new MessageFormat("");
formatter.applyPattern(pattern);
return formatter.format(arguments);
}

pattern

每个{2}{0}{1}

arguments

参数[0]=";美元";,argument[1]=BigDecimal(0.0002(,argument[2]=";衬衫";

我希望格式化程序输出

"每件衬衫0.0002美元";

但格式化程序正在降低精度并产生

"每件衬衫0美元";

看起来MessageFormat只考虑小数点后的3位数字"BigDecimal(0.01(";如预期工作。

那么,有什么属性我可以调整来告诉MessageFormat它应该使用一定的精度吗?更改pattern不是我的选择。

在格式化之前,我可以将参数从BigDecimal转换为String。但这将是我最后的选择。

编辑:小数点后3位的限制来自NumberFormat

private int    maximumFractionDigits = 3; 

有没有办法改变这个值,让MessageFormat使用这个?

您可以在模式中使用{0,number,#.##}等格式。如果您感兴趣,MessageFormat的Javadoc会提供更多详细信息。

由于您无法更改模式,因此通过将对象转换为字符串将是唯一的解决方案

编辑:实际上我没有意识到可以通过编程设置格式:

public static void main(String[] args) {
Object[] argument = new Object[3];
argument[0] = "USD";
argument[1] = new BigDecimal(0.0002);
argument[2] = "shirt";
System.out.println(format(argument, "{0} {1} per {2}"));
}
public static String format(Object[] arguments, String pattern) {
MessageFormat formatter = new MessageFormat(pattern);
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(7);
for (int i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof BigDecimal) {
formatter.setFormat(i, nf);
}
}
return formatter.format(arguments);
}

应打印:USD 0.0002 per shirt

最新更新