我有一個簡單的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