Главная страница | Продукты | Delphi | Юмор | Контакт

Операции со строками

Денежные суммы прописью
Преобразование строки в вещественные и денежные значения
Преобразование строки с разделителями в список строк
Перевод символа в верхний регистр для русского алфавита
Перевод символа в верхний регистр для русского алфавита
Замена подстроки в строке
Добавление строки к файлу
Преобразование двоичного буфера в строку
Преобразование строки в двоичный буфер

Денежные суммы прописью

Рекомендую воспользоваться объектом TFormatSpeller. Он позволяет форматировать прописью денежные суммы разных валют и целые количества разных объектов. Архив 16 kb с примером можно скачать здесь. Тестировано под Delphi 5 и Delphi 3. TFormatSpeller описан в модуле fspl.pas

Преобразование строки в вещественные и денежные значения

Эти функции позволяют вводить числа с точкой или с запятой без изменения DecimalSeparator
function CurrToStrP(const c:currency):string;
{конвертация currency в строку с точкой}
var
 i:integer;
begin
 Result:=currtostr(c);
 for i:=1 to length(Result) do begin
  if Result[i]=',' then begin
   Result[i]:='.';
   break;
  end;
 end;
end;

function StrToCurrP(s:string):currency;
{конвертация строку с точкой или запятой в качестве разделителя в currency}
var
 i:integer;
begin
 for i:=1 to length(s) do begin
  if s[i]in [',','.'] then begin
   s[i]:=decimalseparator;
   break;
  end;
 end;
 Result:=strtocurr(s);
end;

function FloatToStrP(c:extended):string;
{конвертация float в строку с точкой}
var
 i:integer;
begin
 Result:=floattostr(c);
 for i:=1 to length(Result) do begin
  if Result[i]=',' then begin
   Result[i]:='.';
   break;
  end;
 end;
end;

function StrToFloatP(s:string):extended;
{конвертация строки с точкой или запятой в качестве разделителя в float}
var
 i:integer;
begin
 for i:=1 to length(s) do begin
  if s[i]in [',','.'] then begin
   s[i]:=decimalseparator;
   break;
  end;
 end;
 Result:=strtofloat(s);
end;

Преобразование строки с разделителями в список cтрок

procedure SplitString(Source:string;delimiter:char;ssWords:TStrings);
{разбивка строки, пустые строки НЕ добавляются}
var
 i:integer;
 s:string;
begin
 ssWords.Clear;
 s:='';
 for i:=1 to length(Source) do begin
  if (Source[i]=Delimiter)and(s<>'') then begin
   ssWords.Add(s);
   s:='';
  end else if (Source[i]<>delimiter) then s:=s+Source[i];
 end;
 if (s<>'')then ssWords.Add(s);
end;

procedure SplitStringE(Source:string;delimiter:char;ssWords:TStrings);
{разбивка строки, пустые строки добавляются}
{пример SplitStringE('*.*;;*.b?;rt*.*') выдаст список  '*.*', '', '*.b?', 'rt*.*'}
var
 i,ic:integer;
 s:string;
begin
 ssWords.Clear;
 s:='';
 ic:=0;
 for i:=1 to length(Source) do begin
  if (Source[i]=Delimiter) then begin
   ssWords.Add(s);
   s:='';
   ic:=0;
  end else if (Source[i]<>delimiter) then begin
   s:=s+Source[i];
   inc(ic);
  end;
 end;
 if ic<>0 then  ssWords.Add(s);
end;

Перевод символа в верхний регистр для русского алфавита

function UpCaseRus( ch : Char ) : Char;
{Перевод символа в верхний регистр для русского алфавита}
asm
        CMP     AL,'a'
        JB      @@exit
        CMP     AL,'z'
        JA      @@Rus
        SUB     AL,'a' - 'A'
        RET
@@Rus:
        CMP     AL,'я'
        JA      @@Exit
        CMP     AL,'а'
        JB      @@yo
        SUB     AL,'я' - 'Я'
        RET
@@yo:
        CMP     AL,'ё'
        JNE      @@exit
        MOV     AL,'Ё'
@@exit:
end;

Перевод символа в нижний регистр для русского алфавита

function LoCaseRus( ch : Char ) : Char;
{Перевод символа в нижний регистр для русского алфавита}
asm
        CMP     AL,'A'
        JB      @@exit
        CMP     AL,'Z'
        JA      @@Rus
        ADD     AL,'a' - 'A'
        RET
@@Rus:
        CMP     AL,'Я'
        JA      @@Exit
        CMP     AL,'А'
        JB      @@yo
        ADD     AL,'я' - 'Я'
        RET
@@yo:
        CMP     AL,'Ё'
        JNE      @@exit
        MOV     AL,'ё'
@@exit:
end;

Замена подстроки в строке

function ReplaceStr(const S, Srch, Replace: string): string;
{замена подстроки в строке}
var
 I:Integer;
 Source:string;
begin
 Source:= S;
 Result:= '';
 repeat
  I:=Pos(Srch, Source);
  if I > 0 then begin
   Result:=Result+Copy(Source,1,I-1)+Replace;
   Source:=Copy(Source,I+Length(Srch),MaxInt);
  end else Result:=Result+Source;
 until I<=0;
end;

Добавление строки к файлу

procedure AddStrToFile(S:string;const FileName:string;doNextLine:boolean);
{Добавление строки к файлу;
doNextLine - перевод строки}
var
 f: TextFile;
 oldsize:integer;
begin
 oldsize:=getfilesize(FileName);
 AssignFile(f,FileName);
 if oldsize<0 then Rewrite(f);
 Append(f);
 if (doNextLine)and(oldSize>0) then writeln(f,'');
 Write(f,S);
 Flush(f);
 CloseFile(f);
end;

Преобразование двоичного буфера в строку

function BinaryToStr(PBuffer:Pointer;size:integer;Delimiter:char):string;
{преобразование последовательности байтов в строку
PBuffer - указатель на начало двоичной области
Size - количество байт}
var
 s:string;
 i:integer;
begin
 result:='';
 for i:=0 to Size-1 do begin
  s:=inttohex((PByteArray(PBuffer))^[i],2);
  if (Delimiter<>#0) then s:=s+Delimiter;
  Result:=Result+s;
 end;
 if (Result<>'')and(Delimiter<>#0)then setlength(Result,length(Result)-1);
end;

Преобразование строки в двоичный буфер

function StrToBinary(Data:string;PBuffer:Pointer;MaxSize:integer;Delimiter:char):integer;//return size
{преобразование строки в последовательность байтов
PBuffer - указатель на начало двоичной области
MaxSize - размер буфера}
const
 h_prefix='$';
var
 l,p:integer;
 s:string;
begin
 l:=length(Data);
 p:=1;
 Result:=0;
 if Delimiter=#0 then begin
  while p<=l do begin
   s:=h_prefix+copy(Data,p,2);
   PByteArray(PBuffer)^[Result]:=strtoint(s);
   inc(p,2);
   inc(Result);
   if Result>MaxSize then break;
  end;
 end else begin
  s:='';
  for p:=1 to l do begin
   if (Data[p]=Delimiter)or(p=l)then begin
    PByteArray(PBuffer)^[Result]:=strtoint(s);
    s:=h_prefix+'0';
    inc(Result);
    if Result>MaxSize then break;
   end else s:=s+Data[p];
  end;
 end;
end;
Начало

Главная страница | Продукты | Delphi | Юмор | Контакт