Начиная с версии 2009, в RTL Delphi появился ряд новых модулей и классов, облегчающих нам работу со строками. В числе прочих был добавлен и модуль Character, содержащий класс TCharacter для обработки символов. TCharacter — закрытый класс, который полностью состоит из статичных функций класса. Нам нет необходимости создавать отдельный экземпляр TCharacter в своих приложениях — достаточно воспользоваться его статическими методами напрямую. Кроме этого в модуле Character содержится ряд автономных функций позволяющих обрабатывать символы. Рассмотрим, какие дополнительные возможности дает нам использование модуля.
1. Проверка символа.
Допустим, нам необходимо проверить является ли символ буквой. Как бы мы это сделали без использования Character? Самый простой вариант, проверить вхождение символа в множество:
if MyChar in ['a'..'z', 'A'..'Z'] then begin ... end;
Используя Character, мы можем провести ту же саму проверку так:
if TCharacter.IsLetter(MyChar) then begin end;
Или, воспользовавшись одной из автономных функций модуля:
if IsLetter(MyChar) then begin end;
При этом функция IsLetter определяет все буквы, в том числе и русского алфавита, т.к. классом TCharacter используются стандарты, установленные организацией Unicode consortium.
Также в модуле содержится следующие полезные функции проверки символов:
function IsControl(C: Char): Boolean; function IsDigit(C: Char): Boolean; function IsHighSurrogate(C: Char): Boolean; function IsLetterOrDigit(C: Char): Boolean; function IsLowSurrogate(C: Char): Boolean; function IsNumber(C: Char): Boolean; function IsPunctuation(C: Char): Boolean; function IsSeparator(C: Char): Boolean; function IsSurrogate(Surrogate: Char): Boolean; function IsSurrogatePair(const HighSurrogate, LowSurrogate: Char): Boolean; function IsSymbol(C: Char): Boolean; function IsUpper(C: Char): Boolean; function IsWhiteSpace(C: Char): Boolean;
В качестве примера можно привести следующий код Delphi, в котором определяется количество букв, цифр и пробелов в строке:
procedure ParseString(const Str: string); var ch: Char; letters, spaces,digits:integer; begin letters:=0; spaces:=0; digits:=0; for ch in str do begin if IsLetter(ch) then inc(letters) else if IsDigit(ch) then inc(digits) else if IsWhiteSpace(ch) then inc(spaces) end; ShowMessage('Букв: '+IntToStr(letters)+#10#13+'Цифр: '+IntToStr(digits)+#10#13+'Пробелов: '+IntToStr(spaces)); end;
Проверка работы процедуры:
ParseString('Это строка, содержащая буквы, цифры 12345 и 8 пробелов')
Результат:
Аналогичным образом можно проверить также символ на то, является ли он знаком пунктуации и т.д.
2. Конвертация символов.
Для конвертирования символов в Character содержатся следующие методы:
function ToLower(C: Char): Char; function ToLower(const S: string): string; function ToUpper(C: Char): Char; function ToUpper(const S: string): string;
Думаю, что подробное описание методов не требуется. Первые два метода переводят символ или строку в нижний регистр, вторые — в верхний.
Также можно воспользоваться методами для перевода символа из одной кодировки в другую:
function ConvertFromUtf32(C: UCS4Char): string; function ConvertToUtf32(const S: string; Index: Integer): UCS4Char; function ConvertToUtf32(const S: string; Index: Integer; out CharLength: Integer): UCS4Char; function ConvertToUtf32(const HighSurrogate, LowSurrogate: Char): UCS4Char;
Вот кратко о том, что дает нам использование модуля Character в Delphi 2009-2010. Также не стоит забывать о том, что, начиная с версии 2009 в Delphi появился класс TEncoding, облегчающий работу с различными кодировками. В одном из следующих постов, постараюсь рассмотреть работу с этим классом.
С этими функциями надо аккуратнее: http://transl-gunsmoker.blogspot.com/2009/03/charisdigit-09.html
Например:
[code]procedure TForm1.FormCreate(Sender: TObject);
var
C: Char;
begin
C := #$661; // арабская цифра
if IsNumber(C) then
Caption := '+: ' + C
else
Caption := '-: ' + C;
end;[/code]
Спасиб за предупреждение, буду знать. Мне пока понадобилось использование IsWhiteSpase и IsPunctuation. с этими методами вроде бы все в норме
Ну, тут всё зависит от контекста, зачем это надо.
Если, скажем, разбить текст по словам (для организации переноса) — однозначно нужно использовать Character.pas, а не жёсткие константы.
А если любой вид синтаксического разбора (включая подготовку к чему-то типа StrToInt) — то максимально жёсткие if-ы и никаких IsNumber.
P.S. Вставил back-link.
[…] ещё, если мне не изменяет память, в Delphi 2009 — в модуле Character. Соответственно и хэлпер использует методы из этого […]