все что связано с моей работой
Главная » Програмирование » Работа со строками в Lаzarus 2

Работа со строками в Lаzarus 2

В первой части я описал все подводные камни с которыми пришлось столкнуться. Если  глянуть на проблему шире, то все становится очевидно. Работа со строками становятся все больше и больше похожа как это делается в С – т.е. строка это кусок памяти! Хватит теории пора и по-практиковаться.

Тест 1.

Самое тяжкое это расстаться с такими конструкциями:

i:=0;
while i<=Length(S) do
  if S[i] in ['-','.',',','0'..'9' then inc(i)
  else delete(S,i,1);

Но, кто ищет — тот найдет! Во первых все функции UTF8XXXX находятся в модуле LCLProc, правда TUTF8Char почему-то в LCLTypes. Но т.к. ни одна из функций не возвращает TUTF8Char – он нам нужен только для эстетических целей. На самом деле TUTF8Char=string[7]. В LCLProc очень много функций работы со строками и не только UTF8. Если чуть пошарить можно найти интересные и полезные функции, например:

function StringCase(const AString: String; const ACase: array of String {; const AIgnoreCase = False, APartial = false: Boolean}): Integer; overload;
function StringCase(const AString: String; const ACase: array of String; const AIgnoreCase, APartial: Boolean): Integer; overload;

Итак создадим новый проект, накидаем такую форму: str1 Добавим функцию:

function GetUTF8Char(S:string; CharIndex:longint):TUTF8Char;
begin
  Result:=UTF8Copy(S,CharIndex,1);
end;

смысловой нагрузки нет, просто для наглядности. И вот такой обработчик нажатия кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:integer;
    S,uk:string;
    C:char;
    U:TUTF8Char;
    b:boolean;
begin
  Memo1.Clear;
  k:=0;
  S:=Edit1.Text;
  for i:=1 to UTF8Length(S) do begin
    c:=S[i]; // Получили символ старым способом
    U:=GetUTF8Char(S,i); // новым
    // Сформируем строчку с кодами полученного символа
    uk:=' ';
    for j:=1 to length(u) do uk:=uk+','+IntToStr(ord(u[j]));
    // Собственно тест функции
    b:=StringCase(U,['с','и','п'])>-1;
    Memo1.Append(IntToStr(Ord(c))+' - '+c+' -UTF8- '+U+' -'+uk+'    '+BoolToStr(b,true));
    // Проверка работы сравнений. "а" - русская буква
    if U='а' then inc(k);
  end;
  Memo1.Append(Format('a count=%d',[k]));
end;

Все на мой взгляд подробно расписано. Входящая строка — “Список перечисляемой в банк зарплаты”. Небольшое замечание по BoolToStr, 2й параметр указывает что значения надо вывести словами, если не указать то будет печатать –1 и 0. Вот результат: str2 Видно что все русские буквы состоят из 2х байт, символ ‘ ‘ – 1 байт и в случае char и TUTF8Char. Последняя колонка показывает результат работы StringCase. Как следствие наш кусочек кода теперь можно переписать так:

i:=0;
while i<=UTF8Length(S) do
  if StringCase(S,['-','.',',','0'..'9'])>-1 then inc(i)
  else UTF8Delete(S,i,1);

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.