941 Stimmen

Erkennen, ob eine Zeichenkette eine Zahl ist

Wenn ich diese Saiten habe:

  1. "abc" = false

  2. "123" = true

  3. "ab2" = false

Gibt es einen Befehl, wie IsNumeric() oder etwas anderes, das erkennen kann, ob eine Zeichenkette eine gültige Zahl ist?

11voto

Gabriel Florit Punkte 2884

Wenn Sie wissen wollen, ob eine Zeichenkette eine Zahl ist, können Sie versuchen, sie zu parsen:

var numberString = "123";
int number;

int.TryParse(numberString , out number);

Beachten Sie, dass TryParse gibt eine bool die Sie verwenden können, um zu überprüfen, ob das Parsing erfolgreich war.

11voto

Craig Punkte 10896

Sie können TryParse verwenden, um festzustellen, ob die Zeichenkette in eine Ganzzahl geparst werden kann.

int i;
bool bNum = int.TryParse(str, out i);

Der Boolesche Wert sagt Ihnen, ob es funktioniert hat oder nicht.

11voto

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:


Verlängerungsmethode eins

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);

Erweiterungsmethode zwei

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

9voto

Noctis Punkte 11165

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).

  • Ohne Regex und
  • den Code von Microsoft so weit wie möglich zu verwenden

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:

  • Minus (-) oder Plus (+) am Anfang
  • enthält Dezimalzeichen BigInteger verarbeitet keine Zahlen mit Dezimalpunkten. (Also: BigInteger.Parse("3.3") löst eine Ausnahme aus, und TryParse für dasselbe wird false zurückgegeben)
  • keine lustigen Nicht-Ziffern
  • deckt Fälle ab, in denen die Zahl größer ist als die übliche Verwendung von 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 :)

8voto

Double.TryParse

bool Double.TryParse(string s, out double result)

CodeJaeger.com

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.

Powered by:

X