Warum gibt Char.IsDigit true für Zeichen zurück, die nicht in int analysiert werden können?
Ich benutze oftChar.IsDigit
um zu überprüfen, ob achar
ist eine Ziffer, die besonders bei LINQ-Abfragen zur Vorabprüfung nützlich istint.Parse
wie hier:"123".All(Char.IsDigit)
.
Aber es gibt Zeichen, die Ziffern sind, aber nicht analysiert werden könnenint
mögen۵
.
// true
bool isDigit = Char.IsDigit('۵');
var cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
int num;
// false
bool isIntForAnyCulture = cultures
.Any(c => int.TryParse('۵'.ToString(), NumberStyles.Any, c, out num));
Warum ist das so? Ist meinint.Parse
-ÜberprüfenChar.IsDigit
also falsch?
Es gibt 310 Zeichen, die Ziffern sind:
List<char> digitList = Enumerable.Range(0, UInt16.MaxValue)
.Select(i => Convert.ToChar(i))
.Where(c => Char.IsDigit(c))
.ToList();
Hier ist die Implementierung vonChar.IsDigit
in .NET 4 (ILSpy):
public static bool IsDigit(char c)
{
if (char.IsLatin1(c))
{
return c >= '0' && c <= '9';
}
return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
}
Also, warum gibt es Zeichen, die zu den gehören?DecimalDigitNumber
-Kategorie("Dezimalziffer, dh ein Zeichen im Bereich von 0 bis 9 ..."), die nicht zu einemint
in irgendeiner Kultur?