PHP: Convert number & currency to text in asian i.e. Bangladeshi, Indian format
Hello Guys,
I am from Bangladesh and our currency system is somewhat different. We use lac/lakh, crore etc. So, today I had to convert number to word in a project. When I was searching the web, I did not found anything that meets my requirement 100%. So I wrote one. Although my code does not support more than 999 crore taka / rupee, I think this will suffice most of the projects requirements.
To be frank I used several pieces of beautiful code from internet.
Well. Enough talks. Let me show the code.
CODE:
================================================
{code type=PHP}
error_reporting(E_ALL);
//error_reporting(0);
class Currency
{
function __construct()
{
//do nothing for now
}
// http://www.phpbuilder.com/board/showthread.php?t=10350901
function get_bd_money_format($amount)
{
$output_string = '';
$fraction = '';
$tokens = explode('.', $amount);
$number = $tokens[0];
if(count($tokens) > 1)
{
$fraction = (double)(’0.’ . $tokens[1]);
$fraction = $fraction * 100;
$fraction = round($fraction, 0);
$fraction = ‘.’ . $fraction;
}
$number = $number . ”;
$spl=str_split($number);
$lpcount=count($spl);
$rem=$lpcount-3;
//echo “rem”.$rem.”
“;
//even one
if($lpcount%2==0)
{
for($i=0;$i<=$lpcount-1;$i++)
{
if($i%2!=0 && $i!=0 && $i!=$lpcount-1)
{
$output_string .= ",";
}
$output_string .= $spl[$i];
}
}
//odd one
if($lpcount%2!=0)
{
for($i=0;$i<=$lpcount-1;$i++)
{
if($i%2==0 && $i!=0 && $i!=$lpcount-1)
{
$output_string .= ",";
}
$output_string .= $spl[$i];
}
}
return $output_string . $fraction;
}
// http://efreedom.com/Question/1-3181945/Convert-Money-Text-PHP
function translate_to_words($number)
{
/*****
* A recursive function to turn digits into words
* Numbers must be integers from -999,999,999,999 to 999,999,999,999 inclussive.
*
* (C) 2010 Peter Ajtai
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* See the GNU General Public License:
*
*/
// zero is a special case, it cause problems even with typecasting if we don’t deal with it here
$max_size = pow(10,18);
if (!$number) return “zero”;
if (is_int($number) && $number < abs($max_size))
{
$prefix = '';
$suffix = '';
switch ($number)
{
// set up some rules for converting digits to words
case $number < 0:
$prefix = "negative";
$suffix = $this->translate_to_words(-1*$number);
$string = $prefix . ” ” . $suffix;
break;
case 1:
$string = “one”;
break;
case 2:
$string = “two”;
break;
case 3:
$string = “three”;
break;
case 4:
$string = “four”;
break;
case 5:
$string = “five”;
break;
case 6:
$string = “six”;
break;
case 7:
$string = “seven”;
break;
case 8:
$string = “eight”;
break;
case 9:
$string = “nine”;
break;
case 10:
$string = “ten”;
break;
case 11:
$string = “eleven”;
break;
case 12:
$string = “twelve”;
break;
case 13:
$string = “thirteen”;
break;
// fourteen handled later
case 15:
$string = “fifteen”;
break;
case $number < 20:
$string = $this->translate_to_words($number%10);
// eighteen only has one “t”
if ($number == 18)
{
$suffix = “een”;
} else
{
$suffix = “teen”;
}
$string .= $suffix;
break;
case 20:
$string = “twenty”;
break;
case 30:
$string = “thirty”;
break;
case 40:
$string = “forty”;
break;
case 50:
$string = “fifty”;
break;
case 60:
$string = “sixty”;
break;
case 70:
$string = “seventy”;
break;
case 80:
$string = “eighty”;
break;
case 90:
$string = “ninety”;
break;
case $number < 100:
$prefix = $this->translate_to_words($number-$number%10);
$suffix = $this->translate_to_words($number%10);
//$string = $prefix . “-” . $suffix;
$string = $prefix . ” ” . $suffix;
break;
// handles all number 100 to 999
case $number < pow(10,3):
// floor return a float not an integer
$prefix = $this->translate_to_words(intval(floor($number/pow(10,2)))) . ” hundred”;
if ($number%pow(10,2)) $suffix = ” and ” . $this->translate_to_words($number%pow(10,2));
$string = $prefix . $suffix;
break;
case $number < pow(10,6):
// floor return a float not an integer
$prefix = $this->translate_to_words(intval(floor($number/pow(10,3)))) . ” thousand”;
if ($number%pow(10,3)) $suffix = $this->translate_to_words($number%pow(10,3));
$string = $prefix . ” ” . $suffix;
break;
}
} else
{
echo “ERROR with – $number
Number must be an integer between -” . number_format($max_size, 0, “.”, “,”) . ” and ” . number_format($max_size, 0, “.”, “,”) . ” exclussive.”;
}
return $string;
}
function get_bd_amount_in_text($amount)
{
$output_string = ”;
$tokens = explode(‘.’, $amount);
$current_amount = $tokens[0];
$fraction = ”;
if(count($tokens) > 1)
{
$fraction = (double)(’0.’ . $tokens[1]);
$fraction = $fraction * 100;
$fraction = round($fraction, 0);
$fraction = (int)$fraction;
$fraction = $this->translate_to_words($fraction) . ‘ paisa’;
$fraction = ‘ Taka & ‘ . $fraction;
}
$crore = 0;
if($current_amount >= pow(10,7))
{
$crore = (int)floor($current_amount / pow(10,7));
$output_string .= $this->translate_to_words($crore) . ‘ crore ‘;
$current_amount = $current_amount – $crore * pow(10,7);
}
$lakh = 0;
if($current_amount >= pow(10,5))
{
$lakh = (int)floor($current_amount / pow(10,5));
$output_string .= $this->translate_to_words($lakh) . ‘ lakh ‘;
$current_amount = $current_amount – $lakh * pow(10,5);
}
$current_amount = (int)$current_amount;
$output_string .= $this->translate_to_words($current_amount);
$output_string = $output_string . $fraction . ‘ only’;
$output_string = ucwords($output_string);
return $output_string;
}
}
$currency_object = new Currency();
for($i=1; $i<10; $i++)
{
$seed = time() / ($i + 1);
srand($seed);
$amount = mt_rand(100, 9999999);
$amount = $amount + $i/10;
echo $currency_object->get_bd_money_format($amount) . ‘ : ‘ . $currency_object->get_bd_amount_in_text($amount) . ‘
‘;
}
?>
{/code}
Sample Output:
================================================
================================================
That’s it!
Please feel free to use this code anytime anywhere.
If you update/enhance this code, please share with other people.
Thanks for reading.