-2

特定の数値をフォーマットするコードがあります。コードは、ユーザー プロファイルで設定されたロケールに基づいてフォーマットされます。ユーザーが 551$44 などの「壊れた」番号を入力すると、551 のみが返され、44 は忘れられます。$ を引き出して 55144 を表示する方法が必要です。

static double formatNumber(String number, Locale locale, char decimalSeparator) throws ParseException {
    double rtn = 0.0;
    if (decimalSeparator == ',') {
        if (number.indexOf(decimalSeparator) == -1) {
            rtn = NumberFormat.getNumberInstance(new Locale("en")).parse(number).doubleValue();
        } else {
            rtn = NumberFormat.getNumberInstance(locale).parse(number).doubleValue();
        }
    } else {
        if (number.indexOf(decimalSeparator) == -1) {
            rtn = NumberFormat.getNumberInstance(new Locale("fr")).parse(number).doubleValue();
        } else {
            rtn = NumberFormat.getNumberInstance(locale).parse(number).doubleValue();
        }
    }
    return rtn;
}

そのコードは、locale の decimalSeparator が何であるかを確認し、それをカンマと比較するフォーマッタです。次に、decimalSeparator のインデックスを確認してから、en を使用するようにロケールを変更します。複数の「壊れた」番号をチェックするテストを作成しましたが、「1.478,451,0」になると失敗します。これは、4510 を追加する代わりにカンマを抜いて停止するためです。

@Test
public void testFormatBrokenNumbersENCA() throws ParseException {
    Locale locale = new Locale("en_CA");
    Double[] parsedNumbers = { 0.0, 0.0, 0.0, 1.0, 1.0, 1.478451, 1.1,
            1.1, -1.0, -1.0, -1.0, 3.141592653589793, (double) 111555999 };
    String[] numbers = { "0     ", "0.,,,,,0", "0,,,,,0", "1,,", "1.m0",
            "1.478,451,0", "1.1.1", "1,1,1", "-1-", "-1.0-", "-1,0+-",
            "3.141592$65,35%89793", "111 555 999" };
    String[] failures = { "0     was passed in", "0.,,,,,0 was passed in",
            "0,,,,,0 was passed in", "1,, was passed in",
            "1.m0 was passed in", "1.478,451,0 was passed in",
            "1.1.1 was passed in", "1,1,1 was passed in",
            "-1- was passed in", "-1.0- was passed in",
            "-1,0-+ was passed in", "3.141592$65,35%89793 was passed in",
            "111 555 999 was passed in" };

    for (int i = 0; i < parsedNumbers.length; i++) {
        assertEquals(failures[i], parsedNumbers[i],
                Validation.getNumber(numbers[i], locale));
    }

}  

ユーザーが決定したロケールで解析し、ユーザーが何を入力してもすべての数値を保持する方法はありますか?

4

1 に答える 1

1

解析位置が最後まで到達したかどうかを確認できます。そうでない場合は、解析位置の文字を削除します。明示的なParsePositionで parse を使用する

for (;;) {
    ParsePosition pos = new ParsePosition(0);
    nf.parse(number, pos);
    if (pos.getErrorIndex() != -1) { // In fact for the exception catch.
        break;
    }
    int i = pos.getIndex();
    if (i == number.length()) { // Did all.
        break;
    }
    number = number.substring(0, i) + number.substring(i + 1);
}
于 2013-08-28T13:14:03.683 に答える