JavaMoney:设置CurrencyStyle时不依赖moneta的编译时

时间:2018-06-22 13:57:53

标签: java java-money jsr354

我正在尝试创建一个使用货币单位符号的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 implemenation)。

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即可使用货币单位符号?

1 个答案:

答案 0 :(得分:0)

也许可以使用DecimalFormat代替MonetaryAmountFormat

缺点:

  • NumberMonetaryAmount之间的转换必须手动完成
  • 仅在您没有更改货币单位(单位是从格式而不是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()