2010-02-15 10 views
6

Ich habe den folgenden Code, um eine String-Variable namens str zu analysieren.Seltsames Verhalten von NumberFormat Java

Ich möchte die Exception abfangen, die geworfen wird, wenn str keine Zahl ist, nur um sie zu bestätigen. Das Problem, das ich habe, ist, dass es nicht immer die erwartete ParseException wirft. Wenn die String-Zeichenfolge mit einer Zahl beginnt, dann aber Zeichen enthält, scheint sie 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) weil str kann Kommas und Punkte wie 1.000.98 haben und dieses Format wird von dieser Methode nicht verstanden.

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

+1

Ich meine nicht, dass das Verhalten von Number falsch war, aber ich hatte das API falsch verstanden. Ich dachte, Position sollte angeben, bis zu welchem ​​Charakter ich den String analysieren wollte. Jetzt verstehe ich, warum es so entworfen wurde. Danke für all deine Antworten. – Javi

Antwort

6

Das Verhalten ist nicht seltsam, es ist so entworfen

Analysiert Text von Anfang an der Zeichenkette eine Zahl zu erzeugen. Die Methode kann nicht den gesamten Text der angegebenen Zeichenfolge verwenden.

Sie können die Position-aware-Parsing-Methode wie folgt verwenden:

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

Nützlich für mich: Verwenden Sie 'setParseIntegerOnly (true)', um eine Ausnahme zu werfen, wenn Sie ein Float beim Erwarten einer Ganzzahl finden – xdola

6

Wenn man sich die API aussieht, ist es klar sagt:

Analysiert Text von Anfang an der Zeichenkette eine Zahl zu erzeugen. Die Methode kann nicht den gesamten Text der angegebenen Zeichenfolge verwenden.

Wenn Sie sehen möchten, wie weit der Parser geparst hat, können Sie die other position-aware method verwenden. Auf diese Weise können Sie prüfen, ob Sie nachgestellte Zeichen haben. Sie könnten auch die ganze Zeichenfolge nach alphanumerischen Zeichen durchsuchen, indem Sie zum Beispiel common langs isAlpha verwenden.

+0

Sorry sfussenegger, habe deinen Beitrag nicht gesehen, bevor ich mit der positionsbewussten Methode aktualisiert habe. –

+0

@disown am wahrscheinlichsten, weil Sie schneller waren als ich;) – sfussenegger