我有一个简单的EditText
,它允许用户输入一个数字,例如45.60
(例如美元)。然后我使用以下方法格式化这个数字:
public String format() {
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
return formatter.format(amount.doubleValue());
}
在我的 Android 手机上,语言设置为英语(美国) - 因此Locale.getDefault()
应该返回美国语言环境(确实如此)。
现在编辑文本已正确更新为:($45.60
因此格式化输入的数字有效)。
但是,如果我尝试"$45.60"
使用以下方法解析上述字符串:
NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
Number result = numberFormat.parse("$45.60");
它失败了:
java.lang.IllegalArgumentException: Failed to parse amount $45.60 using locale en_US.
如果我将手机设置为英语/英国,则将其格式化"45.60"
为"£45.60"
正常工作(如美国),但解析"£45.60"
失败,就像上面的美国示例一样。
但是,如果我将手机设置为德语(德国),则格式化"45,60"
可以"45,60€"
正常工作,并且解析"45,60€"
也可以正常工作!
我看到这三种货币之间的唯一区别:欧元附加在金额上,而美元和英镑附加在金额前。
有谁知道,为什么相同的代码适用于欧元,但不适用于英镑和美元?我错过了什么吗?
我还创建了一个单元测试,以重现该问题:
public void testCreateStringBased() throws Exception {
// For German locale
CurrencyAmount amount = new CurrencyAmount("25,46€", Locale.GERMANY);
assertEquals(25.46, amount.getAsDouble());
// For French locale
amount = new CurrencyAmount("25,46€", Locale.FRANCE);
assertEquals(25.46, amount.getAsDouble());
// For US locale
amount = new CurrencyAmount("$25.46", Locale.US);
assertEquals(25.46, amount.getAsDouble());
// For UK locale
amount = new CurrencyAmount("£25.46", Locale.UK);
assertEquals(25.46, amount.getAsDouble());
}
CurrencyAmount
基本上包装了我发布的用于解析货币字符串的代码,除了它采用给定的语言环境而不是默认的语言环境。在上面的示例中,德国和法国语言环境的测试成功,但美国和英国语言环境的测试失败。