我正在尝试使用ICU4J的CompactDecimalFormat将“12345.67”等值格式化为“$ 12K”。我似乎无法看到如何在格式中包含货币:
CompactDecimalFormat cdFormat =
CompactDecimalFormat.getInstance(Locale.US, CompactStyle.SHORT);
Currency currency = Currency.getInstance(Locale.US);
CurrencyAmount amount = new CurrencyAmount(12345.67, currency);
System.out.println(cdFormat.format(amount));
这导致打印输出
12K
如何让它考虑货币和输出“$ 12K”(而其他区域设置+货币适当的紧凑值在其他区域和货币中)?
答案 0 :(得分:0)
您可以使用currency.getSymbol()。
答案 1 :(得分:0)
我发现为了打印货币前缀,我们可以使用NumberFormat:
NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.US);
Currency currency = Currency.getInstance(Locale.US);
CurrencyAmount amount = new CurrencyAmount(12345.67, currency);
System.out.println(numberFormat.format(amount));
打印$ 12,345.67。
但是,我们在这里放松了紧凑的格式。所以我别无选择,只能深入了解ICU4J的源代码(52.1)。调试之后,事实证明CompactDecimalFormat.java基于NumberFormat,但使用方法如下:
lig:145 DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(locale);
此外,还有一个注释的TODO代码块用于修复货币格式。因此,我得出结论,该库的最后一个版本不支持现成的紧凑货币格式。
我进一步推进,我尝试了一个简单的补丁到CompactDecimalFormat.java文件。我添加了以下方法:
public static CompactDecimalFormat getInstance(Locale locale, CompactStyle style, int formatNumberStyle) {
return new CompactDecimalFormat(ULocale.forLocale(locale), style,formatNumberStyle);
}
CompactDecimalFormat(ULocale locale, CompactStyle style,int numberFormatStyle) {
this.pluralRules = PluralRules.forLocale(locale);
DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(locale,numberFormatStyle);
CompactDecimalDataCache.Data data = getData(locale, style);
this.units = data.units;
this.divisor = data.divisors;
pluralToCurrencyAffixes = null;
finishInit(style, format.toPattern(), format.getDecimalFormatSymbols());
}
然后我按如下方式更改了您的代码:
CompactDecimalFormat cdFormat = CompactDecimalFormat.getInstance(
Locale.US, CompactStyle.SHORT,NumberFormat.CURRENCYSTYLE);
Currency currency = Currency.getInstance(Locale.US);
CurrencyAmount amount = new CurrencyAmount(12345.67, currency);
System.out.println(cdFormat.format(amount));
我终于可以看到预期的:$ 12K。
我希望这能解决你的问题。