我有一个简单的EditText
,它允许用户输入一个数字,如45.60
(例如美元)。然后我用下面的方法格式化这个数字:某些货币字符串的NumberFormat.parse()失败
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.
如果我把我的电话英语/ UK,格式化这个"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
基本上包裹我张贴解析货币字符串,只不过它采用给定语言环境,而不是默认语言环境的代码。在上面的示例中,德国和法国区域设置的测试成功,但美国和英国区域设置失败。
我不会称之为'痛苦的业余'。这是一个常见的用例,尤其是在解析EditText的输入时。我也考虑直接在EditText(使用TextWatcher)上强制执行正确的(W /货币符号)格式,但是我最终使用这种解决方案对用户的干扰较小。谢谢。 – pkk 2013-12-04 09:08:14