Tolong pilih kategori sesuai, jenis posting (diskusi atau bukan) dan sertakan tag/topik yang sesuai seperti komputer, java, php, mysql, dll. Promosi atau posting tidak pada tempatnya akan kami hapus!
- Bagi Anda yang ingin mendaftar, baca link berikut:
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

[PHP & Javascript] Fungsi terbilang dengan sen dan format angka dengan desimal

Perasaan dulu pak boo dah pernah posting fungsi terbilang pake javascript deh, tapi kemana ya? :D
yang pake desimal.




PHP (format angka & terbilang) :
diskusiweb.com/discussion/comment/280669/#Comment_280669

Javascript (format angka & terbilang) :

versi 1
diskusiweb.com/discussion/comment/265065/#Comment_265065
masalah versi 1
diskusiweb.com/discussion/comment/280655/#Comment_280655

versi 2
diskusiweb.com/discussion/comment/280656/#Comment_280656
diskusiweb.com/discussion/comment/280657/#Comment_280657

Javascript hanya format angka (bukan terbilang) :
menggunakan .toLocaleString(), ada keterbatasan
diskusiweb.com/discussion/comment/280674/#Comment_280674

Comments

  • edited June 2014
    search : calc

    eh, terbilang yo ?
    search : terbilang
  • udah, tp yg muncul malah ga nyambung  #-o
  • edited May 7
    http://www.diskusiweb.com/discussion/32185/javascript-convert-to-rupiah/p1

    gw malah ketemunya pake gugel ... :D

    https://www.google.co.id/search?q="sen"+site:diskusiweb.com
    soalnya malah inget pernah nulis kagak tau ejaan buat "sen" nya :D
  • edited May 7
    berhasil thank u  :-*

    btw threadnya jadul bgt ya 
    :D
  • edited May 7
    ho-oh ... dan sampai sekarang terbilang sen nya belum diberesin :D

    sekalian dah diberesin :

    <script>
      var thoudelim=".";
      var decdelim=",";
      var curr="Rp ";
      var d=document;

      // format(1000000.5,3) : 1.000.000,500
      // format(1000000.55555,3) : 1.000.000,556

      function format(s,r) {
        s=Math.round(s*Math.pow(10,r))/Math.pow(10,r);
        s=String(s);s=s.split(".");var l=s[0].length;var t="";var c=0;
        while(l>0){t=s[0][l-1]+(c%3==0&&c!=0?thoudelim:"")+t;l--;c++;}
        s[1]=s[1]==undefined?"0":s[1];
        for(i=s[1].length;i<r;i++) {s[1]+="0";}
        return curr+t+decdelim+s[1];
      }

      function threedigit(word) {
        eja=Array("Nol","Satu","Dua","Tiga","Empat","Lima","Enam","Tujuh","Delapan","Sembilan");
        while(word.length<3) word="0"+word;
        word=word.split("");
        a=word[0];b=word[1];c=word[2];
        word="";
        word+=(a!="0"?(a!="1"?eja[parseInt(a)]:"Se"):"")+(a!="0"?(a!="1"?" Ratus":"ratus"):"");
        word+=" "+(b!="0"?(b!="1"?eja[parseInt(b)]:"Se"):"")+(b!="0"?(b!="1"?" Puluh":"puluh"):"");
        word+=" "+(c!="0"?eja[parseInt(c)]:"");
        word=word.replace(/Sepuluh ([^ ]+)/gi, "$1 Belas");
        word=word.replace(/Satu Belas/gi, "Sebelas");
        word=word.replace(/^[ ]+$/gi, "");

        return word;
      }

      // 1 SEN = 1/100 RUPIAH = 0.01 RUPIAH

      // sayit(1000000) : SATU JUTA RUPIAH
      // sayit(1000000.5) = 1000000.50 : SATU JUTA RUPIAH LIMA PULUH SEN
      // sayit(1000000.05) : SATU JUTA RUPIAH LIMA SEN
      // sayit(1000000.11) : SATU JUTA RUPIAH SEBELAS SEN
      // sayit(1000000.55555) = 1000000.56 : SATU JUTA RUPIAH LIMA PULUH ENAM SEN

      function sayit(s) {
        var thousand=Array("","Ribu","Juta","Milyar","Trilyun");
        s=Math.round(s*Math.pow(10,2))/Math.pow(10,2);
        s=String(s);s=s.split(".");
        var word=s[0];
        var cent=s[1]?s[1]:"0";
        if(cent.length<2) cent+="0";

        var subword="";i=0;
        while(word.length>3) {
          subdigit=threedigit(word.substr(word.length-3, 3));
          subword=subdigit+(subdigit!=""?" "+thousand[i]+" ":"")+subword;
          word=word.substring(0, word.length-3);
          i++;
        }
        subword=threedigit(word)+" "+thousand[i]+" "+subword;
        subword=subword.replace(/^ +$/gi,"");

        word=(subword==""?"NOL":subword.toUpperCase())+" RUPIAH";
        subword=threedigit(cent);
        cent=(subword==""?"":" ")+subword.toUpperCase()+(subword==""?"":" SEN");
        return word+cent;
      }

      document.write(format(1000000.5,3)+"<br>");
      document.write(format(1000000.55555,3)+"<br>");

      document.write(sayit(1000000)+"<br>");
      document.write(sayit(1000000.5)+"<br>");
      document.write(sayit(1000000.05)+"<br>");
      document.write(sayit(1000000.11)+"<br>");
      document.write(sayit(1000000.55555)+"<br>");
    </script>
  • wkwkwkwk, sip sip sip..
  • edited May 7
    gajah said:

    <script>
    var thoudelim=".";
    var decdelim=",";
    var curr="Rp ";
    var d=document;

    // format(1000000.5,3) : 1.000.000,500
    // format(1000000.55555,3) : 1.000.000,556

    function format(s,r) {
    s=Math.round(s*Math.pow(10,r))/Math.pow(10,r);
    s=String(s);s=s.split(".");var l=s[0].length;var t="";var c=0;
    while(l>0){t=s[0][l-1]+(c%3==0&&c!=0?thoudelim:"")+t;l--;c++;}
    s[1]=s[1]==undefined?"0":s[1];
    for(i=s[1].length;i<r;i++) {s[1]+="0";}
    return curr+t+decdelim+s[1];
    }

    function threedigit(word) {
    eja=Array("Nol","Satu","Dua","Tiga","Empat","Lima","Enam","Tujuh","Delapan","Sembilan");
    while(word.length<3) word="0"+word;
    word=word.split("");
    a=word[0];b=word[1];c=word[2];
    word="";
    word+=(a!="0"?(a!="1"?eja[parseInt(a)]:"Se"):"")+(a!="0"?(a!="1"?" Ratus":"ratus"):"");
    word+=" "+(b!="0"?(b!="1"?eja[parseInt(b)]:"Se"):"")+(b!="0"?(b!="1"?" Puluh":"puluh"):"");
    word+=" "+(c!="0"?eja[parseInt(c)]:"");
    word=word.replace(/Sepuluh ([^ ]+)/gi, "$1 Belas");
    word=word.replace(/Satu Belas/gi, "Sebelas");
    word=word.replace(/^[ ]+$/gi, "");

    return word;
    }

    // 1 SEN = 1/100 RUPIAH = 0.01 RUPIAH

    // sayit(1000000) : SATU JUTA RUPIAH
    // sayit(1000000.5) = 1000000.50 : SATU JUTA RUPIAH LIMA PULUH SEN
    // sayit(1000000.05) : SATU JUTA RUPIAH LIMA SEN
    // sayit(1000000.11) : SATU JUTA RUPIAH SEBELAS SEN
    // sayit(1000000.55555) = 1000000.56 : SATU JUTA RUPIAH LIMA PULUH ENAM SEN

    function sayit(s) {
    var thousand=Array("","Ribu","Juta","Milyar","Trilyun");
    s=Math.round(s*Math.pow(10,2))/Math.pow(10,2);
    s=String(s);s=s.split(".");
    var word=s[0];
    var cent=s[1]?s[1]:"0";
    if(cent.length<2) cent+="0";

    var subword="";i=0;
    while(word.length>3) {
    subdigit=threedigit(word.substr(word.length-3, 3));
    subword=subdigit+(subdigit!=""?" "+thousand[i]+" ":"")+subword;
    word=word.substring(0, word.length-3);
    i++;
    }
    subword=threedigit(word)+" "+thousand[i]+" "+subword;
    subword=subword.replace(/^ +$/gi,"");

    word=(subword==""?"NOL":subword.toUpperCase())+" RUPIAH";
    subword=threedigit(cent);
    cent=(subword==""?"":" ")+subword.toUpperCase()+(subword==""?"":" SEN");
    return word+cent;
    }

    document.write(format(1000000.5,3)+"<br>");
    document.write(format(1000000.55555,3)+"<br>");

    document.write(sayit(1000000)+"<br>");
    document.write(sayit(1000000.5)+"<br>");
    document.write(sayit(1000000.05)+"<br>");
    document.write(sayit(1000000.11)+"<br>");
    document.write(sayit(1000000.55555)+"<br>");
    </script>
    Hasil




    [1]
    Akan bermasalah jika menghadapi angka ekstra besar
    Misal : 1234567890123456789012345678.901234567890123
      document.write(format(1234567890123456789012345678.901234567890123,3)+"<br>");
    document.write(sayit(1234567890123456789012345678.901234567890123)+"<br>");




    [2]
    Perbandingan di PHP dengan menggunakan NumberFormatter class
    pastikan ekstensi php_intl.dll aktif :
    extension=php_intl.dll

    Bahasa Inggris
    <?php
    // Object oriented style
    $format = new NumberFormatter( 'en' , NumberFormatter::SPELLOUT );
    echo '1234567.89 = ' . $format->format( 1234567.89 );

    echo '<br><br>';

    // Procedural style
    $format = numfmt_create( 'en' , NumberFormatter::SPELLOUT );
    echo '1234567.89 = ' . numfmt_format( $format , 1234567.89 );
    ?>
    Hasil



    Bahasa Indonesia
    <?php
    // Object oriented style
    $format = new NumberFormatter( 'id' , NumberFormatter::SPELLOUT );
    echo '1234567.89 = ' . $format->format( 1234567.89 );

    echo '<br><br>';

    // Procedural style
    $format = numfmt_create( 'id' , NumberFormatter::SPELLOUT );
    echo '1234567.89 = ' . numfmt_format( $format , 1234567.89 );
    ?>
    Hasil

    satu juta dua ratus tiga puluh empat ribu lima ratus enam puluh tujuh titik delapan sembilan

    Ada KESALAHAN PENGEJAAN di situ.
    Dasar pengejaan menggunakan angka format internasional, dimana angka desimal memakai separator "." / TITIK
    Padahal pada bahasa Indonesia, pemisah desimal itu "," / KOMA

    Seharusnya dieja :
    satu juta dua ratus tiga puluh empat ribu lima ratus enam puluh tujuh KOMA delapan sembilan

    Jika menggunakan KOMA :
    ... KOMA delapan sembilan (angka dieja satu persatu)

    Berbeda dgn jika menyebut SEN :
    ... delapan PULUH sembilan SEN (angka dieja dengan puluhan)

    Batas SEN hanya 0 - 99, karena 100 sen = 1 rupiah
    Minimal : nol sen
    Maksimal : sembilan puluh sembilan sen

    Rupiah saat ini memang tidak menggunakan SEN, penulisan hanya sekedar formalitas saja.

    Berangkat dari pengejaan ini berarti ada 2 jenis bentuk terbilang.
    - menggunakan KOMA (belum ada di koding awal)
    POINT dlm bahasa Inggris : 100.56 = one hundred POINT five six
    KOMA dlm bahasa Indonesia : 100,56 = seratus KOMA lima enam

    - menggunakan SEN (sudah ada di koding awal)
    CENTS dlm bahsa Inggris : 100.56 = one hundred AND fifty six CENTS
    SEN dlm bahasa Indonesia :
    ... bisa menggunakan DAN
    100.56 = seratus DAN lima puluh enam SEN
    ... bisa menggunakan RUPIAH
    100.56 = seratus RUPIAH lima puluh enam SEN
  • edited May 7
    terbilang.js
    const CENT=0;
    const POINT=1;
    const NOMINAL=Array("Nol","Satu","Dua","Tiga","Empat","Lima","Enam","Tujuh","Delapan","Sembilan");
    const THOUDELIM=".";
    const DECDELIM=",";
    var d=document;

    function format_v2(s,r,curr="") {
    s+="";
    regexp=/^(\d*\.\d+|\d+)$/gi

    if(regexp.test(s)) {
    s=s.replace(/^0+/gi, "");
    s=s.split(".");
    s[1]=Math.round(s[1]/Math.pow(10,s[1].length-r))+"";
    var l=s[0].length;var t="";var c=0;
    if(l==0){s[0]="0";l=1;};
    while(l>0){t=s[0][l-1]+(c%3==0&&c!=0?THOUDELIM:"")+t;l--;c++;}
    s[1]=s[1]==undefined?"0":s[1];
    for(i=s[1].length;i<r;i++) {s[1]+="0";}
    return curr+t+DECDELIM+s[1];
    }
    else return "ERROR: Invalid number format";
    }

    function threedigit(word) {
    while(word.length<3) word="0"+word;
    word=word.split("");
    a=word[0];b=word[1];c=word[2];
    word="";
    word+=(a!="0"?(a!="1"?NOMINAL[parseInt(a)]:"Se"):"")+(a!="0"?(a!="1"?" Ratus":"ratus"):"");
    word+=" "+(b!="0"?(b!="1"?NOMINAL[parseInt(b)]:"Se"):"")+(b!="0"?(b!="1"?" Puluh":"puluh"):"");
    word+=" "+(c!="0"?NOMINAL[parseInt(c)]:"");
    word=word.replace(/Sepuluh ([^ ]+)/gi, "$1 Belas");
    word=word.replace(/Satu Belas/gi, "Sebelas");
    word=word.replace(/^[ ]+$/gi, "");

    return word;
    }

    function sayit_v2(s,t=CENT,r=2,curr="RUPIAH") {
    if(isNaN(t)) {
    t.toUpperCase().replace(/^\s+|\s+$/g,'');
    t=t=="POINT"?POINT:CENT;
    }
    t=t==POINT?POINT:CENT;
    if(t==CENT) r=2;

    s+="";
    regexp=/^(\d*\.\d+|\d+)$/gi

    if(regexp.test(s)) {
    s=s.replace(/^0+/gi, "");
    var zero3=Array(
    "","Ribu","Juta","Milyar","Trilyun","Kuadriliun",
    "Kuantiliun","Sekstiliun","Septiliun","Oktiliun",
    "Noniliun","Desiliun"
    );

    s=s.split(".");
    s[1]=Math.round(s[1]/Math.pow(10,s[1].length-r))+"";
    var word=s[0];
    var cent=s[1]?s[1]:(t==CENT?"0":"");
    if(cent.length<2 && t==CENT) cent+="0";

    var subword="";i=0;
    while(word.length>3) {
    subdigit=threedigit(word.substr(word.length-3, 3));
    subword=subdigit+(subdigit!=""?" "+zero3[i]+" ":"")+subword;
    word=word.substring(0, word.length-3);
    i++;
    }
    subword=threedigit(word)+" "+zero3[i]+" "+subword;
    subword=subword.replace(/^ +$/gi,"");

    word=(subword==""?"NOL":subword.toUpperCase())+(t==CENT?" "+curr:" KOMA");

    if(t==CENT){subword=threedigit(cent);}
    else{
    subword=[];
    for(i in cent) subword.push(NOMINAL[cent[i]]);
    subword=subword.join(" ");
    }
    cent=(subword==""?"":" ")+subword.toUpperCase()+(subword==""||t==POINT?"":" SEN");

    return word+cent;
    }
    else return "ERROR: Invalid number format";
    }
  • edited May 7
    <script src="terbilang.js"></script>
    <script>
    d.write(
    "<b>ANGKA</b><br>"+"1234567890123456789012345678.901234567890123<br><br><br>" +

    "<b>FORMAT</b><br>format_v2( angka , desimal , matauang )<br>"+
    "format_v2( \"1234567890123456789012345678.901234567890123\" , 4 )<br><br>" +
    format_v2( "1234567890123456789012345678.901234567890123" , 4 ) + "<br><br><br>" +

    "<b>FORMAT</b><br>format_v2( angka , desimal , matauang )<br>"+
    "format_v2( \"1234567890123456789012345678.901234567890123\" , 2 , \"Rp \" )<br><br>" +
    format_v2( "1234567890123456789012345678.901234567890123" , 2 , "Rp " ) + "<br><br><br>" +

    "<b>TERBILANG</b><br>sayit_v2( angka , [ CENT | POINT ] , desimal , matauang=\"RUPIAH\" )<br>" +
    "desimal : hanya dianggap jika menggunakan POINT, jika menggunakan CENT otomatis pembulatan 2 digit<br>" +
    "matauang : hanya dianggap jika menggunakan CENT, jika menggunakan POINT tidak akan muncul<br><br>" +
    "sayit_v2( \"1234567890123456789012345678.901234567890123\" , CENT , 4 ) // pembulatan 4 digit tidak dianggap karena menggunakan CENT<br><br>" +
    sayit_v2( "1234567890123456789012345678.901234567890123" , CENT , 4 ) + "<br><br><br>" +

    "<b>TERBILANG</b><br>sayit_v2( angka , [ CENT | POINT ] , desimal , matauang=\"RUPIAH\" )<br>" +
    "desimal : hanya dianggap jika menggunakan POINT, jika menggunakan CENT otomatis pembulatan 2 digit<br>" +
    "matauang : hanya dianggap jika menggunakan CENT, jika menggunakan POINT tidak akan muncul<br><br>" +
    "sayit_v2( \"1234567890123456789012345678.901234567890123\" , POINT , 4 , \"RUPIAH\" ) // matauang \"RUPIAH\" tidak dianggap karena menggunakan POINT<br><br>" +
    sayit_v2( "1234567890123456789012345678.901234567890123" , POINT , 4 , "RUPIAH" )
    );
    </script>
    Hasil
  • edited May 7
    kalo php mah ... selama librari php_intl.dll aktif ...

    format angka tinggal pake : number_format()
    terbilang tinggal pake : NumberFormatter
    ada keterbatasan tidak bisa untuk angka ekstra panjang

    masalah SEN atau KOMA ... tinggal buat fungsi sendiri ...
    <?php
    define('CENT',0);
    define('POINT',1);

    function sayit($nominal,$cent=CENT,$desimal=2,$matauang='RUPIAH') {
    $format = numfmt_create( 'id' , NumberFormatter::SPELLOUT );

    if($cent!=POINT) $cent=trim(strtoupper($cent))=='POINT'?POINT:CENT;
    if($cent==CENT) $desimal=2;

    $nominal = round($nominal,$desimal);
    $words='';

    if($cent==CENT) {
    $nominal = explode( '.' , $nominal );
    if(isset($nominal[1]) && $nominal[1]<10) $nominal[1].='0';
    $words.=strtoupper(numfmt_format( $format , $nominal[0] )).' '.$matauang;
    $words.=isset($nominal[1])?' ' . strtoupper(numfmt_format( $format , $nominal[1] )) . ' SEN':'';
    }
    else {
    $words=str_replace('TITIK','KOMA',strtoupper(numfmt_format( $format , $nominal )));
    }

    return $words;
    }

    echo number_format(12345.67890,4,',','.').'<br><br>'; // 12.345,6789
    echo 'Rp '.number_format(12345.67890,2,',','.').'<br><br>'; // Rp 12.345,68

    echo sayit(123).'<br><br>'; // SERATUS DUA PULUH TIGA RUPIAH (default CENT)
    echo sayit(123,POINT).'<br><br>'; // SERATUS DUA PULUH TIGA

    echo sayit(123.45678).'<br><br>'; // SERATUS DUA PULUH TIGA RUPIAH EMPAT PULUH ENAM SEN (default CENT, pembulatan 2 digit)
    echo sayit(123.45678,POINT).'<br><br>'; // SERATUS DUA PULUH TIGA KOMA EMPAT ENAM (default pembulatan 2 digit)

    echo sayit(123.45678,CENT,4).'<br><br>'; // SERATUS DUA PULUH TIGA RUPIAH EMPAT PULUH ENAM SEN (jika menggunakan CENT pembulatan 4 tidak dianggap)
    echo sayit(123.45678,POINT,4).'<br><br>'; // SERATUS DUA PULUH TIGA KOMA EMPAT LIMA ENAM DELAPAN

    echo sayit(123.45678,CENT,4,'DOLAR').'<br><br>'; // SERATUS DUA PULUH TIGA DOLAR EMPAT PULUH ENAM SEN
    echo sayit(123.45678,POINT,4,'DOLAR').'<br><br>'; // SERATUS DUA PULUH TIGA KOMA EMPAT LIMA ENAM DELAPAN (jika menggunakan POINT matauang tidak dianggap)
    ?>


    dari tret lama tahun 2013 ...
    http://diskusiweb.com/discussion/comment/257835/#Comment_257835
    . said:

    librari milik php, versi php 5.3.0 keatas
    aktifkan librari : php_intl.dll
    kagak bisa utk spellout indonesia
    http://www.php.net/manual/en/class.numberformatter.php

    contoh pemakaian
    <?php
    $f = new NumberFormatter('en', NumberFormatter::SPELLOUT);
    echo $f->format(123456);
    ?>

    result :
    one hundred and twenty-three thousand, four hundred and fifty-six

    tahun segitu ...
    - NumberFormatter belum bisa spellout indonesia
    - hasil pengejaannya beda :

    123456
    one hundred and twenty-three thousand, four hundred and fifty-six

    sekarang dgn angka yg sama :
    one hundred twenty-three thousand four hundred fifty-six

    tanpa "and" dan tanda "," (koma)
  • edited May 7
    javascript utk format angka (bukan terbilang), sebenarnya ada method bawaan .toLocaleString()
    bisa di set mau memakai format angka inggris / indonesia
    tapi ada keterbatasan juga ...
    <script>
    var a = 1234567890.1234567890;
    var b = 1.2345678901234567890;

    var c = 1234567890123.4567890;
    var d = 12345678901234.567890;
    var e = 123456789012345.67890;
    var f = 1234567890123456.7890;
    var g = 12345678901234567.890;

    var h = 1234567890123456789012345678.901234567890123;
    var i = "1234567890123456789012345678.901234567890123";

    document.write(a.toLocaleString('en')+"<br>"); // 1,234,567,890.123 ... format bahasa inggris

    document.write(a.toLocaleString('id')+"<br>"); // 1.234.567.890,123 ... format bahasa indonesia
    document.write(b.toLocaleString('id')+"<br>"); // 1,235

    document.write(c.toLocaleString('id')+"<br>"); // 1.234.567.890.123,46
    document.write(d.toLocaleString('id')+"<br>"); // 12.345.678.901.234,6
    document.write(e.toLocaleString('id')+"<br>"); // 123.456.789.012.346
    document.write(f.toLocaleString('id')+"<br>"); // 1.234.567.890.123.460
    document.write(g.toLocaleString('id')+"<br>"); // 12.345.678.901.234.600

    document.write(h.toLocaleString('id')+"<br>"); // 1.234.567.890.123.460.000.000.000.000
    document.write(i.toLocaleString('id')+"<br>"); // 1234567890123456789012345678.901234567890123

    document.write((Math.round(a*10)/10).toLocaleString('id')+"<br>"); // 1.234.567.890,1 ... membuat pembulatan 1 digit
    document.write((Math.round(a*100)/100).toLocaleString('id')+"<br>"); // 1.234.567.890,12 ... membuat pembulatan 2 digit
    </script>
    - pembulatan angka maksimal 3 digit, pembulatan 1-2 digit ditambah menggunakan Math.round()
    - panjang angka maksimal 15 digit (panjang bilangan bulat + desimal), sisanya dibulatkan
    - tidak bisa untuk angka ekstra panjang
    - angka yg berupa string tidak diproses
Sign In or Register to comment.