Was ist die effizienteste Methode, um eine Eingabezeichenfolge zu testen, ob sie einen numerischen Wert enthält (oder umgekehrt keine Zahl)? Ich denke, ich kann Double.Parse
oder einen regulären Ausdruck verwenden (siehe unten), aber ich habe mich gefragt, ob es dafür eine eingebaute Methode gibt, wie Javascript NaN()
oder IsNumeric()
(war das VB, an das ich mich nicht erinnern kann?).
public static bool IsNumeric(this string value)
{
return Regex.IsMatch(value, "^\\d+$");
}
Antworten:
Dies hat keinen Regex-Overhead
Im Übrigen unterstützen alle Standarddatentypen, mit Ausnahme der GUIDs, TryParse.
update
secretwep hat darauf hingewiesen, dass der Wert "2345" den obigen Test als Zahl besteht. Wenn Sie jedoch sicherstellen müssen, dass alle Zeichen in der Zeichenfolge Ziffern sind, sollten Sie einen anderen Ansatz wählen.
Beispiel 1 :
oder wenn du etwas ausgefallener sein willst
Update 2 (von @stackonfire, um mit null oder leeren Zeichenfolgen umzugehen)
quelle
Number
Objekt in Javascript ein Gleitkommawert oder eine Ganzzahl ist, sodass der Wechsel zu double.TryParse ein genaueres Äquivalent wäredouble
, aber viele würden sie als nicht numerisch betrachten.public Boolean IsNumber(String s) { Boolean value = true; if (s == String.Empty || s == null) { value=false; } else { foreach(Char c in s.ToCharArray()) { value = value && Char.IsDigit(c); } } return value; }
Ich bevorzuge so etwas, damit Sie entscheiden können, worauf Sie
NumberStyle
testen möchten .quelle
Zusätzlich zu den vorherigen korrekten Antworten ist wahrscheinlich darauf hinzuweisen, dass "Not a Number" (NaN) in seiner allgemeinen Verwendung nicht einer Zeichenfolge entspricht, die nicht als numerischer Wert ausgewertet werden kann. NaN wird normalerweise als numerischer Wert verstanden, der verwendet wird, um das Ergebnis einer "unmöglichen" Berechnung darzustellen - wobei das Ergebnis undefiniert ist. In dieser Hinsicht würde ich sagen, dass die Verwendung von Javascript leicht irreführend ist. In C # ist NaN als eine Eigenschaft des einfachen und doppelten numerischen Typs definiert und wird verwendet, um explizit auf das Ergebnis des Tauchens von Null zu Null zu verweisen. Andere Sprachen verwenden es, um andere "unmögliche" Werte darzustellen.
quelle
Ich weiß, dass dies auf viele verschiedene Arten beantwortet wurde, mit Erweiterungen und Lambda-Beispielen, aber eine Kombination aus beiden für die einfachste Lösung.
oder wenn Sie Visual Studio 2015 (C # 6.0 oder höher) verwenden
Geniales C # 6 in einer Zeile. Dies ist natürlich begrenzt, da nur numerische Zeichen geprüft werden.
Verwenden Sie zur Verwendung einfach eine Zeichenfolge und rufen Sie die Methode auf, z. B.:
quelle
Ja, IsNumeric ist VB. Normalerweise verwenden die Leute die TryParse () -Methode, obwohl sie etwas umständlich ist. Wie Sie vorgeschlagen haben, können Sie jederzeit Ihre eigenen schreiben.
quelle
Ich mag die Erweiterungsmethode, aber wenn möglich, mag ich es nicht, Ausnahmen auszulösen. Ich habe mich für eine Erweiterungsmethode entschieden, bei der das Beste aus 2 Antworten hier verwendet wird.
quelle
Sie können die Visual Basic-Funktion weiterhin in C # verwenden. Das einzige, was Sie tun müssen, ist einfach meinen Anweisungen unten zu folgen:
Dann importiert es in der Klasse wie unten dargestellt:
Verwenden von Microsoft.VisualBasic;
Verwenden Sie es als Nächstes , wie unten gezeigt:
Hoffe, das hilft und viel Glück!
quelle
VB hat die
IsNumeric
Funktion. Sie können darauf verweisenMicrosoft.VisualBasic.dll
und es verwenden.quelle
Einfache Erweiterung:
quelle
quelle
Vielleicht ist dies eine C # 3-Funktion, aber Sie könnten sie verwenden
double.NaN
.quelle
Wird
Double.NaN
in allen .NET-Versionen 2.0 und höher unterstützt.quelle
Ich habe Chris Livelys Snippet (ausgewählte Antwort) für ein oder zwei Jahre in einer Bool-Funktion wie Gishus Vorschlag verwendet. Ich habe es verwendet, um sicherzustellen, dass bestimmte Abfragezeichenfolgen nur numerisch sind, bevor ich mit der weiteren Verarbeitung fortfahre. Ich bekam einige fehlerhafte Querringe, die von der markierten Antwort nicht verarbeitet wurden, insbesondere dann, wenn nach einer Zahl wie "3645" ein Komma übergeben wurde (true zurückgegeben). Dies ist der resultierende Mod:
quelle
Double.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out myNum)
Ich habe eine etwas andere Version, die die Nummer zurückgibt. Ich würde vermuten, dass Sie in den meisten Fällen nach dem Testen der Zeichenfolge die Nummer verwenden möchten.
quelle
Dies ist eine modifizierte Version der von Herrn Siir vorgeschlagenen Lösung. Ich finde, dass das Hinzufügen einer Erweiterungsmethode die beste Lösung für die Wiederverwendung und Einfachheit der aufrufenden Methode ist.
Ich habe den Methodenkörper so geändert, dass er in zwei Zeilen passt, und die unnötige .ToString () - Implementierung entfernt. Für diejenigen, die mit Erweiterungsmethoden nicht vertraut sind, gilt Folgendes:
Erstellen Sie eine Klassendatei mit dem Namen ExtensionMethods . In diesen Code einfügen:
Ersetzen Sie YourNameSpaceHere durch Ihren tatsächlichen NameSpace. Änderungen speichern. Jetzt können Sie die Erweiterungsmethode überall in Ihrer App verwenden:
Hinweis: Diese Methode gibt true für Ganzzahlen und Dezimalstellen zurück, gibt jedoch false zurück, wenn die Zeichenfolge ein Komma enthält. Wenn Sie Eingaben mit Kommas oder Symbolen wie "$" akzeptieren möchten, würde ich empfehlen, zuerst eine Methode zu implementieren, um diese Zeichen zu entfernen, und dann zu testen, ob IsNumeric.
quelle