Я часто использую Char.IsDigit
, чтобы проверить, является ли char
цифрой, которая особенно удобна в запросах LINQ для предварительной проверки int.Parse
, как здесь: "123".All(Char.IsDigit)
.
Но есть символы, которые являются цифрами, но которые не могут быть проанализированы на int
как ۵
.
// 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));
Почему? Неверный ли мой int.Parse
-precheck через Char.IsDigit
?
Есть 310 символов, которые являются цифрами:
List<char> digitList = Enumerable.Range(0, UInt16.MaxValue)
.Select(i => Convert.ToChar(i))
.Where(c => Char.IsDigit(c))
.ToList();
Здесь реализация Char.IsDigit
в .NET 4 (ILSpy):
public static bool IsDigit(char c)
{
if (char.IsLatin1(c))
{
return c >= '0' && c <= '9';
}
return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.DecimalDigitNumber;
}
Итак, почему существуют символы, которые принадлежат DecimalDigitNumber
-category ( "Символ десятичной цифры, то есть символ в диапазоне 0 до 9..." ), которые не могут быть проанализированы на int
в любой культуре?