уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Начиная с версии 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, облегчающий работу с различными кодировками. В одном из следующих постов, постараюсь рассмотреть работу с этим классом.

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
4 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Александр
29/03/2010 13:45

С этими функциями надо аккуратнее: 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]

Александр
29/03/2010 14:28

Ну, тут всё зависит от контекста, зачем это надо.

Если, скажем, разбить текст по словам (для организации переноса) — однозначно нужно использовать Character.pas, а не жёсткие константы.

А если любой вид синтаксического разбора (включая подготовку к чему-то типа StrToInt) — то максимально жёсткие if-ы и никаких IsNumber.

P.S. Вставил back-link.

trackback
Модуль с хэлперами для Integer, Char и TDateTime. | Delphi в Internet
07/12/2012 00:19

[…] ещё, если мне не изменяет память, в Delphi 2009 — в модуле Character. Соответственно и хэлпер использует методы из этого […]