Gibt es einen besseren, eleganteren (und / oder möglicherweise schnelleren) Weg als
? %Vor%...?
Bearbeiten : Da ich keine zwei Antworten wählen kann, gehe ich mit dem Regex One, weil a) es elegant ist und b) "Jon Skeet löste das Problem" ist eine Tautologie, weil Jon Skeet selbst die Lösung für alle Probleme ist.
Ich glaube nicht, dass irgendetwas in Java eingebaut ist, um es schneller und immer noch zuverlässig zu machen, vorausgesetzt, dass Sie es später mit Double.valueOf (oder ähnlich) parsen wollen.
Ich würde Double.parseDouble anstelle von Double.valueOf verwenden, um zu vermeiden, dass ein Double unnötigerweise erstellt wird, und können Sie auch unverhohlen dumme Zahlen schneller als die Ausnahme loswerden, indem Sie nach Ziffern suchen, z / E, - und. vorher. So etwas wie:
%Vor%Beachten Sie, dass noch trotz einiger Versuche nicht "NaN" oder hex Werte abdeckt. Ob Sie diese weitergeben möchten oder nicht, hängt vom Kontext ab.
Nach meiner Erfahrung sind reguläre Ausdrücke langsamer als die oben beschriebene fest codierte Überprüfung.
Sie könnten eine Regex verwenden, d. h. so etwas wie String.matches("^[\d\-\.]+$");
(wenn Sie nicht auf negative Zahlen oder Fließkommazahlen testen, können Sie ein wenig vereinfachen).
Nicht sicher, ob das schneller wäre als die Methode, die Sie jedoch beschrieben haben.
Edit: Im Lichte all dieser Kontroversen habe ich beschlossen, einen Test zu machen und einige Daten darüber zu bekommen, wie schnell jede dieser Methoden war. Nicht so sehr die Richtigkeit, sondern wie schnell sie gelaufen sind.
Sie können über meine Ergebnisse in meinem Blog lesen. (Tipp: Jon Skeet FTW).
Die richtige Regex wird tatsächlich in der Doppelte Javadocs :
%Vor%Um zu vermeiden, dass diese Methode für eine ungültige Zeichenfolge aufgerufen wird und eine NumberFormatException ausgelöst wird, kann der folgende reguläre Ausdruck verwendet werden, um die Eingabezeichenfolge zu überprüfen:
Dies erlaubt jedoch keine lokalisierten Darstellungen:
Um lokalisierte Zeichenfolgendarstellungen eines Gleitkommawerts zu interpretieren, verwenden Sie Unterklassen von NumberFormat .
Ich würde die Jakarta commons-lang , wie immer! Aber ich habe keine Ahnung, ob ihre Implementierung ist schnell oder nicht. Es verlässt sich nicht auf Ausnahmen, was eine gute Leistung sein kann ...
Die meisten dieser Antworten sind etwas akzeptable Lösungen. Bei allen Regex-Lösungen ist nicht korrekt für alle Fälle, die Sie interessieren könnten.
Wenn Sie wirklich sicherstellen wollen, dass der String eine gültige Nummer ist, würde ich Ihre eigene Lösung verwenden. Vergessen Sie nicht, dass die Zeichenfolge die meiste Zeit eine gültige Nummer ist und keine Ausnahme auslöst. Daher ist die Leistung meistens identisch mit der von Double.valueOf ().
Ich denke, das ist wirklich keine Antwort, außer dass es deinen anfänglichen Instinkt bestätigt.
Randy
Nach Phills Antwort kann ich einen anderen Regex vorschlagen?
%Vor%Ich bevorzuge eine Schleife über die Darstellung char [] der Zeichenfolgen und die Methode Character.isDigit (). Wenn Eleganz gewünscht wird, denke ich, das ist das lesbarste :
%Vor%}
Wenn Sie etwas, das blitzartig schnell ist, und Sie haben eine sehr klare Vorstellung davon, welche Formate Sie akzeptieren möchten, können Sie eine Zustandsmaschine erstellen DFA von Hand. Dies ist im Wesentlichen, wie Regexes sowieso unter der Haube arbeiten, aber Sie können den Regex-Kompilierungsschritt auf diese Weise vermeiden, und es kann durchaus schneller als ein generischer Regex-Compiler sein.