JavaMoney: установить CurrencyStyle без зависимости времени компиляции от монет

Я пытаюсь создать MonetaryAmountFormat который использует символ денежной единицы:

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

(Взятый из Как отформатировать MonetaryAmount с символом валюты? И Настройка MonetaryAmountFormat с использованием реализации JSR354 Moneta (JavaMoney)).

Проект java/maven зависит от moneta во время выполнения (не во время компиляции). Кажется, что класс CurrencyStyle и его ценность SYMBOL являются частью moneta, эталонной реализации java-money, а не частью API java-money. Таким образом, код не компилируется.

Я создал этот уродливый обходной путь:

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 что использует символ денежной единицы без этого хака?

1 ответ

Может быть, используя 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()
Другие вопросы по тегам