Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Число украинской строкой

01.01.2007
unit UkrRecog;
{копирайт непомню чей. Был для русских циферок, а я переделал под
украинские}
{если кто что найдет пришлите
 
}
{by Andrew Tkachenko, proektwo@netcity.ru, Ukraine,
 
}
interface
 
const
 
 
UkrMonthString: array[1..12] of string[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 := 1 to 13 do
   
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 + 'оди'
                     
else if (i = 10) and (not IsRange1019) then
                        sResult
:= sResult + 'одна '
                     
else
                        sResult
:= sResult + 'один' {ин};
 
                     
if IsRange1019 and (i = 13) then
                        sResult
:= sResult + 'адцять' + suffBL
                     
else if 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
                 
else if (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
               
else if currNum = '1' then
                  endMlx
:= suffBL
               
else if (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
                 
else if currNum = '1' then
                    endMlx
:= suffBL
                 
else if (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
                 
else if currNum = '1' then
                    endMlx
:= aa + suffBL
                 
else if (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

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

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

Взято из Советов по Delphi от Валентина Озерова

Сборник Kuliba