CompactDecimalFormat可以以某种方式用于格式化货币值吗?

时间:2014-02-03 18:20:22

标签: java internationalization formatting icu

我正在尝试使用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”(而其他区域设置+货币适当的紧凑值在其他区域和货币中)?

2 个答案:

答案 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。

我希望这能解决你的问题。