Skip to content

Instantly share code, notes, and snippets.

@faizshukri
Last active March 27, 2024 05:37
Show Gist options
  • Save faizshukri/7802735 to your computer and use it in GitHub Desktop.
Save faizshukri/7802735 to your computer and use it in GitHub Desktop.
Convert numbers to Malay/Malaysia/Malaysian or Indonesia/Indonesian Language in PHP.

Convert numbers to Malay/Malaysia/Malaysian or Indonesia/Indonesian Language in PHP.

How to use

$number = new Eja_Nombor();
$number->eja(1468); //seribu empat ratus enam puluh lapan

or even in comma separated string value

$number->eja('458,139'); //empat ratus lima puluh lapan ribu seratus tiga puluh sembilan

or event in float number

$number->eja('12.34'); //dua belas perpuluhan tiga empat

Test data was provided. You may run the test data by using PHPUnit

$ phpunit NumberConversionTest.php

Credit

This code was the improved version created by me, and originally written by Huda M Elmatsani

<?php
/**
* Convert numbers to Malaysian or Indonesian Language.
*
* @author Faiz Shukri
* @date 5 Dec 2013
* @url https://gist.github.com/faizshukri/7802735
*
* Copyright 2013 | Faiz Shukri
* Released under the MIT license
*/
class Eja_Nombor {
private $dasar = array('sifar','satu','dua','tiga','empat','lima','enam','tujuh','lapan','sembilan');
private $penyambung = array( 1000000000000 => 'trilion', 1000000000 => 'bilion', 1000000 => 'juta', 1000 => 'ribu', 100 => 'ratus', 10 => 'puluh', 1 => '');
public function eja($n){
$n = explode('.', preg_replace("/[^\d.]/", "", $n));
$word = $this->eja_nombor_bulat($n[0]);
if(isset($n[1]))
$word .= ' perpuluhan ' . $this->eja_perpuluhan($n[1]);
return $word;
}
private function eja_nombor_bulat($n){
if($n==0) return $this->dasar[$n];
$str = ''; $i=0;
while($n!=0){
$count = (int)($n/array_keys($this->penyambung)[$i]);
if($count>=10)
$str .= $this->eja_nombor_bulat($count). " ".array_values($this->penyambung)[$i]." ";
else if($count > 0 && $count < 10)
$str .= $this->dasar[$count] . " ".array_values($this->penyambung)[$i]." ";
$n -= array_keys($this->penyambung)[$i] * $count;
$i++;
}
$str = preg_replace("/satu puluh (\w+)/i","\\1 belas",$str);
$str = preg_replace("/satu (trilion|bilion|juta|ribu|ratus|puluh|belas)/i","se\\1",$str);
return trim($str);
}
private function eja_perpuluhan($n){
$n = str_split(preg_replace("/(0)+$/", "", $n)); $word='';
foreach($n as $val){
$word .= $this->dasar[intval($val)] . " ";
}
return trim($word);
}
}
<?php
/**
* PHP Unit Class
* @run phpunit NumberConversionTest.php
*/
require_once('Eja_Nombor.php');
class NumberConversionTest extends PHPUnit_Framework_TestCase{
public function testEja(){
$number = new Eja_Nombor();
$this->assertEquals( $number->eja(0), 'sifar' );
$this->assertEquals( $number->eja(1), 'satu' );
$this->assertEquals( $number->eja(5), 'lima' );
$this->assertEquals( $number->eja(10), 'sepuluh' );
$this->assertEquals( $number->eja(11), 'sebelas' );
$this->assertEquals( $number->eja(16), 'enam belas' );
$this->assertEquals( $number->eja(20), 'dua puluh' );
$this->assertEquals( $number->eja(24), 'dua puluh empat' );
$this->assertEquals( $number->eja(50), 'lima puluh' );
$this->assertEquals( $number->eja(100), 'seratus' );
$this->assertEquals( $number->eja(101), 'seratus satu' );
$this->assertEquals( $number->eja(106), 'seratus enam' );
$this->assertEquals( $number->eja(110), 'seratus sepuluh' );
$this->assertEquals( $number->eja(111), 'seratus sebelas' );
$this->assertEquals( $number->eja(140), 'seratus empat puluh' );
$this->assertEquals( $number->eja(156), 'seratus lima puluh enam' );
$this->assertEquals( $number->eja(200), 'dua ratus' );
$this->assertEquals( $number->eja(209), 'dua ratus sembilan' );
$this->assertEquals( $number->eja(210), 'dua ratus sepuluh' );
$this->assertEquals( $number->eja(211), 'dua ratus sebelas' );
$this->assertEquals( $number->eja(215), 'dua ratus lima belas' );
$this->assertEquals( $number->eja(274), 'dua ratus tujuh puluh empat' );
$this->assertEquals( $number->eja(588), 'lima ratus lapan puluh lapan' );
$this->assertEquals( $number->eja(1000), 'seribu' );
$this->assertEquals( $number->eja(1006), 'seribu enam' );
$this->assertEquals( $number->eja(1010), 'seribu sepuluh' );
$this->assertEquals( $number->eja(1011), 'seribu sebelas' );
$this->assertEquals( $number->eja(1017), 'seribu tujuh belas' );
$this->assertEquals( $number->eja(1070), 'seribu tujuh puluh' );
$this->assertEquals( $number->eja(1037), 'seribu tiga puluh tujuh' );
$this->assertEquals( $number->eja(1100), 'seribu seratus' );
$this->assertEquals( $number->eja(1110), 'seribu seratus sepuluh' );
$this->assertEquals( $number->eja(1111), 'seribu seratus sebelas' );
$this->assertEquals( $number->eja(1350), 'seribu tiga ratus lima puluh' );
$this->assertEquals( $number->eja(1468), 'seribu empat ratus enam puluh lapan' );
$this->assertEquals( $number->eja('1,234'), 'seribu dua ratus tiga puluh empat' );
$this->assertEquals( $number->eja('3,000'), 'tiga ribu' );
$this->assertEquals( $number->eja('3,006'), 'tiga ribu enam' );
$this->assertEquals( $number->eja('3,010'), 'tiga ribu sepuluh' );
$this->assertEquals( $number->eja('3,111'), 'tiga ribu seratus sebelas' );
$this->assertEquals( $number->eja('3,456'), 'tiga ribu empat ratus lima puluh enam' );
$this->assertEquals( $number->eja('10,000'), 'sepuluh ribu' );
$this->assertEquals( $number->eja('10,010'), 'sepuluh ribu sepuluh' );
$this->assertEquals( $number->eja('11,111'), 'sebelas ribu seratus sebelas' );
$this->assertEquals( $number->eja('12,345'), 'dua belas ribu tiga ratus empat puluh lima' );
$this->assertEquals( $number->eja('17,000'), 'tujuh belas ribu' );
$this->assertEquals( $number->eja('20,000'), 'dua puluh ribu' );
$this->assertEquals( $number->eja('30,500'), 'tiga puluh ribu lima ratus' );
$this->assertEquals( $number->eja('40,790'), 'empat puluh ribu tujuh ratus sembilan puluh' );
$this->assertEquals( $number->eja('83,784'), 'lapan puluh tiga ribu tujuh ratus lapan puluh empat' );
$this->assertEquals( $number->eja('100,000'), 'seratus ribu' );
$this->assertEquals( $number->eja('100,001'), 'seratus ribu satu' );
$this->assertEquals( $number->eja('110,010'), 'seratus sepuluh ribu sepuluh' );
$this->assertEquals( $number->eja('111,111'), 'seratus sebelas ribu seratus sebelas' );
$this->assertEquals( $number->eja('115,644'), 'seratus lima belas ribu enam ratus empat puluh empat' );
$this->assertEquals( $number->eja('130,800'), 'seratus tiga puluh ribu lapan ratus' );
$this->assertEquals( $number->eja('200,000'), 'dua ratus ribu' );
$this->assertEquals( $number->eja('303,002'), 'tiga ratus tiga ribu dua' );
$this->assertEquals( $number->eja('458,139'), 'empat ratus lima puluh lapan ribu seratus tiga puluh sembilan' );
$this->assertEquals( $number->eja('1,000,000'), 'sejuta' );
$this->assertEquals( $number->eja('1,000,005'), 'sejuta lima' );
$this->assertEquals( $number->eja('1,001,001'), 'sejuta seribu satu' );
$this->assertEquals( $number->eja('10,010,010'), 'sepuluh juta sepuluh ribu sepuluh' );
$this->assertEquals( $number->eja('11,011,011'), 'sebelas juta sebelas ribu sebelas' );
$this->assertEquals( $number->eja('15,015,015'), 'lima belas juta lima belas ribu lima belas' );
$this->assertEquals( $number->eja('20,000,000'), 'dua puluh juta' );
$this->assertEquals( $number->eja('36,300,600'), 'tiga puluh enam juta tiga ratus ribu enam ratus' );
$this->assertEquals( $number->eja('0.1'), 'sifar perpuluhan satu' );
$this->assertEquals( $number->eja('12.34'), 'dua belas perpuluhan tiga empat' );
$this->assertEquals( $number->eja('10.100'), 'sepuluh perpuluhan satu' );
$this->assertEquals( $number->eja('11.010'), 'sebelas perpuluhan sifar satu' );
$this->assertEquals( $number->eja('0.6328'), 'sifar perpuluhan enam tiga dua lapan' );
$this->assertEquals( $number->eja('211,510,604,220,762.201340'), 'dua ratus sebelas trilion lima ratus sepuluh bilion enam ratus empat juta dua ratus dua puluh ribu tujuh ratus enam puluh dua perpuluhan dua sifar satu tiga empat' );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment