Frage

Ich habe den folgenden Code, um ein String-Variable zu analysieren namens str.

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);

Ich mag die Exception geworfen fangen, wenn str nicht eine Zahl ist, nur um es zu bestätigen. Das Problem, das ich habe ist, dass es does 't immer die ParseException wirft erwartet. Wenn die String str beginnt mit einer Zahl aber dann Zeichen sind, scheint es sich um eine die ersten Zeichen der Zeichenfolge zu erhalten und sie als Zahl zu analysieren.

Zum Beispiel:

  • , wenn str = "a10" dann ausgelöst wird, ein ParseException
  • , wenn str = "10a" dann keine Ausnahme ausgelöst und Zahl = 10

Ich kann nicht verwenden Double.parseDouble (str), da str Kommas und Punkte wie 1,000.98 und dieses Format verstanden wird durch dieses Verfahren nicht haben kann.

Warum ist das passiert? Kann ich es auf andere Weise zu validieren? Dank

War es hilfreich?

Lösung

Das Verhalten nicht fremd ist, ist es so konzipiert

  

Analysiert Text von Anfang an der Zeichenkette eine Zahl zu erzeugen. Das Verfahren kann nicht den gesamten Text der gegebenen Zeichenkette verwenden.

Sie können verwenden, um die Position-aware Analyseverfahren wie folgt aus:

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

Andere Tipps

Wenn man sich die API , es klar sagt:

  

Analysiert Text von Anfang an von der   Zeichenkette eine Zahl zu erzeugen. Das   Verfahren kann nicht den gesamten Text verwenden   die angegebene Zeichenfolge zurück.

Wenn Sie sehen wollen, wie weit der Parser analysiert, können Sie die andere positionssichere Methode . Auf diese Weise können Sie überprüfen, ob Sie irgendwelche Hinter Zeichen haben. Sie können auch die gesamte Zeichenfolge für beispielsweise gemeinsamen langs mit alphanumerischen Zeichen überprüfen isalpha .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top