我使用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