Fungsi terbilang

Fungsi terbilang adalah suatu fungsi dimana mengkonvert angka menjadi kalimat. Contoh fungsi terbilang yang ada dalam kehidupan sehari-hari adalah: faktur, slip setor tabungan, dan lain sebagainya.

 

Fungsi terbilang boleh dibilang cukup simple tapi ruwet dalam algoritmanya. Karena fungsi terbilang menggunakan frasa-frasa bahasa yang digunakan. untuk contoh coding dibawah ini menggunakan bahasa Indonesia, untuk bahasa inggris atau bahasa yang lain, silakan modif source yang ada dibawah ini.

 

Berikut contoh coding yang saya buat di crystal report 8.5:

 

stringVar array angka := ["Nol", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Se"];

stringVar array satuan := ["belas", "puluh", "ratus", "ribu", "juta", "milyar", "triliun", "billiun"];

stringvar nil1;

stringvar nil2;

numbervar b;

stringvar a;

stringvar strtblg;

stringvar array matrix := ["","","","","","","","","","",""];

 

numbervar i;

numbervar j;

booleanvar nol;

 

b:=1;

a:=”";

nil2:=”";

strtblg = “”;

nil1:= “”;

for i := 2 to len(totext(Sum ({@totalall}, {ado.kode cc fad})))-3  do

(

  if mid(totext(Sum ({@totalall}, {ado.kode cc fad})),i,1) = “,” then

    nil1 := nil1

  else

    nil1 := nil1 & mid(totext(Sum({@totalall}, {ado.kode cc fad})),i,1);

);

nil2 := totext(nil1);

if len(nil2) >= 22 then

  strtblg = “”

else

(

    for i := len(nil1) to 1 step -1 do

    (  

        if len(nil1) = 4 then

        (

            matrix[b] := right(nil2,4);

            b:=b+1;

            i:=i-3;

            if len(nil2) – 4 >=1 then

                nil2 := left(nil2, len(nil2) – 4)

            else

                nil2:=nil2;

        )

        else

        (

            matrix[b] := right(nil2,3);

            b:=b+1;

            i:=i-2;

            if len(nil2) – 3 >=1 then

                nil2 := left(nil2, len(nil2) – 3)

            else

                nil2:=nil2;

           

        );

    );

    strtblg := “”;

    for j := b – 1 to 1 step -1 do

    (

        nil2:=matrix[j];

        nol:= false;

        for i := 1 to len(matrix[j]) do

        (

            a := mid(matrix[j],i,1);

            if a = “1″ then

            (

                if tonumber(mid(nil2,1,1))=0 then

                (

                    if i = 1 then nol := true;                 

                );

                if mid(matrix[j],i+1,1)= “1″ and len(nil2) = 2 then

                (  

                    strtblg := strtblg & angka[11] & satuan[1] & ” “;

                    i := len(matrix[j]) + 1;

                )

                else if mid(matrix[j],i+1,1)= “0″ and len(nil2) = 2 then

                (

                    strtblg := strtblg & angka[11] & satuan[2] & ” “;

                    i := len(matrix[j]) + 1;                    

                )

                else if len(nil2) = 1 then

                (

                    strtblg := strtblg & angka[tonumber(a)+1] & ” “;

                    0;

                )

                else if tonumber(mid(matrix[j],i+1,1)) > 1 and len(nil2) =  2 then

                (

                    strtblg := strtblg & angka[tonumber(mid(matrix[j],i+1,1))+1] & ” ” & satuan[1] & ” “;

                    i := len(matrix[j]) +1;

                )

                else

                (

                    strtblg := strtblg & angka[11] & satuan[len(nil2)] & ” “;

                    0;

                );

            )

            else

            ( 

                if tonumber(mid(nil2,1,1)) = 0 then

                (

                    if i = 1 then nol := true; 

                )

                else if len(nil2) = 1 then

                (

                    strtblg := strtblg & angka[tonumber(a)+1] & ” “;

                    nol := false;

                )

                else

                (

                    strtblg := strtblg & angka[tonumber(a)+1] & ” ” & satuan[len(nil2)-1+1] & ” “;

                    nol := false;

                );

                0;

            );

        

          if i <= len(matrix[j]) then nil2 := right(nil2,len(matrix[j])-i);

        );

      if j >= 2 and nol = false  then strtblg := strtblg & satuan[j+2] & ” “;

    );

);  

strtblg & “Rupiah.”;   

32 Responses

  1. Wah code yg bangus neh. kebetulan banget saya lagi cari fungsi terbilang kaya gini. btw pas saya jalanin kok ga bisa yach errornya di bagian ini :
    {@totalall}, {ado.kode cc fad}
    field unknow pesan errornya seperti itu.
    yg lebih saya ga ngerti bagian ado.kode cc fad itu apaan n buat apa?
    thanks.

  2. thx bro..

    {ado.kode cc fad} itu adalah field yang ada di database saya. anda bisa menggantinya dengan field yang anda punya.

  3. Kenapa sewaktu saya jalan kan di cristal report muncul pesan
    “The String Is Non-Numeric”?
    thanx atas jawabanya.

  4. itu berarti ada field yang u masukkan itu bukan numeric tapi string..
    coba d cek field atau value yang u pakai…

  5. yang saya kasih fungsi terbilang adalah berrasal dari subtotal.

  6. kesalahanya di awal coding.

  7. @totalall adalah field yang akan dijadikan terbilang dan di grouping berdasarkan field {kode cc fad}

  8. memang sewaktu saya mengecek errornya di tulis no-error found.
    tetapi waktu di preview dengan data sebenarnya langsung muncul msgbox
    the string is non-numeric.
    letak kesalahan diawal prog.
    stringVar array angka := [”Nol”, “Satu”, “Dua”, “Tiga”, “Empat”, “Lima”, “Enam”, “Tujuh”, “Delapan”, “Sembilan”, “Se”];
    saya sudah mengecek bahwa field yang saya totalkan memang numeric.
    ==>Sum ({@Jumlah}, {TBL_SLIP_HNR.NIP}).kalaulah string pasti gak akan bisa di subtotalkan?
    benak gak?
    apakah pernah mengalami hal seperti ini?
    thanx atas kemurahan hatinya telah menjawab masalah saya.
    apakah ada dalam bahasa basic syntax?

  9. thanx yo.
    udah bisa.
    rupanya pengaruh setting regional.karena setting punya saya munkin indonesia.
    jadi koma diganti titik.

  10. hehehe… baguslah kalau uda bisa…
    semoga berguna yah bro…

  11. Wah ini dia yang dicari2, great code.
    Dengan sedikit modifikasi settingan regional indonesia jg bs kok.
    Makasi byk.

  12. gw udah copy ini listing ke dalam crystal report. Yang gw butuhkan adalah pembilang angka puluhan misalnya 60 –> jadi Enam puluh, 11 –> jadi Sebelas.

    Setelah gw copy dan ganti fieldnya. yang tampil hanya angka satuannya saja
    contoh 11 –> yang tampil satu
    60 –> tidak tampil apa apa

    bagian mana yang perlu di ganti ya.

    Mohon bantuannya.

    Makasi

  13. yang perlu anda ganti sebenarnya hanya field {ado.kode cc fad}

    thx.

  14. Bro gimana memodifnya supaya bisa dipake buat regional seting yang indonesia.thx

  15. belum pernah coba bro…

    gw coba dulu d. tar gw post lagi disini

  16. gue dah bisa buat yang regional setingnya,tapi malah ketemu bug yang lain.sekarang kalo gue masukin angka 2,010,000 yang muncul cuman terbilang dua juta sepuluh rupiah.well,just info doank bro ,hehe.

  17. hello…

    coba ganti code ini;
    for i := 2 to len(totext(Sum ({@totalall}, {ado.kode cc fad})))-3 do

    (

    if mid(totext(Sum ({@totalall}, {ado.kode cc fad})),i,1) = “,” then

    nil1 := nil1

    else

    nil1 := nil1 & mid(totext(Sum({@totalall}, {ado.kode cc fad})),i,1);

    );

    dengan :

    for i := 3 to len(totext(Sum ({@totalall}, {ado.kode cc fad})))-3 do
    (
    if mid(totext(Sum ({@totalall}, {ado.kode cc fad})),i,1) = “.” then
    nil1 := nil1
    else
    nil1 := nil1 & mid(totext(Sum({@totalall}, {ado.kode cc fad})),i,1);
    );

    sisanya jangan diganti, kecuali field2 tertentu

    thx.

  18. mas, knp waktu saya coba, muncul bug “a number field or currency amount field is required here”..
    trus kursor nya menuju ke
    for i := 2 to len(totext(Sum({@totalall}, {@totalharga})))-3 do
    error nya pada @tottalall..dimana ya yang salah?
    tx ya

  19. @totalall adalah variabel yang saya gunakan untuk menjumlahkan 1 atau field yang nantinya saya gunakan untuk ditranslate ke terbilang.

    thx.

  20. saya udah ganti jg dgn :
    for i := 2 to len(totext(Sum({@totalharga}, {TJUAL3.csubtot})))-3 do

    dimana @totalharga adalah hasil perhitungan dari harga satuan x jumlah..

    tp muncul error lagi dgn debug :
    “the summary / running total field could not be created”

    cursor di tempatkan pada :
    stringVar array angka := ["Nol", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh", "Delapan", "Sembilan", "Se"];

    sori ya mas layong, jadinya merepotkan…tx

  21. sepertinya salah di TJUAL3.csubtot.
    jadi fungsi sum disini adalah:
    jumlahkan @totalall yang dikelompokan berdasarkan “sesuatu”.
    semoga membantu yah.
    thx.

  22. mas layong, sori bgt neh …
    saya udah ganti jd :
    for i := 2 to len(totext(Sum(Sum ({@totalharga}, {TJUAL2.faktur}), {TJUAL2.faktur})))-3 do

    dengan asumsi :
    - sum({@totalharga},{tjual2.faktur}) adalah penjumlahan dari @totalharga
    dan di group berdasarkan tjual2.faktur

    tapi masih jg error nya sama
    jadi gimana neh? :(

  23. sori baru bales.
    saya bingung di bagian ini:
    Sum(Sum ({@totalharga}, {TJUAL2.faktur}), {TJUAL2.faktur})

    bisa kasih tau struktur databasenya?
    thx.

  24. kalo dibutuhkan untuk membaca angka di belakang koma bisa ngga ya mas layong ??

    thx sebelumnya.

  25. bisa aja. tapi, harus ditambah codingnya untuk baca angka yang dibelakang koma.

  26. boleh kasih saran penambahan coding di bagian mana nya ya mas layong ??
    soalnya kan di program itu sudah membaca full length dr nilai nominalnya kemudian di cari point “.”
    saya sudah coba edit prog mas layong tapi ngga berhasil.
    algoritma prog nya kurang saya pahami, jadi saya takut utk membongkarnya lebih jauh ntar malah ngga jalan..
    bisa dibantu mas layong ?

  27. sesudah baris code ini:
    if j >= 2 and nol = false then strtblg := strtblg & satuan[j+2] & ” “;

    setelah itu cek seperti biasa aja seperti dari awal lagi, karena sehabis koma itu secara logika saya sih harusnya dicek ulang lagi seperti dari awal cuma tidak usah cek tanda “.” karena sehabis koma tidak ada lagi tanda titik lagi.

    semoga membantu yah.

    nanti kalau saya sempat kotak katik, saya posting lagi d.

    thx.

  28. Maaf mas layong saya kurang paham soal penjelasan mas layong diatas..
    Saya juga mau tanya di prog :
    for i := 1 to len(angkatoteks)-3 do
    kenapa len dr nominal di minus 3 ??
    waktu saya coba untuk akses 3 digit terakhir dr angka (yg saya pikir 2 angka di blkg koma) program malah error
    “the string is non-numeric” lagi..
    kalo bisa diposting ulang akan sangat membantu ya..
    makasih mas layong..

  29. sori mas confuse, saat ini aku tidak bisa membantu. aku sedang mengalami musaibah kebakaran. nanti kalau aku sudah fokus, nanti aku bantu d. thx

  30. ato bisa juga dengan membuat dll dengan kata depan CRUFLxxx. kemudian register. untuk dll yang dibuat dengan vb6 sangat mudah membuat dan diregistrasi dengan regsrv32 CRUFLTerbilang.dll, nanti akan muncul sebagai additional function di CR. untuk dll yang dibuat di dotnet memang tidak semudah membuat dll di vb6. baiknya liat dulu refrerensi ke msdn http://msdn.microsoft.com/en-us/library/ms227603.aspx , untuk registernya contoh regasm /codebase CRUFL_VBNet_Terbilang.dll. ingat untuk membuat dll under .net harus benar2 memperhatikan contoh di msdn.

  31. contoh dll yang sudah jadi bs anda donlod disini: http://125.163.73.146/dll/ . register untuk vb 6 regsvr32 CRUFLTerbilangVB6.dll untuk dot net regasm /codebase CRUFL_VBNet_Terbilang.dll menggunakan cmd

Leave a Reply