当尝试解析不合格的数字(例如1.23
).
默认情况下,MonetaryAmountFormat
希望您提供货币名称(例如USD 1.23
):
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(Locale.US);
MonetaryAmount amount = format.parse("USD 1.23");
如果你设置CurrencyStyle.SYMBOL
,那么您可以按货币名称或符号进行解析(因此,USD 1.23
or $3.45
):
AmountFormatQuery formatQuery = AmountFormatQueryBuilder.of(Locale.US)
.set(CurrencyStyle.SYMBOL)
.build();
MonetaryAmountFormat format = MonetaryFormats.getAmountFormat(formatQuery);
MonetaryAmount amount1 = format.parse("USD 1.23");
MonetaryAmount amount2 = format.parse("$3.45");
这可能是您使用 JavaMoney 所能得到的最接近的结果。
如果您知道您只能从相同的货币获取数字,那么您最好在其他地方解析字符串(使用正则表达式或其他东西)并转换为一致的输入格式,因为(正如您发现的),您可以轻松获得NullPointerException
当 JavaMoney 不高兴时,没有任何解释。
至于可用的键,您可以查看以下常量org.javamoney.moneta.format.AmountFormatParams
: pattern
, groupingSizes
, groupingSeparators
.
设置格式时,需要注意的是,必须使用通用的货币符号 https://en.wikipedia.org/wiki/Currency_sign_%28typography%29: ¤
。例如,你可能会这样做.set("pattern", "¤#,##0.00")
.
最后,而不是直接使用FastMoney
来自 Moneta RI 的类,您可以直接从MonetaryAmountFormat
:
// rather than using Monata directly:
MonetaryAmount amount = FastMoney.parse(bidStr, format);
// use the API:
MonetaryAmount amount = format.parse(bidStr);