Class PHP - Konfersi Angka ke Text Bahasa Indonesia

02.14.00 K. Novianto 0 Comments

Berikut ini class php sederhana untuk mengkonfersi angka ke dalam bentuk kalimat dalam Bahasa Indonesia. Class ini cocok untuk dipakai pada aplikasi kwitansi atau invoice dimana kita perlu menerjemahkan angka bilangan.
Ok langsung saja ketik listing dibawah ini dengan php editor Anda.

class AngKata{

  var $angka = 0; var $idr = false; var $desimal=0;

  function AngKata($angka, $idr=false){
    $this->angka = $angka;
    $this->idr = $idr;    
    $curr = explode('.', $this->angka);
    $len = strlen($curr[1]);
    if ($len == 1) {
    // tambah nol belakang angka
    $curr[1] .= '0';
    } elseif ($len > 2) {
    // mengambil digit ke tiga setelah koma
    $round_digit = substr($curr[1], 2, 1);            
    // hapus angka setelah digit ke dua
    $curr[1] = substr($curr[1], 0, 2);
     
    }
    $this->desimal=$curr[1];
  }

function ubah(){
    if ($this->idr){
      if($this->desimal) {
        $res=AngKata::ConvertAngka($this->angka) ;//. " Rupiah ". AngKata::ConvertAngka($this->desimal) . " Sen" ;
        $res= str_replace("koma", " rupiah", $res); 
        return $res." sen";//AngKata::ConvertAngka($this->angka) . " Rupiah ". AngKata::ConvertAngka($this->desimal) . " Sen" ; 
      }
      else{ return AngKata::ConvertAngka($this->angka) . " Rupiah"; }     
   }
   else{ return AngKata::ConvertAngka($this->angka);}
}

static function ConvertAngka($angka) {    
    $penanda = '-';  $separator = ', '; $negatif = 'negatif '; $decimal = ' koma ';
    $satuan  = array( 0 => 'nol', 1 => 'satu', 2 => 'dua', 3 => 'tiga', 4 => 'empat', 5 => 'lima', 6 => 'enam', 7 => 'tujuh', 8 => 'delapan', 9 => 'sembilan', 10 => 'sepuluh', 11 => 'sebelas', 12 => 'dua belas', 13 => 'tiga belas', 14 => 'empat belas', 15 => 'lima belas', 16 => 'enam belas', 17 => 'tujuh belas', 18 => 'delapan belas', 19 => 'sembilan belas', 20 => 'dua puluh');
   
    if (!is_numeric($angka)) { return false; }
    if (($angka >= 0 && (int) $angka < 0) || (int) $angka < 0 - PHP_INT_MAX) {
        // overflow
        trigger_error( 'Konfersi angka ke bahasa hanya dapat menerima angka antara -' . PHP_INT_MAX . ' dan ' . PHP_INT_MAX, E_USER_WARNING );
        return false;
    }
    if ($angka < 0) { return $negatif . ConvertAngka(abs($angka)); } 
    $hasil = $fraction = null;
    if (strpos($angka, '.') !== false) { list($angka, $fraction) = explode('.', $angka); }
   
    switch (true) {
        case $angka < 21: $hasil = $satuan[$angka]; break;
        case $angka > 10:
    $My = floor($angka/ 1000000000); $angka-= $My * 1000000000;
            if ($My) { $hasil .= AngKata::ConvertAngka($My) . " milyar ";  }   
            $Jt = floor($angka/ 1000000); $angka-= $Jt * 1000000;
    if ($Jt) { $hasil .= AngKata::ConvertAngka($Jt) . " juta ";  }   
            $Rb = floor($angka/ 1000); $angka-= $Rb * 1000;
    if ($Rb)  {  $hasil .= (empty($hasil) ? "" : " ") . AngKata::ConvertAngka($Rb) . " ribu "; }
    $Rs = floor($angka/ 100); $angka-= $Rs * 100;
            if($Rs){ $ratus = $satuan[$Rs]; $hasil.=$ratus ." ratus " ; }
            $Pn = floor($angka/ 10);
            $angka-= $Pn * 10;
            $st = $angka%10;
            if($Pn) {
               if($Pn > 1) { $Pn= $satuan[$Pn]; $hasil.= $Pn ." puluh "; }
            }  
            if ($Pn || $st){
              if ($Pn < 2 ){ $hasil.= $satuan[$Pn * 10 + $st]; }
            }
            if (empty($hasil)){ $hasil = ""; }    
           
           $hasil = str_replace("satu ribu", "seribu", $hasil);
           $hasil = str_replace("satu ratus", "seratus", $hasil);
       $hasil = str_replace("satu puluh", "sepuluh", $hasil);
   $hasil = str_replace("puluh seribu", "puluh satu ribu", $hasil);
   $hasil = str_replace("seratus seribu", "seratus satu ribu", $hasil);
   break;
           
        default:
            $baseUnit = pow(1000, floor(log($angka, 1000)));
            $numBaseUnits = (int) ($angka / $baseUnit);
            $remainder = $angka % $baseUnit;
            $hasil = ConvertAngka($numBaseUnits) . ' ' . $satuan[$baseUnit];
            if ($remainder) {
                $hasil .= $remainder < 100 ? '': $separator;
                $hasil .= ConvertAngka($remainder);
            }
        break;
    }
   
    if (null !== $fraction && is_numeric($fraction)) {      
      if (substr($fraction,0,1)=='0'){
          $hasil .= $decimal;
          $words = array();
          foreach (str_split((string) $fraction) as $angka){ $words[] = $satuan[$angka]; }
          $hasil .= implode(' ', $words);
       }
   else{ $hasil .= $decimal; $hasil .= AngKata::ConvertAngka(intval($fraction)); }
    }
    $panjang = strlen($hasil);
    $akhir = substr($hasil,-3);
    if(strtoupper($akhir)=='NOL'){ $hasil=substr($hasil,0,$panjang-3); }
    return str_replace("nol koma","koma",$hasil);
}
}


Misalkan kita ingin mengkonfersi angka: 1,070,025 ke dalam bentuk kalimat, maka contoh penggunaannya adalah sebagai berikut:

$test = new AngKata(1070025, false);
echo $test->ubah();

Selamat mencoba.

0 comments: