Внимание: впереди тема .NET!
Вчера, Брэд Абрамс заметил, что метод Char.IsLetter() фильтрует больший диапазон символов, чем просто от "A" до "Z".
Но что люди действительно могут не осознавать, так это то, что Char.IsDigit() соответствует не только символам от "0" до "9".
Допустимые цифры являются членами следующей категории в UnicodeCategory: DecimalDigitNumber.Но что конкретно принадлежит DecimalDigitNumber?
DecimalDigitNumberК этому моменту вам нужно зайти на сайт Unicode Standard Committee, чтобы посмотреть, что же в точности принимается за "Nd", и тогда вы затеряетесь в запутанном лабиринте различных спецификаций и документов.
Указывает, что символ является десятичной цифрой; т.е. находится в диапазоне от 0 до 9. Обозначается Unicode названием "Nd" (номер, десятичная цифра). Имеет код 8.
Давайте проведём эксперимент.
class Program {Символы в строке являются арабскими цифрами - но они всё же цифры, что и подтверждается следующим выводом программы:
public static void Main(string[] args) {
System.Console.WriteLine(
System.Text.RegularExpressions.Regex.Match(
"\x0661\x0662\x0663", // "١٢٣"
"^\\d+$").Success);
System.Console.WriteLine(
System.Char.IsDigit('\x0661'));
}
}
TrueОй. А нет ли у вас бага при проверке параметров? Если вы использовали шаблон типа @"^\d$" для проверки того, что вы получили только цифры, а потом позже использовали System.Int32.Parse() для парсинга этой строки, тогда я могу скормить вам несколько арабских цифр, откинуться на спинку кресла и наслаждаться получившимся фейерверком. Арабские цифры пройдут ваши проверки, но как только вы попытаетесь использовать - бум! - вы возбуждаете System.FormatException и умираете.
True
Читать далее.
Сказанное справедливо и для IsNumber из модуля Character.pas в Delphi 2009 и выше.
ОтветитьУдалитьОбзор Character.pas.
ОтветитьУдалить