Warum gibt Char.IsDigit true für Zeichen zurück, die nicht nach int geparst werden können?

8

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.

%Vor%

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

%Vor%

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?

    
Tim Schmelter 27.02.2014, 08:53
quelle

2 Antworten

7

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%     
Matthew Watson 27.02.2014, 09:07
quelle
3

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

    
Eli Arbel 27.02.2014 09:10
quelle