Convert Numbers to Words in PHP
class number_to_words
{
public function __construct()
{
// initialization values
$this->_hyphen = '-';
$this->_separator = ', ';
$this->_negative = 'negative ';
$this->_space = ' ';
$this->_conjunction = ' and ';
$this->_decimal = 'cents ';
$this->_rupees = ' rupees';
$this->_only = ' only';
// call array of words
$this->arr_words();
}
protected function arr_words()
{
// array words
$this->_dictionary = array(
"0" => 'zero',
"1" => 'one',
"2" => 'two',
"3" => 'three',
"4" => 'four',
"5" => 'five',
"6" => 'six',
"7" => 'seven',
"8" => 'eight',
"9" => 'nine',
"00" => 'zero zero',
"01" => 'zero one',
"02" => 'zero two',
"03" => 'zero three',
"04" => 'zero four',
"05" => 'zero five',
"06" => 'zero six',
"07" => 'zero seven',
"08" => 'zero eight',
"09" => 'zero nine',
"10" => 'ten',
"11" => 'eleven',
"12" => 'twelve',
"13" => 'thirteen',
"14" => 'fourteen',
"15" => 'fifteen',
"16" => 'sixteen',
"17" => 'seventeen',
"18" => 'eighteen',
"19" => 'nineteen',
"20" => 'twenty',
"30" => 'thirty',
"40" => 'fourty',
"50" => 'fifty',
"60" => 'sixty',
"70" => 'seventy',
"80" => 'eighty',
"90" => 'ninety',
"100" => 'hundred',
"1000" => 'thousand',
"1000000" => 'million',
"1000000000" => 'billion',
"1000000000000" => 'trillion',
"1000000000000000" => 'quadrillion',
"1000000000000000000" => 'quintillion'
);
} // end function arr_words
/**
* @param $number
* @param $first
*/
public function convert_number_to_words($number, $first=true)
{
//check number is number or not
if (!is_numeric($number)) {
return false;
}
if (($number >= 0 && intval($number )< 0) || intval($number) < 0 - PHP_INT_MAX) {
// overflow
trigger_error('convert_number_to_words only accepts numbers between -' . PHP_INT_MAX . ' and ' . PHP_INT_MAX, E_USER_WARNING);
return false;
}
//check number whether is negative or not
//if it is negative then call the function with positive number
if ($number < 0) {
return $this->_negative . $this->convert_number_to_words(abs($number));
}
//assign null value to variables
$string = $fraction = null;
// check Decimal place in number
if (strpos($number, '.') !== false) {
list($number, $fraction) = explode('.', $number);
}
switch (true)
{
case $number < 21:
$string = $this->_dictionary["$number"];
break;
case $number < 100:
$tens = (intval($number / 10)) * 10;
$units = $number % 10;
$string = $this->_dictionary["$tens"];
if ($units) {
$string .= $this->_space . $this->_dictionary["$units"];
}
break;
case $number < 1000:
$hundreds = intval($number / 100);
$remainder = $number % 100;
$string = $this->_dictionary["$hundreds"] . ' ' .$this->_dictionary["100"];
if ($remainder) {
$string .= $this->_conjunction . $this->convert_number_to_words($remainder, false);
}
break;
default:
$baseUnit = pow(1000, floor(log($number, 1000)));
$numBaseUnits = intval($number / $baseUnit);
$remainder = $number % $baseUnit;
$string = $this->convert_number_to_words($numBaseUnits, false) . ' ' . $this->_dictionary["$baseUnit"];
if ($remainder) {
$string .= $this->_conjunction;
$string .= $this->convert_number_to_words($remainder, false);
}
break;
}
// start - decimal place
if (null !== $fraction && is_numeric($fraction)) {
$string .= $this->_rupees . $this->_conjunction . $this->_decimal;
/**
* if decimal comes 10, 20, 30 ..upto 90. 0 is removing from number.
* suppose you were not specify decimal place with 2 digits. like 100.5, 3.9
* so we need CONCAT 0 with number
* it would come ten twenty..
*/
if ($fraction < 10) $fraction = $fraction . '0';
$string .= $this->convert_number_to_words($fraction, false);
//add only
$string .= $this->_only;
}
// end - decimal place
//first time only this condition would execute.
//without decimal place.
if ($fraction === null && $first == true) {
$string .= $this->_rupees . $this->_only;
}
return $string;
} // end function convert_number_to_words
}// end class
// call the class
// convert number in words
$obj_no_to_words = new number_to_words();
//get Total amount in words
echo ucfirst($obj_no_to_words->convert_number_to_words(181.12));
?>
/** examples
* 0.05: zero rupees and cents zero five only
* 8.75: eight rupees and cents seventy five only
* 10: ten rupees only
* 59.2:fifty nine rupees and cents twenty only
* 181.12: one hundred and eighty one rupees and cents twelve only
* 1000: one thousand rupees only
* 13020: thirteen thousand and twenty rupees only
* 102508.28: one hundred and two thousand and five hundred and eight rupees and cents twenty eight only
* 1020508.28: one million and twenty thousand and five hundred and eight rupees and cents twenty eight only
* 18264092.50: eighteen million and two hundred and sixty four thousand and ninety two rupees and cents fifty only
*/
This is example for convert numbers to words. I have done some changes below link source code.
source from: http://www.karlrixon.co.uk/writing/convert-numbers-to-words-with-php/