. Тестировано под 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;
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;