Ich möchte überprüfen , ob ein Objekt eine Zahl ist , so dass .ToString()
in einem String führen würde enthalten Ziffern und +
, -
,.
Ist es durch einfaches Typprüfen in .net möglich (wie :) if (p is Number)
?
Oder sollte ich in einen String konvertieren und dann versuchen, ihn zu verdoppeln?
Update: Um zu verdeutlichen, dass mein Objekt int, uint, float, double usw. ist, ist es keine Zeichenfolge. Ich versuche eine Funktion zu erstellen, die jedes Objekt wie folgt in XML serialisiert:
<string>content</string>
oder
<numeric>123.3</numeric>
oder eine Ausnahme auslösen.
c#
.net
serialization
xml-serialization
Piotr Czapla
quelle
quelle
Antworten:
Sie müssen lediglich eine Typprüfung für jeden der numerischen Grundtypen durchführen.
Hier ist eine Erweiterungsmethode, die den Job erledigen sollte:
Dies sollte alle numerischen Typen abdecken.
Aktualisieren
Es scheint, dass Sie die Nummer während der Deserialisierung tatsächlich aus einer Zeichenfolge analysieren möchten. In diesem Fall wäre es wahrscheinlich am besten zu verwenden
double.TryParse
.Natürlich würde dies nicht mit sehr großen ganzen Zahlen / langen Dezimalstellen umgehen, aber wenn dies der Fall ist, müssen Sie nur zusätzliche Aufrufe zu
long.TryParse
/decimal.TryParse
/ was auch immer hinzufügen .quelle
Entnommen aus Scott Hanselmans Blog :
quelle
double.Parse(double.MaxValue.ToString())
verursacht eineOverflowException
. Sie können dies beheben, indem Sie.ToString("R")
in diesem Fall den Roundtrip-Modifikator angeben. Diese Überlastung ist jedoch nicht verfügbar,Convert.ToString(...)
da wir den Typ nicht kennen. Ich weiß, dass dies ein Randfall ist, aber ich bin darauf gestoßen, als ich Tests für meine eigene.IsNumeric()
Erweiterung geschrieben habe. Meine "Lösung" bestand darin, eine Typprüfung hinzuzufügen, bevor ich versuchte, etwas zu analysieren. Den Code finden Sie in meiner Antwort auf diese Frage.Nutzen Sie die IsPrimitive-Eigenschaft, um eine praktische Erweiterungsmethode zu erstellen:
BEARBEITEN: Gemäß Kommentaren behoben. Die Generika wurden entfernt, da die Werttypen .GetType () Felder sind. Ebenfalls enthaltener Fix für nullbare Werte.
quelle
object
undstring
sind keine primitiven Typen.Es gibt einige gute Antworten oben. Hier ist eine All-in-One-Lösung. Drei Überlastungen für unterschiedliche Umstände.
quelle
Anstatt Ihre eigenen zu rollen, ist die zuverlässigste Methode, um festzustellen, ob ein eingebauter Typ numerisch ist, wahrscheinlich das Referenzieren
Microsoft.VisualBasic
und AufrufenInformation.IsNumeric(object value)
. Die Implementierung behandelt eine Reihe subtiler Fälle wiechar[]
HEX- und OCT-Zeichenfolgen.quelle
Dort gibt es drei verschiedene Konzepte:
is
-if(obj is int) {...}
TryParse()
ToString()
, dass es etwas gibt, das wie eine Zahl aussieht , rufen Sie es aufToString()
und behandeln Sie es als ZeichenfolgeIn beiden ersten beiden Fällen müssen Sie wahrscheinlich jeden zu unterstützenden numerischen Typ (
double
/decimal
/int
) separat behandeln - jeder hat beispielsweise unterschiedliche Bereiche und Genauigkeiten.Sie können sich auch Regex ansehen, um eine schnelle grobe Überprüfung zu erhalten.
quelle
Angenommen, Ihre Eingabe ist eine Zeichenfolge ...
Es gibt zwei Möglichkeiten:
benutze Double.TryParse ()
Verwenden Sie Regex
quelle
Sie könnten folgenden Code verwenden:
Wenn Ihr Objekt eine ist
Int32
,Single
,Double
usw. wird die Konvertierung durchführen. Ein String wird ebenfalls implementiert,IConvertible
aber wenn der String nicht in ein Double konvertierbar ist,FormatException
wird ein geworfen.quelle
Wenn Ihre Anforderung wirklich ist
Wenn Sie double.TryParse verwenden möchten, müssen Sie die Überladung verwenden, die einen NumberStyles-Parameter verwendet, und sicherstellen, dass Sie die invariante Kultur verwenden.
Verwenden Sie beispielsweise für eine Zahl, die möglicherweise ein führendes Vorzeichen, kein führendes oder nachfolgendes Leerzeichen, kein Tausendertrennzeichen und ein Dezimaltrennzeichen enthält:
quelle
Beim Schreiben meiner eigenen
object.IsNumeric()
Erweiterungsmethode basierend auf der Antwort von Saul Dolgin auf diese Frage bin ich auf ein potenzielles Problem gestoßen, bei dem Sie eine erhalten,OverflowException
wenn Sie es mitdouble.MaxValue
oder versuchendouble.MinValue
.Meine "Lösung" bestand darin, die akzeptierte Antwort von Noldorin mit der von Saul Dolgin zu kombinieren und einen Mustervergleichsschalter hinzuzufügen, bevor ich versuchte, etwas zu analysieren (und etwas C # 7-Güte zu verwenden, um ein bisschen aufzuräumen):
quelle
Ja, das funktioniert:
Für eine Gleitkommazahl müssten Sie mit dem Gleitkommatyp testen:
quelle