如何在 PHP 中以印度编号格式显示货币?

问题描述 投票:0回答:23

我有关于格式化卢比货币(印度卢比 - INR)的问题。

例如这里的数字表示为:

1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000

参考印度编号系统

我必须用 PHP 来做。

我看到了这个问题以印度编号格式显示货币。但无法获取 PHP 我的问题。

更新:

如何在印度货币格式中使用money_format()

php currency number-formatting converters money-format
23个回答
63
投票

您有很多选择,但

money_format
可以为您解决问题。

示例:

$amount = '100000';
setlocale(LC_MONETARY, 'en_IN');
$amount = money_format('%!i', $amount);
echo $amount;

输出:

1,00,000.00

注:

仅当系统具有 strfmon 功能时才定义函数 money_format()。例如,Windows 没有,因此 money_format() 在 Windows 中未定义。

纯 PHP 实现 - 适用于任何系统:

$amount = '10000034000';
$amount = moneyFormatIndia( $amount );
echo $amount;

function moneyFormatIndia($num) {
    $explrestunits = "" ;
    if(strlen($num)>3) {
        $lastthree = substr($num, strlen($num)-3, strlen($num));
        $restunits = substr($num, 0, strlen($num)-3); // extracts the last three digits
        $restunits = (strlen($restunits)%2 == 1)?"0".$restunits:$restunits; // explodes the remaining digits in 2's formats, adds a zero in the beginning to maintain the 2's grouping.
        $expunit = str_split($restunits, 2);
        for($i=0; $i<sizeof($expunit); $i++) {
            // creates each of the 2's group and adds a comma to the end
            if($i==0) {
                $explrestunits .= (int)$expunit[$i].","; // if is first value , convert into integer
            } else {
                $explrestunits .= $expunit[$i].",";
            }
        }
        $thecash = $explrestunits.$lastthree;
    } else {
        $thecash = $num;
    }
    return $thecash; // writes the final format where $currency is the currency symbol.
}

26
投票
$num = 1234567890.123;

$num = preg_replace("/(\d+?)(?=(\d\d)+(\d)(?!\d))(\.\d+)?/i", "$1,", $num);

echo $num;

// Input : 1234567890.123

// Output : 1,23,45,67,890.123


// Input : -1234567890.123

// Output : -1,23,45,67,890.123

13
投票
echo 'Rs. '.IND_money_format(1234567890);

function IND_money_format($money){
    $len = strlen($money);
    $m = '';
    $money = strrev($money);
    for($i=0;$i<$len;$i++){
        if(( $i==3 || ($i>3 && ($i-1)%2==0) )&& $i!=$len){
            $m .=',';
        }
        $m .=$money[$i];
    }
    return strrev($m);
}

注意::它没有在浮点值上进行测试,它仅适用于整数


11
投票

链接的示例正在利用 ICU 库,这些库可在 intl 扩展Docs中通过 PHP 获得:

$fmt = new NumberFormatter($locale = 'en_IN', NumberFormatter::CURRENCY);
echo $fmt->format(10000000000.1234)."\n"; # Rs 10,00,00,00,000.12

或者也许更适合您的情况:

$fmt = new NumberFormatter($locale = 'en_IN', NumberFormatter::DECIMAL);
echo $fmt->format(10000000000)."\n"; # 10,00,00,00,000

6
投票

只需使用以下函数即可格式化INR。

function amount_inr_format($amount) {
    $fmt = new \NumberFormatter($locale = 'en_IN', NumberFormatter::DECIMAL);
    return $fmt->format($amount);
}

5
投票

检查此代码,它对于带十进制格式的印度卢比格式 100% 有效。 您可以使用如下数字:

123456.789 123.456 123.4 123 和 1,2,3,4,5,6,7,8,9,.222

function moneyFormatIndia($num){

$explrestunits = "" ;
$num = preg_replace('/,+/', '', $num);
$words = explode(".", $num);
$des = "00";
if(count($words)<=2){
    $num=$words[0];
    if(count($words)>=2){$des=$words[1];}
    if(strlen($des)<2){$des="$des";}else{$des=substr($des,0,2);}
}
if(strlen($num)>3){
    $lastthree = substr($num, strlen($num)-3, strlen($num));
    $restunits = substr($num, 0, strlen($num)-3); // extracts the last three digits
    $restunits = (strlen($restunits)%2 == 1)?"0".$restunits:$restunits; // explodes the remaining digits in 2's formats, adds a zero in the beginning to maintain the 2's grouping.
    $expunit = str_split($restunits, 2);
    for($i=0; $i<sizeof($expunit); $i++){
        // creates each of the 2's group and adds a comma to the end
        if($i==0)
        {
            $explrestunits .= (int)$expunit[$i].","; // if is first value , convert into integer
        }else{
            $explrestunits .= $expunit[$i].",";
        }
    }
    $thecash = $explrestunits.$lastthree;
} else {
    $thecash = $num;
}
return "$thecash.$des"; // writes the final format where $currency is the currency symbol.

}

3
投票

当 Money_format 不可用时:

function format($amount): string
{
    list ($number, $decimal) = explode('.', sprintf('%.2f', floatval($amount)));

    $sign = $number < 0 ? '-' : '';

    $number = abs($number);

    for ($i = 3; $i < strlen($number); $i += 3)
    {
        $number = substr_replace($number, ',', -$i, 0);
    }

    return $sign . $number . '.' . $decimal;

}

2
投票
<?php
$amount = '-100000.22222';    // output -1,00,000.22 
//$amount = '0100000.22222';  // output 1,00,000.22 
//$amount = '100000.22222';   // output 1,00,000.22 
//$amount = '100000.';       // output 1,00,000.00 
//$amount = '100000.2';     // output 1,00,000.20
//$amount = '100000.0';    // output 1,00,000.00 
//$amount = '100000';      // output 1,00,000.00 

echo $aaa = moneyFormatIndia($amount);

function moneyFormatIndia($amount)
    {

        $amount = round($amount,2);

        $amountArray =  explode('.', $amount);
        if(count($amountArray)==1)
        {
            $int = $amountArray[0];
            $des=00;
        }
        else {
            $int = $amountArray[0];
            $des=$amountArray[1];
        }
        if(strlen($des)==1)
        {
            $des=$des."0";
        }
        if($int>=0)
        {
            $int = numFormatIndia( $int );
            $themoney = $int.".".$des;
        }

        else
        {
            $int=abs($int);
            $int = numFormatIndia( $int );
            $themoney= "-".$int.".".$des;
        }   
        return $themoney;
    }

function numFormatIndia($num)
    {

        $explrestunits = "";
        if(strlen($num)>3)
        {
            $lastthree = substr($num, strlen($num)-3, strlen($num));
            $restunits = substr($num, 0, strlen($num)-3); // extracts the last three digits
            $restunits = (strlen($restunits)%2 == 1)?"0".$restunits:$restunits; // explodes the remaining digits in 2's formats, adds a zero in the beginning to maintain the 2's grouping.
            $expunit = str_split($restunits, 2);
            for($i=0; $i<sizeof($expunit); $i++) {
                // creates each of the 2's group and adds a comma to the end
                if($i==0) {
                    $explrestunits .= (int)$expunit[$i].","; // if is first value , convert into integer
                } else {
                    $explrestunits .= $expunit[$i].",";
                }
            }
            $thecash = $explrestunits.$lastthree;
        } else {
            $thecash = $num;
        }
        return $thecash; // writes the final format where $currency is the currency symbol.
    }
?>

2
投票

我认为这是一个快速且简单的解决方案:-

        function formatToInr($number){
        $number=round($number,2);
        // windows is not supported money_format
    if(setlocale(LC_MONETARY, 'en_IN')){
         return money_format('%!'.$decimal.'n', $number);
         }
     else {
        if(floor($number) == $number) {
            $append='.00';
        }else{
            $append='';
        }
        $number = preg_replace("/(\d+?)(?=(\d\d)+(\d)(?!\d))(\.\d+)?/i", "$1,", $number);
        return $number.$append;
        }
    }

1
投票

所以,如果我没看错的话,印度计数系统将数千分开,然后是一百的每一次幂?嗯...

也许是这样的?

function indian_number_format($num) {
    $num = "".$num;
    if( strlen($num) < 4) return $num;
    $tail = substr($num,-3);
    $head = substr($num,0,-3);
    $head = preg_replace("/\B(?=(?:\d{2})+(?!\d))/",",",$head);
    return $head.",".$tail;
}

1
投票

我对 Money_format() 使用了不同的格式参数来输出。

setlocale(LC_MONETARY, 'en_IN');
if (ctype_digit($amount) ) {
     // is whole number
     // if not required any numbers after decimal use this format 
     $amount = money_format('%!.0n', $amount);
}
else {
     // is not whole number
     $amount = money_format('%!i', $amount);
}
//$amount=10043445.7887 outputs 1,00,43,445.79
//$amount=10043445 outputs 1,00,43,445

1
投票
$amount=-3000000000111.11;
$amount<0?(($sign='-').($amount*=-1)):$sign=''; //Extracting sign from given amount
$pos=strpos($amount, '.'); //Identifying the decimal point position
$amt=  substr($amount, $pos-3); // Extracting last 3 digits of integer part along with fractional part
$amount=  substr($amount,0, $pos-3); //removing the extracted part from amount
for(;strlen($amount);$amount=substr($amount,0,-2)) // Now loop through each 2 digits of remaining integer part
    $amt=substr ($amount,-2).','.$amt; //forming Indian Currency format by appending (,) for each 2 digits
echo $sign.$amt; //Appending sign

0
投票

您应该检查 number_format 函数。这是链接

用逗号分隔千位看起来像

$rupias = number_format($number, 2, ',', ',');

0
投票

上述函数不适用于 Decimal

$amount = 10000034000.001;
$amount = moneyFormatIndia( $amount );
echo $amount;




function moneyFormatIndia($num){
        $nums = explode(".",$num);
        if(count($nums)>2){
            return "0";
        }else{
        if(count($nums)==1){
            $nums[1]="00";
        }
        $num = $nums[0];
        $explrestunits = "" ;
        if(strlen($num)>3){
            $lastthree = substr($num, strlen($num)-3, strlen($num));
            $restunits = substr($num, 0, strlen($num)-3); 
            $restunits = (strlen($restunits)%2 == 1)?"0".$restunits:$restunits; 
            $expunit = str_split($restunits, 2);
            for($i=0; $i<sizeof($expunit); $i++){

                if($i==0)
                {
                    $explrestunits .= (int)$expunit[$i].","; 
                }else{
                    $explrestunits .= $expunit[$i].",";
                }
            }
            $thecash = $explrestunits.$lastthree;
        } else {
            $thecash = $num;
        }
        return $thecash.".".$nums[1]; 
        }
    }

答案:10,00,00,34,000.001


0
投票

这是我自己的职责来完成任务

function bd_money($num) {
    $pre = NULL; $sep = array(); $app = '00';
    $s=substr($num,0,1);
    if ($s=='-') {$pre= '-';$num = substr($num,1);}
    $num=explode('.',$num);
    if (count($num)>1) $app=$num[1];
    if (strlen($num[0])<4) return $pre . $num[0] . '.' . $app;
    $th=substr($num[0],-3);
    $hu=substr($num[0],0,-3);
    while(strlen($hu)>0){$sep[]=substr($hu,-2); $hu=substr($hu,0,-2);}
    return $pre.implode(',',array_reverse($sep)).','.$th.'.'.$app;
}

每千次查询花费了 0.0110 秒,而 number_format 仅花费了 0.001 秒。 仅当性能是目标问题时,始终尝试使用 PHP 原生函数。


0
投票
$r=explode('.',12345601.20);

$n = $r[0];
$len = strlen($n); //lenght of the no
$num = substr($n,$len-3,3); //get the last 3 digits
$n = $n/1000; //omit the last 3 digits already stored in $num
while($n > 0) //loop the process - further get digits 2 by 2
{
    $len = strlen($n);
    $num = substr($n,$len-2,2).",".$num;
    $n = round($n/100);
}
echo "Rs.".$num.'.'.$r[1];

0
投票

如果你不想在我的例子中使用任何内置函数,我是在iis服务器上做的,所以无法使用php中的函数,所以这样做了

$num = -21324322.23;


moneyFormatIndiaPHP($num);
function moneyFormatIndiaPHP($num){
    //converting it to string 
    $numToString = (string)$num;

    //take care of decimal values
    $change = explode('.', $numToString);

    //taking care of minus sign
    $checkifminus =  explode('-', $change[0]);


    //if minus then change the value as per
    $change[0] = (count($checkifminus) > 1)? $checkifminus[1] : $checkifminus[0];

    //store the minus sign for further
    $min_sgn = '';
    $min_sgn = (count($checkifminus) > 1)?'-':'';



    //catch the last three
    $lastThree = substr($change[0], strlen($change[0])-3);



    //catch the other three
    $ExlastThree = substr($change[0], 0 ,strlen($change[0])-3);


    //check whethr empty 
    if($ExlastThree != '')
        $lastThree = ',' . $lastThree;


    //replace through regex
    $res = preg_replace("/\B(?=(\d{2})+(?!\d))/",",",$ExlastThree);

    //main container num
    $lst = '';

    if(isset($change[1]) == ''){
        $lst =  $min_sgn.$res.$lastThree;
    }else{
        $lst =  $min_sgn.$res.$lastThree.".".$change[1];
    }

    //special case if equals to 2 then 
    if(strlen($change[0]) === 2){
        $lst = str_replace(",","",$lst);
    }

    return $lst;
}

0
投票

这适用于整数和浮点值

    function indian_money_format($number)
    {

        if(strstr($number,"-"))
        {
            $number = str_replace("-","",$number);
            $negative = "-";
        }

        $split_number = @explode(".",$number);

        $rupee = $split_number[0];
        $paise = @$split_number[1];

        if(@strlen($rupee)>3)
        {
            $hundreds = substr($rupee,strlen($rupee)-3);
            $thousands_in_reverse = strrev(substr($rupee,0,strlen($rupee)-3));
            $thousands = '';
            for($i=0; $i<(strlen($thousands_in_reverse)); $i=$i+2)
            {
                $thousands .= $thousands_in_reverse[$i].$thousands_in_reverse[$i+1].",";
            }
            $thousands = strrev(trim($thousands,","));
            $formatted_rupee = $thousands.",".$hundreds;

        }
        else
        {
            $formatted_rupee = $rupee;
        }

        if((int)$paise>0)
        {
            $formatted_paise = ".".substr($paise,0,2);
        }else{
            $formatted_paise = '.00';
        }

        return $negative.$formatted_rupee.$formatted_paise;

    }

0
投票

使用此功能:

function addCommaToRs($amt, &$ret, $dec='', $sign=''){
    if(preg_match("/-/",$amt)){
        $amts=explode('-',$amt);
        $amt=$amts['1'];
        static $sign='-';
    } 
    if(preg_match("/\./",$amt)){
        $amts=explode('.',$amt);
        $amt=$amts['0'];
        $l=strlen($amt);
        static $dec;
        $dec=$amts['1'];
    } else {
        $l=strlen($amt);
    }
    if($l>3){
        if($l%2==0){
            $ret.= substr($amt,0,1);
            $ret.= ",";
            addCommaToRs(substr($amt,1,$l),$ret,$dec);
        } else{
            $ret.=substr($amt,0,2);
            $ret.= ",";     
            addCommaToRs(substr($amt,2,$l),$ret,$dec);
        }
    } else {
        $ret.= $amt;
        if($dec) $ret.=".".$dec;
    }
    return $sign.$ret; 
}

这样称呼它:

$amt = '';
echo addCommaToRs(123456789.123,&$amt,0);

这将返回

12,34,567.123


0
投票
<?php
    function moneyFormatIndia($num) 
    {
        //$num=123456789.00;
        $result='';
        $sum=explode('.',$num);
        $after_dec=$sum[1];
        $before_dec=$sum[0];
        $result='.'.$after_dec;
        $num=$before_dec;
        $len=strlen($num);
        if($len<=3) 
        {
            $result=$num.$result;
        }
        else
        {
            if($len<=5)
            {
                $result='Rs '.substr($num, 0,$len-3).','.substr($num,$len-3).$result;
                return $result;
            }
            else
            {
                $ls=strlen($num);
                $result=substr($num, $ls-5,2).','.substr($num, $ls-3).$result;
                $num=substr($num, 0,$ls-5);
                while(strlen($num)!=0)
                {
                    $result=','.$result;
                    $ls=strlen($num);
                    if($ls<=2)
                    {
                        $result='Rs. '.$num.$result;
                        return $result;
                    }
                    else
                    {
                        $result=substr($num, $ls-2).$result;
                        $num=substr($num, 0,$ls-2);
                    }
                }
            }
        }
    }
?>

0
投票

这是我对这个货币格式问题的版本。

$amount = 1000.45;
function indian_money_format($amount){
    $e = explode('.',$amount);
    $left = $e[0];
    $right = $e[1];
    $nLeft = [];
    $rev_left= strrev($left);
    $left_count = strlen($rev_left);
    for($x=0;$x<$left_count;$x++){
        $nLeft[] = $rev_left[$x];
        if ($x==2){
            $nLeft[] = ',';
        }else if (($x+1)%2 == 1 && $x>=3){
            $nLeft[] = ',';
        }
    }
    $amount = ltrim(strrev(implode('',$nLeft)),',').".".$right;
    return $amount;
}


echo "<hr>";
echo indian_money_format($amount);

-3
投票

这是你可以做的简单的事情,

 float amount = 100000;

 NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));

 String moneyString = formatter.format(amount);

 System.out.println(moneyString);

输出将为 , Rs.100,000.00 .


-3
投票
declare @Price decimal(26,7)
Set @Price=1234456677
select FORMAT(@Price,  'c', 'en-In')

结果:

1,23,44,56,677.00
© www.soinside.com 2019 - 2024. All rights reserved.