Ich verwende oft Char.IsDigit
, um zu prüfen, ob a char
ist eine Ziffer, die in LINQ-Abfragen besonders nützlich ist, um int.Parse
wie hier: "123".All(Char.IsDigit)
vorzusuchen.
Aber es gibt Zeichen, die Ziffern sind, aber nicht zu int
wie ۵
geparst werden können.
Warum ist das? Ist mein int.Parse
-Precheck über Char.IsDigit
somit falsch?
Es gibt 310 Zeichen, die Ziffern sind:
%Vor% Hier ist die Implementierung von Char.IsDigit
in .NET 4 (ILSpy):
Also, warum gibt es Zeichen, die zu der gehören DecimalDigitNumber
-category ( "Dezimalziffernzeichen, dh ein Zeichen im Bereich von 0 bis 9 ..." ), das nicht in int
in geparst werden kann irgendeine Kultur?
Dies liegt daran, dass alle Ziffern in der Unicode-Kategorie "Number, Decimal Digit" wie hier aufgelistet überprüft werden:
Dies bedeutet nicht, dass es sich um ein gültiges numerisches Zeichen im aktuellen Gebietsschema handelt. Wenn Sie int.Parse()
verwenden, können Sie NUR die normalen englischen Ziffern analysieren, unabhängig von der Gebietsschemaeinstellung.
Zum Beispiel funktioniert nicht :
%Vor% Auch wenn ٣
ein gültiges arabisches Zeichen ist und "ar" das arabische Gebietsschema.
Im Microsoft-Artikel "Vorgehensweise: Parsen von Unicode-Ziffern" heißt es:
>Die einzigen Unicode-Ziffern, die das .NET Framework als Dezimalzahlen analysiert, sind die ASCII-Ziffern 0 bis 9, die durch die Codewerte U + 0030 bis U + 0039 angegeben werden. Das .NET Framework analysiert alle anderen Unicode-Ziffern als Zeichen.
Beachten Sie jedoch, dass Sie char.GetNumericValue()
um ein numerisches Unicode-Zeichen in sein numerisches Äquivalent als Doppel zu konvertieren.
Der Grund, warum der Rückgabewert ein Double und kein Int ist, liegt an folgenden Dingen:
%Vor%Sie könnten so etwas verwenden, um alle numerischen Zeichen in einer Zeichenfolge in ihr ASCII-Äquivalent umzuwandeln:
%Vor%Dezimalziffern sind 0 bis 9, aber sie haben viele Darstellungen in Unicode. Von Wikipedia :
Die Dezimalziffern werden in 23 separaten Blöcken wiederholt
MSDN gibt an, dass .NET nur lateinische Ziffern analysiert :
Die einzigen von den Analysemethoden erkannten Ziffern sind jedoch die lateinischen Ziffern 0-9 mit Codepunkten von U + 0030 bis U + 0039
Tags und Links string .net c# character-encoding int