Ich suche nach einer Methode, die einen booleschen Wert zurückgibt, wenn der übergebene String eine gültige Zahl ist (z. B. "123.55e-9", "-333.556"). Ich will nicht nur tun:
%Vor%Offensichtlich sollte die Funktion eine Zustandsmaschine (DFA) verwenden, um die Zeichenfolge zu analysieren, um sicherzustellen, dass ungültige Beispiele sie nicht täuschen (z.B. "-21,22.22.2", "33-2"). Weißt du, ob eine solche Bibliothek existiert? Ich möchte es nicht wirklich selbst schreiben, da es so ein offensichtliches Problem ist, dass ich sicher bin, dass ich das Rad neu erfinden werde.
Danke,
Nick
Ich würde es vermeiden, diese Methode neu zu erfinden und mit Apache Commons zu gehen. Wenn Sie Spring, Struts oder viele andere häufig verwendete Java-Bibliotheken verwenden, enthalten sie oft Apache-Commons. Sie werden die commons-lang.jar Datei wollen. Hier ist die Methode in NumberUtils möchten Sie:
%Vor%Hier ist eine regexp-basierte Utility-Funktion in Ordnung (die nicht in die "regexp" passt, während sie lesbar bleibt):
%Vor%Ja, ein regulärer Ausdruck sollte den Trick machen. Ich kenne nur .Net Regexp, aber alle Regex-Sprachen sind ziemlich ähnlich, so dass Sie beginnen sollten. Ich habe es nicht getestet, daher solltest du es vielleicht ein wenig mit der Java-Regex-Klasse umgehen.
%Vor% Einige der Regex-Steuersyntax:
? - Optionales Element
| - ODER-Operator Grundsätzlich erlaubte ich Zahlen mit oder ohne Kommas, wenn sie richtig formatiert waren.
[] - Menge erlaubter Zeichen
{,} - Minimales Maximum von Element
* - Beliebige Anzahl von Elementen, 0 bis unendlich |
+ - Mindestens ein Element, 1 bis unendlich
\ - Escape Charakter
. - Irgendein Charakter (Deshalb warum es entkam)
Der exakte reguläre Ausdruck wird in den Javadocs für Double.valueOf(String)
.
Um zu vermeiden, dass diese Methode für eine ungültige Zeichenfolge aufgerufen wird und ein
%Vor%NumberFormatException
ausgelöst wird, kann der folgende reguläre Ausdruck verwendet werden, um die Eingabezeichenfolge zu überprüfen:
Tags und Links java format numbers state-machines bigdecimal