Ответ 1
Это потому, что он проверяет все цифры в категории "Число, десятичная цифра" в Юникоде, как указано здесь:
http://www.fileformat.info/info/unicode/category/Nd/list.htm
Это не означает, что он является допустимым числовым символом в текущей локали. Фактически, используя int.Parse()
, вы можете ТОЛЬКО анализировать обычные английские цифры независимо от настроек локали.
Например, это не работает:
int test = int.Parse("٣", CultureInfo.GetCultureInfo("ar"));
Даже если ٣
является действительным символом арабской цифры, а "ar" является идентификатором арабского языка.
В статье Microsoft "Как: Разделить Unicode Digits" говорится, что:
Единственные Unicode-цифры, которые .NET Framework анализирует как десятичные знаки, это цифры ASCII от 0 до 9, заданные значениями кода U + 0030 через U + 0039..NET Framework анализирует все остальные символы Unicode в качестве символов.
Однако обратите внимание, что вы можете использовать char.GetNumericValue()
, чтобы преобразовать числовой символ Unicode в его числовой эквивалент как двойной.
Причина, по которой возвращаемое значение является двойным, а не int, происходит из-за таких вещей:
Console.WriteLine(char.GetNumericValue('¼')); // Prints 0.25
Вы можете использовать что-то вроде этого, чтобы преобразовать все числовые символы в строке в их эквивалент ASCII:
public string ConvertNumericChars(string input)
{
StringBuilder output = new StringBuilder();
foreach (char ch in input)
{
if (char.IsDigit(ch))
{
double value = char.GetNumericValue(ch);
if ((value >= 0) && (value <= 9) && (value == (int)value))
{
output.Append((char)('0'+(int)value));
continue;
}
}
output.Append(ch);
}
return output.ToString();
}