NumberFormat Java の奇妙な動作
-
20-09-2019 - |
質問
str という String 変数を解析する次のコードがあります。
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
str が数値ではない場合にスローされる例外を、検証するためにキャッチしたいと考えています。私が抱えている問題は、予期した ParseException が常にスローされるわけではないことです。文字列 str が数字で始まり、その後が文字である場合、文字列の最初の文字を取得し、それらを数字として解析するようです。
例えば:
- str="a10" の場合、ParseException がスローされます。
- str="10a" の場合、例外はスローされず、number=10 になります。
Double.parseDouble(str) は使用できません。str には 1,000.98 のようなカンマやポイントが含まれる可能性があり、この形式はこのメソッドでは理解されないためです。
なぜこうなった?他の方法で検証できますか?ありがとう
解決
行動は不思議ではないように設計として、それは
です番号を生成するために、指定された文字列の先頭からテキストを解析します。この方法は、与えられた文字列のテキスト全体を使用することはできません。
あなたがこのように位置を意識した解析方法を使用することができます:
public static double parse(String str) throws ParseException {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition position = new ParsePosition(0);
Number number = formatter.parse(str, position);
if (position.getIndex() != str.length()) {
throw new ParseException("failed to parse entire string: " + str, position.getIndex());
}
return number.doubleValue();
}
所属していません StackOverflow