1

我正在尝试创建一个MonetaryAmountFormat使用货币单位符号的:

MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
  AmountFormatQueryBuilder.of(Locale.GERMANY)
                          .set(org.javamoney.moneta.format.CurrencyStyle.SYMBOL)
                          .set("pattern", "#,##0.##¤")
                          .build()
);

(取自How to format MonetaryAmount with currency symbol?Customizing a MonetaryAmountFormat using the Moneta (JavaMoney) JSR354 implementation)。

java/maven 项目在运行时(不是编译时)范围内依赖于 moneta。似乎该类CurrencyStyle及其值SYMBOL是 moneta(java-money 参考实现)的一部分,而不是 java-money API 的一部分。因此,代码无法编译。

我创建了这个丑陋的解决方法:

String currencyStyle = "org.javamoney.moneta.format.CurrencyStyle";
final Enum<?> SYMBOL = Enum.valueOf((Class<? extends Enum>) Class.forName(currencyStyle), "SYMBOL");
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
  AmountFormatQueryBuilder.of(Locale.GERMANY)
                          .set(currencyStyle, SYMBOL)
                          .set("pattern", "#,##0.##¤")
                          .build()
);

是否可以创建一个MonetaryAmountFormat使用货币单位符号而无需此 hack?

4

1 回答 1

0

也许使用DecimalFormat作为替代MonetaryAmountFormat是一种选择。

缺点:

  • Number和之间的转换MonetaryAmount必须手动完成
  • 仅当您没有更改货币单位时才有效(单位取自格式,而不是来自MonetaryAmount对象)

例子:

NumberFormat format = new DecimalFormat("#,##0.##¤", DecimalFormatSymbols.getInstance(Locale.GERMANY));

// format
MonetaryAmount source = ...;
String formattedAmount = format.format(source.getNumber());

// parse
Number numberAmount = format.parse(formattedAmount);
MonetaryAmount target = Monetary.getDefaultAmountFactory().setCurrency("EUR").setNumber(numberAmount).create()
于 2018-06-24T06:37:42.047 回答