Zegge
Een Delphi functie om een bedrag uit te schrijven in tekst. 't Is niet zo flexibel en niet zo compact, maar het werkt in ieder geval wel. Leuk voor de knutselaar :-)
function Zegge(const Val: string): string; overload;
function TranslatePart( Part: string; Power: Integer ): string;
const
Pwr: array[0..9] of string = (
'', 'duizend', 'miljoen', 'miljard', 'biljoen', 'biljard',
'triljoen', 'triljard', 'ziljoen', 'ziljard' );
Pre: array[1..9] of string = (
'één', 'twee', 'drie', 'vier', 'vijf', 'zes', 'zeven', 'acht', 'negen');
Tieners: array[0..9] of string = ('tien', 'elf', 'twaalf', 'dertien',
'veertien', 'vijftien', 'zestien', 'zeventien', 'achttien', 'negentien' );
Decai: array[2..9] of string = ( 'twintig', 'dertig', 'veertig', 'vijftig',
'zestig', 'zeventig', 'tachtig', 'negentig' );
var
i, Uni, Deca, Cent: Integer;
begin
Result := '';
Uni := StrToInt(Part[3]);
Deca := StrToInt(Part[2]);
Cent := StrToInt(Part[1]);
if Cent > 0 then
begin
if Cent > 1 then
Result := Pre[Cent]; //zoveelhonderd
Result := Result + 'honderd';
end;
if (Cent = 1) and (Deca = 0) and (uni>0) then //honderd _en_ vijf
Result := Result + '-en-';
if Deca = 1 then // dertien
Result := Result + Tieners[Uni]
else
begin
{if Uni = 1 then
Result := Result + 'een' // Pre[] biedt deze waarde niet.}
if Uni > 0 then
Result := Result + Pre[Uni];
if (Uni > 0) and (Deca > 0) then
Result := Result + 'en';
if Deca > 0 then
Result := Result + Decai[Deca];
end;
if Result > '' then
begin
if (Cent+Deca=0) and (Uni=1) and (Power=1) then // eenduizend --> duizend
Result := '';
Result := Result + Pwr[Power] + ' ';
end;
end;
function TranslateChunk(Chunk: string): string;
var
i: Integer;
s: string;
begin
i := 0;
while length(Chunk) >= 3 do
begin
s := copy(Chunk, Length(Chunk)-2, 3);
Result := TranslatePart(s,i) + Result;
Delete(Chunk, Length(Chunk)-2, 3);
Inc(i);
end;
Result := Trim(Result);
end;
const
nul: string = 'nul';
var
d, v: string;
i: Integer;
begin
if length(val) > 30 then
raise Exception.Create( 'Invoer te lang' );
v := '000' + val;
Result := '';
i := Pos(',', v);
if i > 0 then
begin
d := Copy(v, i+1, length(v));
if length(d) > 2 then
raise Exception.Create( 'Maximaal 2 cijfers achter de komma toegestaan' );
d := '000' + d;
v := Copy(v, 1, i-1);
Result := TranslateChunk(d);
if Result <> '' then
Result := ' en ' + Result + ' cent';
end;
v := Trim(TranslateChunk(v));
if v = '' then
v := nul;
Result := v + ' Euro' + Result;
end;
function Zegge(const Val: Int64): string; overload;
begin
Result := Zegge(IntToStr(Val));
end;