reglas - Cómo mostrar moneda en formato de numeración india en PHP
sistema numerico de la antigua india (20)
Tengo una pregunta sobre el formato de la moneda de la rupia (rupia india - INR).
Por ejemplo, los números aquí se representan como:
1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000
Consulte el sistema de numeración indio
Tengo que ver con eso PHP.
He visto esta pregunta Visualización de moneda en formato de numeración indio . Pero no pude conseguirlo para PHP mi problema.
Actualizar:
¿Cómo usar money_format() en formato de moneda india?
Cuando money_format no está disponible:
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;
}
Debe comprobar la función number_format. Aqui esta el link
Separar miles con comas se verá como
$rupias = number_format($number, 2, '','', '','');
El ejemplo que ha enlazado está haciendo uso de las bibliotecas de ICU que están disponibles con PHP en los intl ExtensionDocs :
$fmt = new NumberFormatter($locale = ''en_IN'', NumberFormatter::CURRENCY);
echo $fmt->format(10000000000.1234)."/n"; # Rs 10,00,00,00,000.12
O quizás mejor encajando en tu caso:
$fmt = new NumberFormatter($locale = ''en_IN'', NumberFormatter::DECIMAL);
echo $fmt->format(10000000000)."/n"; # 10,00,00,00,000
Entonces, si estoy leyendo bien, el Sistema de Numeración de la India separa a los miles, ¿entonces cada potencia de cien pasados? Hmmm
Tal vez algo como esto?
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;
}
Es mi propia función hacer la tarea.
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;
}
Tomó 0.0110 Segundos por consulta de THOUSAND, mientras que number_format solo tomó 0.001. Siempre intente usar las funciones nativas de PHP solo cuando el rendimiento es un problema objetivo.
He usado diferentes parámetros de formato para money_format () para mi salida.
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
Heres es algo simple que puedes hacer,
float amount = 100000;
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
String moneyString = formatter.format(amount);
System.out.println(moneyString);
La salida será, Rs.100,000.00.
Por encima de la función no funciona con 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];
}
}
Respuesta: 10,00,00,34,000.001
Si no desea utilizar ninguna función incorporada en mi caso, lo estaba haciendo en el servidor iis, por lo que no pude utilizar una función en PHP así que hice esto
$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;
}
Simplemente use la siguiente función para formatear en INR.
function amount_inr_format($amount) {
$fmt = new /NumberFormatter($locale = ''en_IN'', NumberFormatter::DECIMAL);
return $fmt->format($amount);
}
Tienes tantas opciones pero money_format() puede hacer el truco por ti.
Ejemplo:
$amount = ''100000'';
setlocale(LC_MONETARY, ''en_IN'');
$amount = money_format(''%!i'', $amount);
echo $amount;
Salida:
1,00,000.00
Nota:
La función money_format () solo se define si el sistema tiene capacidades strfmon. Por ejemplo, Windows no lo hace, por lo que money_format () no está definido en Windows.
Implementación de PHP puro - Funciona en cualquier sistema:
$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.
}
Utilice esta función:
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;
}
Llámalo así:
$amt = '''';
echo addCommaToRs(123456789.123,&$amt,0);
Esto devolverá 12,34,567.123
.
Verifique este código en su trabajo 100% para el formato Rs indio con configuración decimal que puede usar
123456.789 123.456 123.4 123 y 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.
}
Esto tanto para valores enteros como flotantes.
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;
}
$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
$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];
declare @Price decimal(26,7)
Set @Price=1234456677
select FORMAT(@Price, ''c'', ''en-In'')
Resultado:
1,23,44,56,677.00
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);
}
NOTA: no está probado en valores flotantes y es adecuado solo para enteros
<?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);
}
}
}
}
}
?>
<?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.
}
?>