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;