Wenn ich diese Saiten habe:
-
"abc"
=false
-
"123"
=true
-
"ab2"
=false
Gibt es einen Befehl, wie IsNumeric()
oder etwas anderes, das erkennen kann, ob eine Zeichenkette eine gültige Zahl ist?
Wenn ich diese Saiten habe:
"abc"
= false
"123"
= true
"ab2"
= false
Gibt es einen Befehl, wie IsNumeric()
oder etwas anderes, das erkennen kann, ob eine Zeichenkette eine gültige Zahl ist?
Ich schätze, diese Antwort wird zwischen all den anderen untergehen, aber wie auch immer, hier ist sie.
Ich bin über Google auf diese Frage gestoßen, weil ich prüfen wollte, ob ein string
war numeric
so dass ich einfach double.Parse("123")
anstelle der TryParse()
Methode.
Warum? Weil es ärgerlich ist, eine out
und prüfen Sie das Ergebnis von TryParse()
bevor Sie wissen, ob das Parsen fehlgeschlagen ist oder nicht. Ich möchte die ternary operator
um zu prüfen, ob die string
es numerical
und analysieren ihn dann einfach im ersten ternären Ausdruck oder geben einen Standardwert im zweiten ternären Ausdruck an.
Zum Beispiel so:
var doubleValue = IsNumeric(numberAsString) ? double.Parse(numberAsString) : 0;
Es ist einfach viel sauberer als:
var doubleValue = 0;
if (double.TryParse(numberAsString, out doubleValue)) {
//whatever you want to do with doubleValue
}
Ich habe ein paar extension methods
für diese Fälle:
public static bool IsParseableAs<TInput>(this string value) {
var type = typeof(TInput);
var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
new[] { typeof(string), type.MakeByRefType() }, null);
if (tryParseMethod == null) return false;
var arguments = new[] { value, Activator.CreateInstance(type) };
return (bool) tryParseMethod.Invoke(null, arguments);
}
Beispiel:
"123".IsParseableAs<double>() ? double.Parse(sNumber) : 0;
Denn IsParseableAs()
versucht, die Zeichenkette als den entsprechenden Typ zu parsen, anstatt nur zu prüfen, ob die Zeichenkette "numerisch" ist, sollte es ziemlich sicher sein. Und Sie können es sogar für nicht numerische Typen verwenden, die eine TryParse()
Methode, wie DateTime
.
Die Methode verwendet Reflexion und Sie rufen am Ende die TryParse()
Methode zweimal, was natürlich nicht so effizient ist, aber nicht alles muss vollständig optimiert werden, manchmal ist der Komfort einfach wichtiger.
Diese Methode kann auch verwendet werden, um eine Liste numerischer Zeichenketten einfach in eine Liste von double
oder einen anderen Typ mit einem Standardwert zu verwenden, ohne Ausnahmen abfangen zu müssen:
var sNumbers = new[] {"10", "20", "30"};
var dValues = sNumbers.Select(s => s.IsParseableAs<double>() ? double.Parse(s) : 0);
public static TOutput ParseAs<TOutput>(this string value, TOutput defaultValue) {
var type = typeof(TOutput);
var tryParseMethod = type.GetMethod("TryParse", BindingFlags.Static | BindingFlags.Public, Type.DefaultBinder,
new[] { typeof(string), type.MakeByRefType() }, null);
if (tryParseMethod == null) return defaultValue;
var arguments = new object[] { value, null };
return ((bool) tryParseMethod.Invoke(null, arguments)) ? (TOutput) arguments[1] : defaultValue;
}
Diese Erweiterungsmethode ermöglicht das Parsen einer string
wie jede type
die eine TryParse()
Methode und ermöglicht es Ihnen auch, einen Standardwert anzugeben, der zurückgegeben wird, wenn die Konvertierung fehlschlägt.
Dies ist besser als die Verwendung des ternären Operators mit der obigen Erweiterungsmethode, da die Umwandlung nur einmal durchgeführt wird. Es verwendet immer noch Reflexion obwohl...
Ejemplos:
"123".ParseAs<int>(10);
"abc".ParseAs<int>(25);
"123,78".ParseAs<double>(10);
"abc".ParseAs<double>(107.4);
"2014-10-28".ParseAs<DateTime>(DateTime.MinValue);
"monday".ParseAs<DateTime>(DateTime.MinValue);
Ausgänge:
123
25
123,78
107,4
28.10.2014 00:00:00
01.01.0001 00:00:00
Wenn Sie prüfen wollen, ob eine Zeichenkette eine Zahl ist (ich gehe davon aus, dass es eine Zeichenkette ist, denn wenn es eine Zahl ist, dann wissen Sie, dass es eine ist).
könnten Sie auch tun:
public static bool IsNumber(this string aNumber)
{
BigInteger temp_big_int;
var is_number = BigInteger.TryParse(aNumber, out temp_big_int);
return is_number;
}
Damit werden die üblichen Ungeziefer beseitigt:
BigInteger.Parse("3.3")
löst eine Ausnahme aus, und TryParse
für dasselbe wird false zurückgegeben)Double.TryParse
Sie müssen einen Verweis hinzufügen auf System.Numerics
und haben using System.Numerics;
an der Spitze Ihrer Klasse (nun, das zweite ist ein Bonus, denke ich :)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.