6

str という文字列変数を解析する次のコードがあります。

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 のようなコンマとポイントを含めることができ、この形式はこのメソッドでは認識されないためです。

なぜこうなった?他の方法で検証できますか?ありがとう

4

2 に答える 2

6

APIを見ると、次のように明確に示されています。

指定された文字列の先頭からテキストを解析して数値を生成します。メソッドは、指定された文字列のテキスト全体を使用しない場合があります。

パーサーがどこまで解析したかを確認したい場合は、他の位置認識方法を使用できます。このようにして、末尾の文字があるかどうかを確認できます。たとえば、一般的な言語isAlphaを使用して、英数字の文字列全体をチェックすることもできます。

于 2010-02-15T13:03:57.923 に答える
6

動作はおかしくありません、設計どおりです

指定された文字列の先頭からテキストを解析して数値を生成します。メソッドは、指定された文字列のテキスト全体を使用しない場合があります。

次のような位置認識型の解析方法を使用できます。

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();
} 
于 2010-02-15T13:05:17.913 に答える