【发布时间】:2013-03-13 05:45:13
【问题描述】:
我有一个简单的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 基本上包装了我发布的用于解析货币字符串的代码,只是它采用给定的语言环境而不是默认的语言环境。在上面的示例中,德国和法国地区的测试成功,但美国和英国地区的测试失败。
【问题讨论】:
标签: java android currency numberformatexception