Di milis delphindo dari tahun ke tahun banyak para new comer yang nanya program untuk mengkonversi dari numerik menjadi string dalam format kata-kata. Atau banyak yang nyebut sebagai rutin terbilang. Ada beberapa sesepuh milis yang merujuk ke site tertentu atau arsip milis untuk menjawab pertanyaan ini. Tapi, sebagai alternatif, berikut saya coba berikan rutin terbilang.

function NumberToText(FValue: Double): string;
var
  i, nPosisi, nDigit: Integer;
  bAllZeros: Boolean;
  strHasil, strTemp, tmpBuff: string;
begin
  if Frac(FValue) <> 0 then
    strHasil := NumberToText(Round(Frac(FValue) * 100)) + ' sen'
  else
    strHasil := '';
  strTemp := FloatToStr(Int(FValue));
  for i := Length(strTemp) downto 1 do
  begin
    nDigit := StrToInt(Copy(strTemp, i, 1));
    nPosisi := (Length(strTemp) - i) + 1;
    case (nPosisi mod 3) of
      1:
        begin
          bAllZeros := False;
          if i = 1 then
            tmpBuff := Satuan[nDigit] + ' '
          else if (Copy(strTemp, i - 1, 1) = '1') then
            tmpBuff := Belasan[nDigit] + ' '
          else if nDigit > 0 then
            tmpBuff := Satuan[nDigit] + ' '
          else
          begin
            bAllZeros := True;
            if i > 1 then
              if Copy(strTemp, i - 1, 1) <> '0' then
                bAllZeros := False;
            if i > 2 then
              if Copy(strTemp, i - 2, 1) <> '0' then
                bAllZeros := False;
            tmpBuff := '';
          end;
          if (bAllZeros = False) and (nPosisi > 1) then
            if (Length(strTemp) = 4) and
              (Copy(strTemp, 1, 1) = '1') then
              tmpBuff := 'se' + Ribuan[Round(nPosisi / 3)] + ' '
            else
              tmpBuff := tmpBuff + Ribuan[Round(nPosisi / 3)] + ' ';
          strHasil := tmpBuff + strHasil;
        end;
      2: if nDigit > 0 then
          strHasil := Puluhan[nDigit] + ' ' + strHasil;
      0: if nDigit > 0 then
          if nDigit = 1 then
            strHasil := 'seratus ' + strHasil
          else
            strHasil := Satuan[nDigit] + ' ratus ' + strHasil;
    end;
  end;
  if Length(strHasil) > 0 then
    strHasil := UpperCase(Copy(strHasil, 1, 1)) +
      Copy(strHasil, 2, Length(strHasil) - 1);
  Result := strHasil;
end;

Sorry nggak ada comment atau uraian apa-apa, ya. Soalnya rutin ini udah lama saya punya, dan kepakenya juga baru sekali doang. Rutin ini juga hasil kontribusi dari beberapa pihak, cuman saya udah nggak jelas lagi sumbernya dari mana aja.

Mudah-mudahan di waktu yang akan datang saya sempat update post ini untuk uraian yang lebih jelas lagi.

Mohon koreksi ato bug report-nya, ya via comments below.

Oh ya, satu lagi, ini rutin belum dicoba di FreePascal, baru pernah dipake di Delphi doang.

Iklan