Membuat Fungsi Terbilang pada PHP

Tags: March 10, 2012 3:55 PM

Code ini self explanatory jadi mudah untuk di-porting ke bahasa pemrograman lain.

<?php
/**
 * Fungsi untuk menerjemahkan suatu angka dalam bentuk bilangan. contoh,
 *
 * <code>
 * terbilang(5); // output 'Lima'
 * terbilang(41); // output 'Empat puluh satu'
 * terbilang(1001); // output 'Seribu satu'
 * </code>
 *
 * @author Rio Astamal <me@rioastamal.net>
 *
 * @param int $angka - Angka yang akan diterjemahkan
 * @return string
 */
function terbilang($angka) {
    // pastikan kita hanya berususan dengan tipe data numeric
    $angka = (float)$angka;
    
    // array bilangan 
    // sepuluh dan sebelas merupakan special karena awalan 'se'
    $bilangan = array(
            '',
            'satu',
            'dua',
            'tiga',
            'empat',
            'lima',
            'enam',
            'tujuh',
            'delapan',
            'sembilan',
            'sepuluh',
            'sebelas'
    );
    
    // pencocokan dimulai dari satuan angka terkecil
    if ($angka < 12) {
        // mapping angka ke index array $bilangan
        return $bilangan[$angka];
    } else if ($angka < 20) {
        // bilangan 'belasan'
        // misal 18 maka 18 - 10 = 8
        return $bilangan[$angka - 10] . ' belas';
    } else if ($angka < 100) {
        // bilangan 'puluhan'
        // misal 27 maka 27 / 10 = 2.7 (integer => 2) 'dua'
        // untuk mendapatkan sisa bagi gunakan modulus
        // 27 mod 10 = 7 'tujuh'
        $hasil_bagi = (int)($angka / 10);
        $hasil_mod = $angka % 10;
        return trim(sprintf('%s puluh %s', $bilangan[$hasil_bagi], $bilangan[$hasil_mod]));
    } else if ($angka < 200) {
        // bilangan 'seratusan' (itulah indonesia knp tidak satu ratus saja? :))
        // misal 151 maka 151 = 100 = 51 (hasil berupa 'puluhan')
        // daripada menulis ulang rutin kode puluhan maka gunakan
        // saja fungsi rekursif dengan memanggil fungsi terbilang(51)
        return sprintf('seratus %s', terbilang($angka - 100));
    } else if ($angka < 1000) {
        // bilangan 'ratusan'
        // misal 467 maka 467 / 100 = 4,67 (integer => 4) 'empat'
        // sisanya 467 mod 100 = 67 (berupa puluhan jadi gunakan rekursif terbilang(67))
        $hasil_bagi = (int)($angka / 100);
        $hasil_mod = $angka % 100;
        return trim(sprintf('%s ratus %s', $bilangan[$hasil_bagi], terbilang($hasil_mod)));
    } else if ($angka < 2000) {
        // bilangan 'seribuan'
        // misal 1250 maka 1250 - 1000 = 250 (ratusan)
        // gunakan rekursif terbilang(250)
        return trim(sprintf('seribu %s', terbilang($angka - 1000)));
    } else if ($angka < 1000000) {
        // bilangan 'ribuan' (sampai ratusan ribu
        $hasil_bagi = (int)($angka / 1000); // karena hasilnya bisa ratusan jadi langsung digunakan rekursif
        $hasil_mod = $angka % 1000;
        return sprintf('%s ribu %s', terbilang($hasil_bagi), terbilang($hasil_mod));
    } else if ($angka < 1000000000) {
        // bilangan 'jutaan' (sampai ratusan juta)
        // 'satu puluh' => SALAH
        // 'satu ratus' => SALAH
        // 'satu juta' => BENAR 
        // @#$%^ WT*
        
        // hasil bagi bisa satuan, belasan, ratusan jadi langsung kita gunakan rekursif
        $hasil_bagi = (int)($angka / 1000000);
        $hasil_mod = $angka % 1000000;
        return trim(sprintf('%s juta %s', terbilang($hasil_bagi), terbilang($hasil_mod)));
    } else if ($angka < 1000000000000) {
        // bilangan 'milyaran'
        $hasil_bagi = (int)($angka / 1000000000);
        // karena batas maksimum integer untuk 32bit sistem adalah 2147483647
        // maka kita gunakan fmod agar dapat menghandle angka yang lebih besar
        $hasil_mod = fmod($angka, 1000000000);
        return trim(sprintf('%s milyar %s', terbilang($hasil_bagi), terbilang($hasil_mod)));
    } else if ($angka < 1000000000000000) {
        // bilangan 'triliun'
        $hasil_bagi = $angka / 1000000000000;
        $hasil_mod = fmod($angka, 1000000000000);
        return trim(sprintf('%s triliun %s', terbilang($hasil_bagi), terbilang($hasil_mod)));
    } else {
        return 'Wow...';
    }
}

Test Fungsi

var_dump(terbilang(0));
var_dump(terbilang(9));
var_dump(terbilang(15));
var_dump(terbilang(11));
var_dump(terbilang(38));
var_dump(terbilang(99));
var_dump(terbilang(178));
var_dump(terbilang(753));
var_dump(terbilang(1345));
var_dump(terbilang(9999));
var_dump(terbilang(10050));
var_dump(terbilang(89999));
var_dump(terbilang(999999));
var_dump(terbilang(999999999)); // ratusan juta
var_dump(terbilang(999999999999)); // ratusan milyar
var_dump(terbilang(1000000000001)); 
var_dump(terbilang(999999999999999)); // ratusan triliun
var_dump(terbilang(9999999999999999)); // ribuan triliun
var_dump((int)(999999999999 / 1000000000));
// hasil dibawah ini kenapa kita harus menggunakan fmod
var_dump(999999999999 % 1000000000);
var_dump(fmod(999999999999, 1000000000));

Output

string '' (length=0)
string 'sembilan' (length=8)
string 'lima belas' (length=10)
string 'sebelas' (length=7)
string 'tiga puluh delapan' (length=18)
string 'sembilan puluh sembilan' (length=23)
string 'seratus tujuh puluh delapan' (length=27)
string 'tujuh ratus lima puluh tiga' (length=27)
string 'seribu tiga ratus empat puluh lima' (length=34)
string 'sembilan ribu sembilan ratus sembilan puluh sembilan' (length=52)
string 'sepuluh ribu lima puluh' (length=23)
string 'delapan puluh sembilan ribu sembilan ratus sembilan puluh sembilan' (length=66)
string 'sembilan ratus sembilan puluh sembilan ribu sembilan ratus sembilan puluh sembilan' (length=82)
string 'sembilan ratus sembilan puluh sembilan juta sembilan ratus sembilan puluh sembilan ribu sembilan ratus sembilan puluh sembilan' (length=126)
string 'sembilan ratus sembilan puluh sembilan milyar sembilan ratus sembilan puluh sembilan juta sembilan ratus sembilan puluh sembilan ribu sembilan ratus sembilan puluh sembilan' (length=172)
string 'satu triliun satu' (length=17)
string 'sembilan ratus sembilan puluh sembilan triliun sembilan ratus sembilan puluh sembilan milyar sembilan ratus sembilan puluh sembilan juta sembilan ratus sembilan puluh sembilan ribu sembilan ratus sembilan puluh sembilan' (length=219)
string 'Wow...' (length=6)
int 999
int -727379969
float 999999999

Share on Facebook Twitter

0 comments:

Post a Comment