У меня вопрос о форматировании валюты рупии (Indian Rupee – 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 () в индийском формате валюты?
У вас так много вариантов, но money_format
может сделать трюк для вас.
Пример:
$amount = '100000'; setlocale(LC_MONETARY, 'en_IN'); $amount = money_format('%!i', $amount); echo $amount;
Вывод:
1,00,000.00
Заметка:
Функция money_format () определяется только в том случае, если система имеет функции strfmon. Например, 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. }
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); }
ПРИМЕЧАНИЕ: он не проверяется по значениям float и подходит только для Integer
В примере, который вы связали, используются библиотеки ICU, которые доступны с PHP в Intl Extension Docs :
$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
Проверьте этот код на его работу 100% для индийского формата Rs с десятичной установкой u можете использовать
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="$des0";}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. }
Итак, если я читаю это право, Индийская система нумерации разделяет тысячи, тогда каждая сила из сотни прошлых лет? Хм …
Может, что-то вроде этого?
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; }
$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
Когда 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; }
Вы должны проверить функцию number_format. Ссылка здесь
Разделение тысяч запятыми будет выглядеть так:
$rupias = number_format($number, 2, ',', ',');
Я использовал разные параметры формата для 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
Выше функции Не работает с десятичной
$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
Это моя собственная функция для выполнения задачи
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; }
в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 секунды за запрос THOUSAND, а number_format – только 0,001. Всегда старайтесь использовать собственные функции PHP только тогда, когда производительность является целевой проблемой.
$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];
Если вы не хотите использовать какую-либо встроенную функцию в моем случае, я делал на сервере 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; }
Это значение как для целочисленных, так и для плавающих значений
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; }
Используйте эту функцию:
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
.
declare @Price decimal(26,7) Set @Price=1234456677 select FORMAT(@Price, 'c', 'en-In')
Результат:
1,23,44,56,677.00
heres – простая вещь, которую вы можете сделать,
float amount = 100000; NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN")); String moneyString = formatter.format(amount); System.out.println(moneyString);
Выход будет, 100 000,00 рупий.