質問

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();
} 

他のヒント

見てみると、 API, 、はっきりとこう書いてあります。

特定の文字列の先頭からテキストを解析して、数値を作成します。メソッドは、指定された文字列のテキスト全体を使用することはできません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top