1

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] = "美元",参数 [1] = BigDecimal(0.0002),参数 [2] = "衬衫"

我希望格式化程序输出

“每件衬衫 0.0002 美元”

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

“每件衬衫 0 美元”

看起来MessageFormat只考虑小数点后 3 位数字。“BigDecimal(0.01)”按预期工作。

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

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

编辑: 3 个小数点的限制来自NumberFormat.

private int    maximumFractionDigits = 3; 

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

4

1 回答 1

1

您可以使用诸如{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

于 2020-12-08T07:24:30.443 回答