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€"
も正しく機能します!
これら 3 つの通貨の唯一の違いは、ユーロが金額に追加され、ドルとポンドが金額の前に追加されることです。
同じコードがユーロでは機能するのに、ポンドとドルでは機能しない理由を知っている人はいますか? 何か不足していますか?
問題を再現するために、単体テストも作成しました。
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
基本的に、通貨文字列を解析するために投稿したコードをラップしますが、デフォルトのロケールの代わりに特定のロケールを使用する点が異なります。上記の例では、テストは GERMANY および FRANCE ロケールでは成功しますが、US および UK ロケールでは失敗します。