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()