![](/img/trans.png)
[英]java.text.MessageFormat without grouping separators for numbers
[英]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.