Moneta バージョン 1.1で使用しているコード例を次に示します。
Locale LANG = Locale.CHINA; // also tried new Locale("pl", "PL");
final MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
AmountFormatQueryBuilder.of(LANG)
.set(CurrencyStyle.SYMBOL)
.set("pattern", "#,##0.00### ¤")
.build()
);
final String formatted = format.format(Money.of(new BigDecimal("1234.56"), Monetary.getCurrency(LANG)));
System.out.println(formatted);
System.out.println(format.parse(formatted).getNumber());
同じオブジェクトを前後に変換しているので、これは機能するはずです。私が何か間違っていて、コンバーターが $、€、または £ 以外の通貨に対して双方向ではない場合を除きます。
最後の行は次のようにクラッシュします。
Exception in thread "main" java.lang.IllegalArgumentException: Invalid error index > input.length
at javax.money.format.MonetaryParseException.<init>(MonetaryParseException.java:56)
at org.javamoney.moneta.internal.format.AmountNumberToken.parse(AmountNumberToken.java:140)
at org.javamoney.moneta.internal.format.DefaultMonetaryAmountFormat.parse(DefaultMonetaryAmountFormat.java:190)
at test.main(test.java:27)
これは、指定されたロケールが $、€、または £ のいずれにも関連付けられていない場合に発生します。たとえば、このコードは に対しては機能しますが、 に対してだけLocale.US
でなく に対してもクラッシュLocale.CHINA
しnew Locale("pl", "PL")
ます。したがって、これはカスタム定義の問題だけでなくLocale
、静的に事前定義されたものの問題でもあります。
内部パッケージを少し掘り下げたところorg.javamoney.moneta.internal.format.CurrencyToken.parse(CurrencyToken.java:196)
、次のような が見つかりました。
case SYMBOL:
if (token.startsWith("$")) {
cur = Monetary.getCurrency("USD");
context.consume("$");
} else if (token.startsWith("€")) {
cur = Monetary.getCurrency("EUR");
context.consume("€");
} else if (token.startsWith("£")) {
cur = Monetary.getCurrency("GBP");
context.consume("£");
} else {
cur = Monetary.getCurrency(token);
context.consume(token);
}
context.setParsedCurrency(cur);
break;
上記のコードを $、€、または £ 以外の通貨で機能させる方法はありますか?
Locale.CANADA を提供するなど、さらにいくつかのことを試しましたが、$ も通貨記号として使用されているため、失敗せずに実行されますが、間違ったデータが返されます
Locale LANG = Locale.CANADA;
final MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(
AmountFormatQueryBuilder.of(LANG)
.set(CurrencyStyle.SYMBOL)
.set("pattern", "#,##0.00### ¤")
.build()
);
final String formatted = format.format(Money.of(new BigDecimal("1234.56"), Monetary.getCurrency(LANG)));
System.out.println(formatted);
System.out.println(format.parse(formatted).getCurrency().getCurrencyCode());
この if-else が $ に対して行うことUSD
の代わりに、最終行が返されます。CAD
また、シンボルと通貨が1対1のマッピングであると誤って想定していると思います。