Feed on
Posts
Comments

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.

5 Responses to “Object Pascal: Terbilang”

  1. Mpu Gondrong says:

    Luar biasa, ini adalah rutin yang sangat indah menurut saya, dan bekerja sempurna sekali. Tapi kira-kira jalan ndak ya, wong aku blom coba tuh. Hehehe. ;-)

  2. Roy Irwan says:

    Ha..ha.. si boss nongol disini…

  3. dwi says:

    fungsi terbilangnya emang udah bisa berjalan. Tapi yang versi inggrisnya gimana ya?
    bapak bisa bantuin saya ga?
    Mohon bantuan nya ya!
    terima kasih banyak. atas dibacanya comment ini. :)

  4. Roy Irwan says:

    Sorry, habis wik-en, jadi baru kebaca sekarang.
    Thanks udah test rutinnya.
    Kalo yg bahasa Inggris kayaknya banyak di internet. Coba google dg keyword ‘numbers to words delphi’.
    Salah satunya mungkin bisa dilihat di sini

    Gut lak… :)

  5. [...] belum pernah saya pake untuk produksi yang beneran. Sebenarnya fungsi ini hanya porting dari yang versi Pascal-nya (namanya juga baru [...]

Leave a Reply