java.text.messageformat提高bigdecimal/number的小数位数精度

xmjla07d  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(585)

我正在使用 java.text.MessageFormat 替换显示单位价格的模板中的占位符。下面是一段代码。

public String format(Object[] arguments, String pattern) {
    MessageFormat formatter = new MessageFormat("");
    formatter.applyPattern(pattern);
    return formatter.format(arguments);
}
``` `pattern` 是
{0}{1}每{2}
以及 `arguments` 是
参数[0]=“usd”,参数[1]=bigdecimal(0.0002),参数[2]=“shirt”
我希望格式化程序输出
“每件衬衫0.0002美元”
但是格式化程序正在降低精度并产生
“每件衬衫0美元”
看起来像 `MessageFormat` “只考虑小数点后的3位数。”bigdecimal(0.01)”按预期工作。
那么,有什么属性我可以调整来告诉 `MessageFormat` 它应该使用一定的精度?更改 `pattern` 不是我的选择。
我可以把论点转换成 `String` 从 `BigDecimal` 格式化前。但那将是我最后的选择。
编辑:小数点后3位的限制来自 `NumberFormat` .

private int maximumFractionDigits = 3;

有没有方法可以更改此值并使messageformat使用此值?
8wigbo56

8wigbo561#

可以使用以下格式 {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

相关问题