it-swarm.com.de

Was ist das C # -Äquivalent von NaN oder IsNumeric?

Was ist die effizienteste Methode zum Testen einer Eingabezeichenfolge, wenn sie einen numerischen Wert enthält (oder umgekehrt keine Zahl)? Ich schätze, ich kann Double.Parse oder einen Regex (siehe unten) verwenden, aber ich habe mich gefragt, ob es dafür einige Möglichkeiten gibt, wie z. B. die JavaScript-Funktion NaN() oder IsNumeric() (war das VB?.

public static bool IsNumeric(this string value)
{
    return Regex.IsMatch(value, "^\\d+$");
}
92
johnc

Dies hat nicht den Regex-Aufwand

double myNum = 0;
String testVar = "Not A Number";

if (Double.TryParse(testVar, out myNum)) {
  // it is a number
} else {
  // it is not a number
}

Im Übrigen unterstützen alle Standarddatentypen TryParse, mit Ausnahme der GUIDs.

Update
secretwep hat angesprochen, 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

public Boolean IsNumber(String s) {
  Boolean value = true;
  foreach(Char c in s.ToCharArray()) {
    value = value && Char.IsDigit(c);
  }

  return value;
}

oder wenn Sie etwas schicker sein wollen

public Boolean IsNumber(String value) {
  return value.All(Char.IsDigit);
}
157
NotMe

Ich bevorzuge so etwas, mit dem Sie entscheiden können, auf was NumberStyle getestet werden soll.

public static Boolean IsNumeric(String input, NumberStyles numberStyle) {
    Double temp;
    Boolean result = Double.TryParse(input, numberStyle, CultureInfo.CurrentCulture, out temp);
    return result;
}
40

Zusätzlich zu den vorherigen richtigen Antworten ist es wahrscheinlich wert, darauf hinzuweisen, dass "Not a Number" (NaN) in seiner allgemeinen Verwendung nicht einem String entspricht, der nicht als numerischer Wert ausgewertet werden kann. Unter NaN wird normalerweise ein numerischer Wert verstanden, der zur Darstellung des Ergebnisses einer "unmöglichen" Berechnung verwendet wird, wobei das Ergebnis undefiniert ist. In dieser Hinsicht würde ich sagen, dass die Verwendung von Javascript etwas irreführend ist. In C # ist NaN als eine Eigenschaft der einfachen und doppelten numerischen Typen definiert und wird verwendet, um explizit auf das Ergebnis des Nulltauchens von Null zu verweisen. Andere Sprachen verwenden sie, um unterschiedliche "unmögliche" Werte darzustellen.

19
Stu Mackellar

Ich weiß, dass dies auf viele verschiedene Arten beantwortet wurde, mit Erweiterungen und Lambda-Beispielen, aber eine Kombination aus beidem für die einfachste Lösung.

public static bool IsNumeric(this String s)
{
    return s.All(Char.IsDigit);
}

oder wenn Sie Visual Studio 2015 (C # 6.0 oder höher) verwenden

public static bool IsNumeric(this String s) => s.All(Char.IsDigit);

Super C # 6 in einer Zeile. Dies ist natürlich begrenzt, da nur numerische Zeichen geprüft werden. 

Um zu verwenden, müssen Sie nur eine Zeichenfolge verwenden und die Methode aufrufen, z.

bool IsaNumber = "123456".IsNumeric();
6
Paul Bartlett

Ja, IsNumeric ist VB. Normalerweise verwenden Leute die TryParse () -Methode, obwohl sie etwas klobig ist. Wie Sie vorgeschlagen haben, können Sie immer Ihre eigenen schreiben. 

int i;
if (int.TryParse(string, out i))
{

}
5
Ed S.

Ich mag die Erweiterungsmethode, mag es aber nicht, Ausnahmen zu werfen, wenn dies möglich ist.

    /// <summary>
    /// Extension method that works out if a string is numeric or not
    /// </summary>
    /// <param name="str">string that may be a number</param>
    /// <returns>true if numeric, false if not</returns>
    public static bool IsNumeric(this String str)
    {
        double myNum = 0;
        if (Double.TryParse(str, out myNum))
        {
            return true;
        }
        return false;
    }
5
NER1808

Sie können weiterhin die Visual Basic-Funktion in C # verwenden. Das einzige, was Sie tun müssen, ist, meine folgenden Anweisungen zu befolgen:

  1. Fügen Sie den Verweis zur Visual Basic-Bibliothek hinzu , indem Sie mit der rechten Maustaste auf Ihr Projekt klicken und "Referenz hinzufügen" auswählen:

enter image description here

  1. Dann import it in Ihrer Klasse wie unten gezeigt:

    using Microsoft.VisualBasic;

  2. Weiter benutze es wo immer du willst wie unten gezeigt:

                if (!Information.IsNumeric(softwareVersion))
            {
                throw new DataException(string.Format("[{0}] is an invalid App Version!  Only numeric values are supported at this time.", softwareVersion));
            }
    

Hoffe, das hilft und viel Glück!

4
Vincy

Einfache Erweiterung:

public static bool IsNumeric(this String str)
{
    try
    {
        Double.Parse(str.ToString());
        return true;
    }
    catch {
    }
    return false;
}
4
MrSiir

VB hat die Funktion IsNumeric. Sie könnten auf Microsoft.VisualBasic.dll verweisen und es verwenden.

4
shahkalpesh
public static bool IsNumeric(string anyString)
{
    if (anyString == null)
    {
        anyString = "";
    }

    if (anyString.Length > 0)
    {
        double dummyOut = new double();
        System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US", true);
        return Double.TryParse(anyString, System.Globalization.NumberStyles.Any, cultureInfo.NumberFormat, out dummyOut);
    }
    else
    {
        return false;
    }
}
3
Mnaouar

Vielleicht ist dies eine C # 3-Funktion, aber Sie könnten double.NaN verwenden.

3
kenny

Ich benutzte Chris Livelys Snippet (ausgewählte Antwort), das in einer Bool-Funktion wie Gishus Vorschlag für ein oder zwei Jahre verkapselt war. Ich habe es verwendet, um sicherzustellen, dass bestimmte Abfragezeichenfolgen nur numerisch sind, bevor Sie mit der weiteren Verarbeitung fortfahren. Ich bekam einige fehlerhafte Querystringe, die die markierte Antwort nicht handhabte, insbesondere wenn ein Komma nach einer Zahl wie "3645" übergeben wurde (zurückgegeben wurde). Dies ist der resultierende Mod:

   static public bool IsNumeric(string s)
   {
      double myNum = 0;
      if (Double.TryParse(s, out myNum))
      {
         if (s.Contains(",")) return false;
         return true;
      }
      else
      {
         return false;
      }
   }
2
secretwep

Tatsächlich wird Double.NaN in allen .NET-Versionen 2.0 und höher unterstützt.

2
Madcat

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.

public bool IsNumeric(string numericString, out Double numericValue)
{
    if (Double.TryParse(numericString, out numericValue))
        return true;
    else
        return false;
}
0
Keith Aymar