7

重複の可能性:
数値を安全かつロケールに応じて解析する

ロケールに依存した方法で 10 進数を含む文字列を検証するにはどうすればよいですか? NumberFormat.parse では許容量が多すぎます。また、Double.parseDouble は英語のロケールでのみ機能します。これが私が試したものです:

public static void main(String[] args) throws ParseException {
    Locale.setDefault(Locale.GERMAN);

    NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());
    Number parsed = numberFormat.parse("4,5.6dfhf");
    System.out.println("parsed = " + parsed); // prints 4.5 instead of throwing ParseException

    double v = Double.parseDouble("3,3"); // throws NumberFormatException, although correct
}
4

2 に答える 2

2

に関しては

Number parsed = numberFormat.parse("4,5.6dfhf");

問題、おそらくNumberFormat.parse(String source, ParsePosition pos)を使用して、解析を停止した位置が実際に文字列の最後の位置であるかどうかを確認できます。

また、4.5.6 の問題では、 setGroupingUsed(boolean newValue)によってグループ化をオフに設定することができます。character は、ロケールのグループ化文字です。

それは次のようなものでなければなりません

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());
numberFormat.setGroupingUsed(false);
ParsePosition pos;
String nString = "4,5.6dfhf";

Number parsed = numberFormat.parse(nString, pos);
if (pos.getIndex() == nString.length()) // pos is set AFTER the last parsed position
   System.out.println("parsed = " + parsed);
else
   // Wrong
于 2013-01-07T11:33:54.163 に答える
1

上記のコメントから、次を使用できます。

String input = "3,3"; // or whatever you want
boolean isValid = input.matches("^\\d+([.,]\\d+)?$");
double value = Double.parseDouble(input.replaceAll(",", "."));

区切り記号がコンマ以外の何かである場合は、角かっこで追加します。

double value = Double.parseDouble(input.replaceAll("[,]", "."));
于 2013-01-07T11:30:08.860 に答える