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