3

java.text.NumberFormat通貨記号を持つ文字列通貨を解析するために使用しています。一部のケースでは機能していますが、他のケースでは失敗しています。

NumberFormat.getCurrencyInstance(Locale.FRANCE).parse("1 599,99 €"); //fails
NumberFormat.getCurrencyInstance(Locale.FRANCE).parse("599,99 €"); //works fine

誰かが最初のケースでなぜそれが機能しないのか説明してもらえますか? Joda-Money は、そのようなタイプの解析に適したライブラリですか?

4

2 に答える 2

3

これがうまくいかない理由は、無効な空白文字の使用です。

書式クラスでは、コード 160 ウィッチの文字が「改行なしスペース」として記述されることを想定しています。コード 30 ウィッチを渡すことができる場合は「スペース」です。

このコードを実行して確認できます。

NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.FRANCE);

String france = "1 599,99 €";
String format = currencyInstance.format(1599.99);
Number number = currencyInstance.parse(format);


System.out.println("France: " + format);
System.out.println("Format: " + format);
System.out.println("Number: " + number);

if(france.equals(format)) {
    number = currencyInstance.parse(france); // Must work;
    System.out.println(number);
} else {

    char[] fr = france.toCharArray();
    char[] ft = format.toCharArray();

    for(int i = 0; i < fr.length; i++) {
        if(fr[i] != ft[i]) {
            System.out.printf("The value on position %d are not equal. France: %d; Format: %d", i,(int)fr[i], (int)ft[i]);
        }
    }

}

次に、環境の詳細:

 java version "1.7.0_17"
 Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
 Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
 OS: Windows 7 64-bits. 

アスキーテーブル

ノート:

@Black Panterが追加したように、これは既知のバグです

JDK-4510618 : [Fmt-Nu] フランス語の 3 桁ごとの区切り記号は改行スペースではない

回避策

(1) 解析する文字列内のユーザーのグループ区切り文字 (つまり、U+0020) を削除します。

(2) すべてのスペースを削除するのが不便な場合は、ユーザーのグループ化セパレータをフォーマッタのグループ化セパレータ (U+00A0) に置き換えます。

于 2013-10-21T08:15:56.620 に答える