Code:

unit UkrRecog;

{копирайт непомню чей. Был для русских циферок, а я переделал под

украинские}

{если кто что найдет пришлите

 

}

{by Andrew Tkachenko, proektwo netcity.ru, Ukraine,

 

}

interface

 

const

 

UkrMonthString: array[1..12] ofstring[9] = (

'січня', 'лютого', 'березня', 'квiтня', 'травня',

'червня', 'липня', 'серпня', 'вересня', 'жовтня',

'листопада', 'грудня');

 

function UkrRecognizeAmount(Amount: real;

CurrName, CurrSubname: string): string;

 

implementation

uses Sysutils;

 

function UkrRecognizeAmount(Amount: real;

CurrName, CurrSubname: string): string;

{* CurrName in [грн.]

 

CurrSubName in [коп.]

Распознается число <= 999 999 999 999.99*}

const suffBL: string = ' ';

 

suffDCT: string = 'дцять';

suffNA: string = 'надцять ';

suffDCM: string = 'десят';

suffMZ: string = 'ь';

sot: string = 'сот';

st: string = 'ст';

aa: string = 'а';

ee: string = 'и'; {e}

ii: string = 'і'; {и}

oo: string = 'о';

ov: string = 'ів'; {ов}

C2: string = 'дв';

C3: string = 'тpи';

C4: string = 'чотир';

C5: string = 'п''ят';

C6: string = 'шіст';

C7: string = 'сім';

C8: string = 'вісім';

C9: string = 'дев''ят';

var

 

i: byte;

sAmount, sdInt, sdDec: string;

IsMln, IsTha {,IsDcm}, IsRange1019: boolean;

currNum, endMlx, sResult: string;

begin

 

if (amount <= 0) or (amount > 999999999999.99) then

begin

Result := '<<<< Ошибка в диапазоне >>>>';

Exit;

end;

STR(Amount: 16: 2, sAmount);

sdInt := Copy(sAmount, 1, 13);

sdDec := Copy(sAmount, 15, 2);

IsMln := false;

//IsDcm:=false;

IsTha := false;

IsRange1019 := false;

sResult := '';

for i := 1to13do

begin

currNum := Copy(sdInt, i, 1);

 

if currNum <> suffBL then

begin

case i of

5, 6, 7: if currNum <> '0'then IsMln := true;

8, 9, 10: if currNum <> '0'then IsTha := true;

end;

 

if i in [2, 5, 8, 11] then{сотни}

begin

if currNum = '1'then sResult := sResult + st + oo + suffBL;

if currNum = '2'then sResult := sResult + C2 + ii + st + ii + suffBL;

if currNum = '3'then sResult := sResult + C3 + st + aa + suffBL;

if currNum = '4'then sResult := sResult + C4 + ee + st + aa + suffBL;

if currNum = '5'then sResult := sResult + C5 + sot + suffBL;

if currNum = '6'then sResult := sResult + C6 + sot + suffBL;

if currNum = '7'then sResult := sResult + C7 + sot + suffBL;

if currNum = '8'then sResult := sResult + C8 + sot + suffBL;

if currNum = '9'then sResult := sResult + C9 + sot + suffBL;

end;

if i in [3, 6, 9, 12] then{десятки}

begin

if currNum = '1'then IsRange1019 := true;

if currNum = '2'then sResult := sResult + C2 + aa + suffDCT + suffBL;

if currNum = '3'then sResult := sResult + C3 + suffDCT + suffBL;

if currNum = '4'then sResult := sResult + 'соpок ';

if currNum = '5'then

sResult := sResult + C5 + suffMZ + suffDCM + suffBL;

 

if currNum = '6'then

sResult := sResult + C6 + suffMZ + suffDCM + suffBL;

 

if currNum = '7'then

sResult := sResult + C7 + suffMZ + suffDCM + suffBL;

 

if currNum = '8'then

sResult := sResult + C8 + suffMZ + suffDCM + suffBL;

 

if currNum = '9'then

sResult := sResult + 'дев''ян' + oo + st + oo + suffBL;

 

end;

if i in [4, 7, 10, 13] then{единицы}

begin

if (currNum = '0') then

if IsRange1019 then sResult := sResult + suffDCM + suffMZ + suffBL;

if (currNum = '1') then

begin

if (i = 13) and (not IsRange1019) then

sResult := sResult + 'одна '

else

begin

if (i = 10) and (IsRange1019) then

sResult := sResult + 'оди'

elseif (i = 10) and (not IsRange1019) then

sResult := sResult + 'одна '

else

sResult := sResult + 'один'{ин};

 

if IsRange1019 and (i = 13) then

sResult := sResult + 'адцять' + suffBL

elseif IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffBL;

end;

end;

if (currNum = '2') then

begin

sResult := sResult + C2;

if (i = 10) and (IsRange1019 = False) then

sResult := sResult + ii

elseif (i = 10) or (IsRange1019) then

sResult := sResult + aa

else

sResult := sResult + {aa} ii;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffBL;

end;

if (currNum = '3') then

begin

sResult := sResult + C3;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffBL;

end;

if (currNum = '4') then

begin

sResult := sResult + C4;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + ee + suffBL;

end;

if (currNum = '5') then

begin

sResult := sResult + C5;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffMZ + suffBL;

end;

if (currNum = '6') then

begin

sResult := sResult + C6;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffMZ + suffBL;

end;

if (currNum = '7') then

begin

sResult := sResult + C7;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffBL;

end; if (currNum = '8') then

begin

sResult := sResult + C8;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffBL;

end; if (currNum = '9') then

begin

sResult := sResult + C9;

if IsRange1019 then

sResult := sResult + suffNA

else

sResult := sResult + suffMZ + suffBL;

end;

end;

 

endMlx := '';

case i of

4:

begin

if IsRange1019 then

endMlx := ov + suffBL

elseif currNum = '1'then

endMlx := suffBL

elseif (currNum = '2') or (currNum = '3') or (currNum = '4') then

endMlx := aa + suffBL

else

endMlx := ov + suffBL;

sResult := sResult + 'мiльярд' + endMlx;

end;

7: if IsMln then

begin

if IsRange1019 then

endMlx := ov + suffBL

elseif currNum = '1'then

endMlx := suffBL

elseif (currNum = '2') or (currNum = '3') or (currNum = '4') then

endMlx := aa + suffBL

else

endMlx := ov + suffBL;

sResult := sResult + 'мiльйон' + endMlx;

end;

10: if IsTha then

begin

if IsRange1019 then

endMlx := suffBL

elseif currNum = '1'then

endMlx := aa + suffBL

elseif (currNum = '2') or (currNum = '3') or (currNum = '4') then

endMlx := ii + suffBL

else

endMlx := suffBL;

sResult := sResult + 'тисяч' + endMlx;

end;

end; {case}

if i in [4, 7, 10, 13] then IsRange1019 := false;

end; {IF}

end; {FOR}

 

sResult := sResult + CurrName + ',' + suffBL + sdDec + suffBL + CurrSubname;

sResult := AnsiUpperCase(sResult[1]) + Copy(sResult, 2, length(sResult) - 1);

Result := sResult;

end;

 

end.

 

 

С уважением,

 

Andrew Tkachenko

 

ООО "Проект ВО"

Украина, г.Харьков

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить