Number to word using jQuery/PHP

This was my client requirement in a project while generating invoice manually. They wanted to print amount in words. 
JavaScript
<script>
//var th = ['','thousand','million', 'billion','trillion'];
var dg = ['zero','one','two','three','four', 'five','six','seven','eight','nine'];
var tn = ['ten','eleven','twelve','thirteen', 'fourteen','fifteen','sixteen', 'seventeen','eighteen','nineteen'];
var tw = ['twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];
function toWords(s){
s = s.toString(); 
s = s.replace(/[\, ]/g,''); 
if (s != parseFloat(s)) return 'not a number';
var x = s.indexOf('.'); 
if (x == -1) x = s.length; 
if (x > 15) return 'too big';
var n = s.split(''); var str = ''; var sk = 0; 
for (var i=0; i < x; i++) {
if ((x-i)%3==2) {
if (n[i] == '1') {
str += tn[Number(n[i+1])] + ' ';
i++; sk=1;
} else if (n[i]!=0) {
str += tw[n[i]-2] + ' ';
sk=1;
}
} else if (n[i]!=0) {
str += dg[n[i]] +' '; 
if ((x-i)%3==0) str += 'hundred ';
sk=1;
}
   /*if ((x-i)%3==1) { 
  if (sk) str += th[(x-i-1)/3] + ' ';
  sk=0;
   }
 */
 if ((x-i)%3==1) { 
  if (sk) str += th[(x-i-1)/3] + ' ';
  sk=0;
   }
}
  if (x != s.length) {
  var y = s.length;
  str += 'point '; 
  for (var i=x+1; i<y; i++) str += dg[n[i]] +' ';
  } 
  return str.replace(/\s+/g,' ');
   }
   function convertWords(){
var ss =document.getElementById("text").value;
document.getElementById("dis").innerHTML= toWords(ss);
}
</script>

PHP

function convertToWords($number){
   $no = round($number);
   $point = round($number - $no, 2) * 100;
   $hundred = null;
   $digits_1 = strlen($no);
   $i = 0;
   $str = array();
 
   $words = array('0' => '', '1' => 'one', '2' => 'two',
    '3' => 'three', '4' => 'four', '5' => 'five', '6' => 'six',
    '7' => 'seven', '8' => 'eight', '9' => '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' => 'forty', '50' => 'fifty',
    '60' => 'sixty', '70' => 'seventy',
    '80' => 'eighty', '90' => 'ninety');
   
   $digits = array('', 'hundred', 'thousand', 'lakh', 'crore');
 
   while ($i < $digits_1) {
     $divider = ($i == 2) ? 10 : 100;
     $number = floor($no % $divider);
     $no = floor($no / $divider);
     $i += ($divider == 10) ? 1 : 2;
   
     if ($number) {
        $plural = (($counter = count($str)) && $number > 9) ? 's' : null;
        $hundred = ($counter == 1 && $str[0]) ? ' and ' : null;
        $str [] = ($number < 21) ? $words[$number] . " " . $digits[$counter] . $plural . " " . $hundred : $words[floor($number / 10) * 10] . " " . $words[$number % 10] . " " . $digits[$counter] . $plural . " " . $hundred;
     } else $str[] = null;
  }
 
  $str = array_reverse($str);
  $result = implode('', $str);
  $points = ($point) ? " point " . $words[$point / 10] . " " . $words[$point = $point % 10] : '';
  return $result . "Rupees  " . $points . " Paise";
 }

No comments: