Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Zamiana liczb na postac slowna z polska gramatyka - Delphi/liczby_z_gramatyka.dpr:
//zamiana liczb na postać słowną z polską gramatyką
//Stefan Pruszkiewicz
//www.algorytm.org
program liczby_z_gramatyka;
{$APPTYPE CONSOLE}
uses
SysUtils;
function Slownie(Liczba : Int64) : string;
const Liczby : array [0..9,0..3] of string [17] =
(('', '', '', ''),
('jeden ', 'jedenascie ', 'dziesiec ', 'sto '),
('dwa ', 'dwanascie ', 'dwadziescia ', 'dwiescie '),
('trzy ', 'trzynascie ', 'trzydziesci ', 'trzysta '),
('cztery ', 'czternascie ', 'czterdziesci ', 'czterysta '),
('piec ', 'pietnascie ', 'piecdziesiat ', 'piecset '),
('szesc ', 'szesnascie ', 'szescdziesiat ', 'szescset '),
('siedem ', 'siedemnascie ', 'siedemdziesiat ', 'siedemset '),
('osiem ', 'osiemnascie ', 'osiemdziesiat ', 'osiemset '),
('dziewiec ','dziewietnascie ','dziewiecdziesiat ','dziewiecset '));
Grupy : array [0..6,0..2] of string [11] =
(('' ,'' ,''),
('tysiac ' ,'tysiace ' ,'tysiecy '),
('milion ' ,'miliony ' ,'milionow '),
('miliard ','miliardy ','miliardow '),
('bilion ' ,'biliony ' ,'bilionow '),
('biliard ','biliardy ','biliardow '),
('trylion ','tryliony ','trylionow '));
var J,N,D,S,G,K : Byte; {Jednostki,Nastki,Dziesiatki,Setki,Grupy,Koncowki}
Znak : string;
begin
G:=0;
if Liczba<0 then Znak:='minus ' else Znak:='';
if Liczba=0 then Slownie:='zero' else
repeat
S:=Abs(Liczba) mod 1000 div 100;
D:=Abs(Liczba) mod 100 div 10;
J:=Abs(Liczba) mod 10;
if (D=1) and (J>0) then {Warunek do obsługi nastek}
begin
N:=J;
D:=0;
J:=0
end else N:=0;
case J of {Tu zawiera sie cała gramatyka, wybór końcówki}
1 : if S+D+N>0 then K:=2 else K:=0;
2..4 : K:=1
else K:=2 end;
if S+D+N+J>0 then
Result:=Liczby[S,3]+Liczby[D,2]+Liczby[N,1]+Liczby[J,0]+Grupy[G,K]+Result;
Liczba:=Liczba div 1000;
Inc(G)
until Liczba=0;
Result:=Znak+Result
end;
Begin
Writeln(Slownie(9223372036854775807));
Readln {9'223'372'036'854'775'807}
End.