Java.text.MessageFormat:如何增加BigDecimal / Number的小数位精度

3

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

argument[0] = "USD", argument[1] = BigDecimal(0.0002), argument[2] = "shirt"

我期望格式化程序输出

"USD 0.0002 每 shirt"

但是格式化程序减少了精度并产生了

"USD 0 每 shirt"

看起来 MessageFormat 只考虑小数点后的3个数字。"BigDecimal(0.01)" 的效果符合预期。

那么有没有任何属性可以调整告诉 MessageFormat 使用特定的精度?对我来说,更改 pattern 不是一个选项。

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

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

private int    maximumFractionDigits = 3; 

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

1个回答

3
您可以在格式中使用类似 {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);
}

这应该打印出:每件衬衫0.0002美元

通过提前将对象转换为字符串,我不仅需要在许多地方更改代码,而且还会失去提供的默认数字格式。 - Arun Gowda
我明白了,我想你可以使用参数的类来应用格式,参见我的编辑答案。 - Guillaume
完美!正是我所寻找的。 - Arun Gowda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接