Skip to content
Advertisement

Amount in Words prints values as ones after the decimal point – PHP

I have a PHP function to print amounts in words, It works fine till the decimal, but the later decimal point, it prints the value as of in one’s place.

Like, if the value is “54.35”, it prints “Fifty-Four Three Five” Instead, it should print like “Fifty Four Thirty-Five”.

The code goes as :

function getIndianCurrency(float $number)
    {
    $decimal = round($number - ($no = floor($number)), 2) * 100;
    $hundred = null;
    $digits_length = 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_length ) {
        $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;
    }
    $Rupees = implode('', array_reverse($str));
    $paise = ($decimal > 0) ? ($words[$decimal / 10] . " " . $words[$decimal % 10]) . ' Paise' : '';
    return ($Rupees ? $Rupees . 'Rupees ' : '') . $paise;
}


getIndianCurrency(54.35);

Any help is appreciated.

Advertisement

Answer

You can get your expected output by this.

<?php
function getCurrencyString( $amount ){
    $hundred = null;
    $digits_length = strlen($amount);
    $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_length ) {
        $divider = ($i == 2) ? 10 : 100;
        $number = floor($amount % $divider);
        $amount = floor($amount / $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;
    }
    return implode('', array_reverse($str));
}
function getIndianCurrency(float $number){
    $decimal = round($number - ($no = floor($number)), 2) * 100;
    $Rupees = getCurrencyString( $no );

    $paise = ($decimal > 0) ? getCurrencyString( $decimal ) . ' Paise' : '';
    return ($Rupees ? $Rupees . 'Rupees ' : '') . $paise;
}

echo getIndianCurrency( 54.35 );

Output :

Fifty Four Rupees Thirty Five Paise
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement