Я часто использую 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 в любой культуре?