簡體   English   中英

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} 每 {2}

arguments

參數 [0] = "美元",參數 [1] = BigDecimal(0.0002),參數 [2] = "襯衫"

我希望格式化程序為 output

“每件襯衫 0.0002 美元”

但是格式化程序正在降低精度並產生

“每件襯衫 0 美元”

看起來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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM