java.text.MessageFormat 提高 BigDecimal / Number 的小数位精度
java.text.MessageFormat increase decimal places precision for BigDecimal / Number
我正在使用 java.text.MessageFormat
替换显示单价的模板中的占位符。以下是执行此操作的代码。
public String format(Object[] arguments, String pattern) {
MessageFormat formatter = new MessageFormat("");
formatter.applyPattern(pattern);
return formatter.format(arguments);
}
pattern
是
{0} {1} per {2}
和arguments
是
argument[0] = "USD", argument[1] = BigDecimal(0.0002), argument[2] = "shirt"
我希望格式化程序能够输出
"USD 0.0002 per shirt"
但格式化程序正在降低精度并生成
"USD 0 per shirt"
看起来 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
我正在使用 java.text.MessageFormat
替换显示单价的模板中的占位符。以下是执行此操作的代码。
public String format(Object[] arguments, String pattern) {
MessageFormat formatter = new MessageFormat("");
formatter.applyPattern(pattern);
return formatter.format(arguments);
}
pattern
是
{0} {1} per {2}
和arguments
是
argument[0] = "USD", argument[1] = BigDecimal(0.0002), argument[2] = "shirt"
我希望格式化程序能够输出
"USD 0.0002 per shirt"
但格式化程序正在降低精度并生成
"USD 0 per shirt"
看起来 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