pesos - Alternativa a la función money_format() en PHP en la plataforma de Windows
php money format pesos (13)
¡Mantenlo simple!
sprintf(''%01.2f'', $val);
Estoy usando la función money_format()
en PHP, que da el siguiente error:
Fatal error: Call to undefined function money_format()
Las búsquedas sobre este error revelan que la función money_format()
solo está definida si el sistema tiene capacidades de strfmon
. Por ejemplo, Windows no, por lo que money_format()
no está definido en Windows.
¿Hay una función PHP equivalente disponible para Windows?
**
Dinero de CLP (moneda peso chileno, con millas de formato)
**
function toMoney($val,$symbol=''$'',$r=0)
{
$n = $val;
$c = is_float($n) ? 1 : number_format($n,$r);
$d = ''.'';
$t = '','';
$sign = ($n < 0) ? ''-'' : '''';
$i = $n=number_format(abs($n),$r);
$j = (($j = strlen($i)) > 2) ? $j % 2 : 0;
return $symbol.$sign .($j ? substr($i,0, $j) + $t : '''').preg_replace(''/(/d{3})(?=/d)/'',"$1" + $t,substr($i,$j)) ;
}
echo toMoney(45); $45
echo toMoney(4500); $4,500
echo toMoney(45000); $45,000
@Y Talansky su función podría ser el próximo código:
function number_to_money($value, $symbol = ''$'', $decimals = 2)
{
return $symbol . ($value < 0 ? ''-'' : '''') . number_format(abs($value), $decimals);
}
En lugar de money_format()
también puedes probar esto. Espero que esto call to undefined function money_format()
a cualquier chico que enfrente esta call to undefined function money_format()
error.
<?php
$price = number_format($price, 2);
echo "$".$price;
?>
Salida:
$120.00
La función @Ajeet toMoney se ve bien, pero no está funcionando para el ''0899''
Cambiar length
en strlen()
$ j = (($ j = $ i.length)> 3)? $ j% 3: 0;
así que cambia a abajo como
$ j = (($ j = strlen ($ i))> 3)? $ j% 3: 0;
Ahora esto funcionará para cualquier información.
<?php
function toMoney($val,$symbol=''$'',$r=2)
{
$n = $val;
$c = is_float($n) ? 1 : number_format($n,$r);
$d = ''.'';
$t = '','';
$sign = ($n < 0) ? ''-'' : '''';
$i = $n=number_format(abs($n),$r);
$j = (($j = strlen($i)) > 3) ? $j % 3 : 0;
return $symbol.$sign .($j ? substr($i,0, $j) + $t : '''').preg_replace(''/(/d{3})(?=/d)/'',"$1" + $t,substr($i,$j)) ;
}
echo toMoney(''0899''/100); //Note: single quotes mandatory
?>
La solución a este problema es crear un archivo PHP con la función money_format () y usar la directiva auto_prepend_file de Apache en su archivo php.ini. Por lo general, si usa XAMPP, su php.ini debería estar en
C:/XAMPP/php/php.ini
Agregue esta línea de código a su archivo php.ini.
auto_prepend_file = "C:/money_format.php"
usa esta función en money_format.php
function money_format($formato, $valor) {
if (setlocale(LC_MONETARY, 0) == ''C'') {
return number_format($valor, 2);
}
$locale = localeconv();
$regex = ''/^''. // Inicio da Expressao
''%''. // Caractere %
''(?:''. // Inicio das Flags opcionais
''/=([/w/040])''. // Flag =f
''|''.
''([/^])''. // Flag ^
''|''.
''(/+|/()''. // Flag + ou (
''|''.
''(!)''. // Flag !
''|''.
''(-)''. // Flag -
'')*''. // Fim das flags opcionais
''(?:([/d]+)?)''. // W Largura de campos
''(?:#([/d]+))?''. // #n Precisao esquerda
''(?:/.([/d]+))?''. // .p Precisao direita
''([in%])''. // Caractere de conversao
''$/''; // Fim da Expressao
if (!preg_match($regex, $formato, $matches)) {
trigger_error(''Formato invalido: ''.$formato, E_USER_WARNING);
return $valor;
}
$opcoes = array(
''preenchimento'' => ($matches[1] !== '''') ? $matches[1] : '' '',
''nao_agrupar'' => ($matches[2] == ''^''),
''usar_sinal'' => ($matches[3] == ''+''),
''usar_parenteses'' => ($matches[3] == ''(''),
''ignorar_simbolo'' => ($matches[4] == ''!''),
''alinhamento_esq'' => ($matches[5] == ''-''),
''largura_campo'' => ($matches[6] !== '''') ? (int)$matches[6] : 0,
''precisao_esq'' => ($matches[7] !== '''') ? (int)$matches[7] : false,
''precisao_dir'' => ($matches[8] !== '''') ? (int)$matches[8] : $locale[''int_frac_digits''],
''conversao'' => $matches[9]
);
if ($opcoes[''usar_sinal''] && $locale[''n_sign_posn''] == 0) {
$locale[''n_sign_posn''] = 1;
} elseif ($opcoes[''usar_parenteses'']) {
$locale[''n_sign_posn''] = 0;
}
if ($opcoes[''precisao_dir'']) {
$locale[''frac_digits''] = $opcoes[''precisao_dir''];
}
if ($opcoes[''nao_agrupar'']) {
$locale[''mon_thousands_sep''] = '''';
}
$tipo_sinal = $valor >= 0 ? ''p'' : ''n'';
if ($opcoes[''ignorar_simbolo'']) {
$simbolo = '''';
} else {
$simbolo = $opcoes[''conversao''] == ''n'' ? $locale[''currency_symbol'']
: $locale[''int_curr_symbol''];
}
$numero = number_format(abs($valor), $locale[''frac_digits''], $locale[''mon_decimal_point''], $locale[''mon_thousands_sep'']);
$sinal = $valor >= 0 ? $locale[''positive_sign''] : $locale[''negative_sign''];
$simbolo_antes = $locale[$tipo_sinal.''_cs_precedes''];
$espaco1 = $locale[$tipo_sinal.''_sep_by_space''] == 1 ? '' '' : '''';
$espaco2 = $locale[$tipo_sinal.''_sep_by_space''] == 2 ? '' '' : '''';
$formatado = '''';
switch ($locale[$tipo_sinal.''_sign_posn'']) {
case 0:
if ($simbolo_antes) {
$formatado = ''(''.$simbolo.$espaco1.$numero.'')'';
} else {
$formatado = ''(''.$numero.$espaco1.$simbolo.'')'';
}
break;
case 1:
if ($simbolo_antes) {
$formatado = $sinal.$espaco2.$simbolo.$espaco1.$numero;
} else {
$formatado = $sinal.$numero.$espaco1.$simbolo;
}
break;
case 2:
if ($simbolo_antes) {
$formatado = $simbolo.$espaco1.$numero.$sinal;
} else {
$formatado = $numero.$espaco1.$simbolo.$espaco2.$sinal;
}
break;
case 3:
if ($simbolo_antes) {
$formatado = $sinal.$espaco2.$simbolo.$espaco1.$numero;
} else {
$formatado = $numero.$espaco1.$sinal.$espaco2.$simbolo;
}
break;
case 4:
if ($simbolo_antes) {
$formatado = $simbolo.$espaco2.$sinal.$espaco1.$numero;
} else {
$formatado = $numero.$espaco1.$simbolo.$espaco2.$sinal;
}
break;
}
if ($opcoes[''largura_campo''] > 0 && strlen($formatado) < $opcoes[''largura_campo'']) {
$alinhamento = $opcoes[''alinhamento_esq''] ? STR_PAD_RIGHT : STR_PAD_LEFT;
$formatado = str_pad($formatado, $opcoes[''largura_campo''], $opcoes[''preenchimento''], $alinhamento);
}
return $formatado;
}
No entiendo por qué @Ajeet lo está haciendo tan complicado, ¿por qué no hacer esto? Ahora también funciona con números de 4 dígitos para responder @bharanikumar "pero no funciona para el ''0899''".
function toMoney($val,$symbol=''$'',$r=2)
{
$n = $val;
$sign = ($n < 0) ? ''-'' : '''';
$i = number_format(abs($n),$r);
return $symbol.$sign.$i;
}
Si tiene la extensión Intl , puede usar
- NumberFormatter::formatCurrency - Formatea un valor de moneda de acuerdo con las reglas del formateador.
Ejemplo de Manual
$fmt = new NumberFormatter( ''de_DE'', NumberFormatter::CURRENCY );
echo $fmt->formatCurrency(1234567.891234567890000, "EUR")."/n";
echo $fmt->formatCurrency(1234567.891234567890000, "RUR")."/n";
$fmt = new NumberFormatter( ''ru_RU'', NumberFormatter::CURRENCY );
echo $fmt->formatCurrency(1234567.891234567890000, "EUR")."/n";
echo $fmt->formatCurrency(1234567.891234567890000, "RUR")."/n";
Salida
1.234.567,89 €
1.234.567,89 RUR
1 234 567,89€
1 234 567,89р.
También vea mi respuesta sobre cómo analizar esa cadena de dinero formateada de nuevo en un carro flotante:
Siempre acabo de usar esto para agregar manualmente el signo de dólar:
// for $k = 53.234234978
$k = "$ " . number_format($k, 2);
// output = $ 53.23
Sugeriría echarle un vistazo a NumberFormatter
usando NumberFormatter::CURRENCY
y locale.
Además, la función Laravel number_format($price, 2)
es muy útil.
Tenga en cuenta, también útil funcional que parece contener un formato similar:
function money_format($floatcurr, $curr = ''EUR'')
{
$currencies[''ARS''] = array(2, '','', ''.''); // Argentine Peso
$currencies[''AMD''] = array(2, ''.'', '',''); // Armenian Dram
$currencies[''AWG''] = array(2, ''.'', '',''); // Aruban Guilder
$currencies[''AUD''] = array(2, ''.'', '' ''); // Australian Dollar
$currencies[''BSD''] = array(2, ''.'', '',''); // Bahamian Dollar
$currencies[''BHD''] = array(3, ''.'', '',''); // Bahraini Dinar
$currencies[''BDT''] = array(2, ''.'', '',''); // Bangladesh, Taka
$currencies[''BZD''] = array(2, ''.'', '',''); // Belize Dollar
$currencies[''BMD''] = array(2, ''.'', '',''); // Bermudian Dollar
$currencies[''BOB''] = array(2, ''.'', '',''); // Bolivia, Boliviano
$currencies[''BAM''] = array(2, ''.'', '',''); // Bosnia and Herzegovina, Convertible Marks
$currencies[''BWP''] = array(2, ''.'', '',''); // Botswana, Pula
$currencies[''BRL''] = array(2, '','', ''.''); // Brazilian Real
$currencies[''BND''] = array(2, ''.'', '',''); // Brunei Dollar
$currencies[''CAD''] = array(2, ''.'', '',''); // Canadian Dollar
$currencies[''KYD''] = array(2, ''.'', '',''); // Cayman Islands Dollar
$currencies[''CLP''] = array(0, '''', ''.''); // Chilean Peso
$currencies[''CNY''] = array(2, ''.'', '',''); // China Yuan Renminbi
$currencies[''COP''] = array(2, '','', ''.''); // Colombian Peso
$currencies[''CRC''] = array(2, '','', ''.''); // Costa Rican Colon
$currencies[''HRK''] = array(2, '','', ''.''); // Croatian Kuna
$currencies[''CUC''] = array(2, ''.'', '',''); // Cuban Convertible Peso
$currencies[''CUP''] = array(2, ''.'', '',''); // Cuban Peso
$currencies[''CYP''] = array(2, ''.'', '',''); // Cyprus Pound
$currencies[''CZK''] = array(2, ''.'', '',''); // Czech Koruna
$currencies[''DKK''] = array(2, '','', ''.''); // Danish Krone
$currencies[''DOP''] = array(2, ''.'', '',''); // Dominican Peso
$currencies[''XCD''] = array(2, ''.'', '',''); // East Caribbean Dollar
$currencies[''EGP''] = array(2, ''.'', '',''); // Egyptian Pound
$currencies[''SVC''] = array(2, ''.'', '',''); // El Salvador Colon
$currencies[''ATS''] = array(2, '','', ''.''); // Euro
$currencies[''BEF''] = array(2, '','', ''.''); // Euro
$currencies[''DEM''] = array(2, '','', ''.''); // Euro
$currencies[''EEK''] = array(2, '','', ''.''); // Euro
$currencies[''ESP''] = array(2, '','', ''.''); // Euro
$currencies[''EUR''] = array(2, '','', ''.''); // Euro
$currencies[''FIM''] = array(2, '','', ''.''); // Euro
$currencies[''FRF''] = array(2, '','', ''.''); // Euro
$currencies[''GRD''] = array(2, '','', ''.''); // Euro
$currencies[''IEP''] = array(2, '','', ''.''); // Euro
$currencies[''ITL''] = array(2, '','', ''.''); // Euro
$currencies[''LUF''] = array(2, '','', ''.''); // Euro
$currencies[''NLG''] = array(2, '','', ''.''); // Euro
$currencies[''PTE''] = array(2, '','', ''.''); // Euro
$currencies[''GHC''] = array(2, ''.'', '',''); // Ghana, Cedi
$currencies[''GIP''] = array(2, ''.'', '',''); // Gibraltar Pound
$currencies[''GTQ''] = array(2, ''.'', '',''); // Guatemala, Quetzal
$currencies[''HNL''] = array(2, ''.'', '',''); // Honduras, Lempira
$currencies[''HKD''] = array(2, ''.'', '',''); // Hong Kong Dollar
$currencies[''HUF''] = array(0, '''', ''.''); // Hungary, Forint
$currencies[''ISK''] = array(0, '''', ''.''); // Iceland Krona
$currencies[''INR''] = array(2, ''.'', '',''); // Indian Rupee
$currencies[''IDR''] = array(2, '','', ''.''); // Indonesia, Rupiah
$currencies[''IRR''] = array(2, ''.'', '',''); // Iranian Rial
$currencies[''JMD''] = array(2, ''.'', '',''); // Jamaican Dollar
$currencies[''JPY''] = array(0, '''', '',''); // Japan, Yen
$currencies[''JOD''] = array(3, ''.'', '',''); // Jordanian Dinar
$currencies[''KES''] = array(2, ''.'', '',''); // Kenyan Shilling
$currencies[''KWD''] = array(3, ''.'', '',''); // Kuwaiti Dinar
$currencies[''LVL''] = array(2, ''.'', '',''); // Latvian Lats
$currencies[''LBP''] = array(0, '''', '' ''); // Lebanese Pound
$currencies[''LTL''] = array(2, '','', '' ''); // Lithuanian Litas
$currencies[''MKD''] = array(2, ''.'', '',''); // Macedonia, Denar
$currencies[''MYR''] = array(2, ''.'', '',''); // Malaysian Ringgit
$currencies[''MTL''] = array(2, ''.'', '',''); // Maltese Lira
$currencies[''MUR''] = array(0, '''', '',''); // Mauritius Rupee
$currencies[''MXN''] = array(2, ''.'', '',''); // Mexican Peso
$currencies[''MZM''] = array(2, '','', ''.''); // Mozambique Metical
$currencies[''NPR''] = array(2, ''.'', '',''); // Nepalese Rupee
$currencies[''ANG''] = array(2, ''.'', '',''); // Netherlands Antillian Guilder
$currencies[''ILS''] = array(2, ''.'', '',''); // New Israeli Shekel
$currencies[''TRY''] = array(2, ''.'', '',''); // New Turkish Lira
$currencies[''NZD''] = array(2, ''.'', '',''); // New Zealand Dollar
$currencies[''NOK''] = array(2, '','', ''.''); // Norwegian Krone
$currencies[''PKR''] = array(2, ''.'', '',''); // Pakistan Rupee
$currencies[''PEN''] = array(2, ''.'', '',''); // Peru, Nuevo Sol
$currencies[''UYU''] = array(2, '','', ''.''); // Peso Uruguayo
$currencies[''PHP''] = array(2, ''.'', '',''); // Philippine Peso
$currencies[''PLN''] = array(2, ''.'', '' ''); // Poland, Zloty
$currencies[''GBP''] = array(2, ''.'', '',''); // Pound Sterling
$currencies[''OMR''] = array(3, ''.'', '',''); // Rial Omani
$currencies[''RON''] = array(2, '','', ''.''); // Romania, New Leu
$currencies[''ROL''] = array(2, '','', ''.''); // Romania, Old Leu
$currencies[''RUB''] = array(2, '','', ''.''); // Russian Ruble
$currencies[''SAR''] = array(2, ''.'', '',''); // Saudi Riyal
$currencies[''SGD''] = array(2, ''.'', '',''); // Singapore Dollar
$currencies[''SKK''] = array(2, '','', '' ''); // Slovak Koruna
$currencies[''SIT''] = array(2, '','', ''.''); // Slovenia, Tolar
$currencies[''ZAR''] = array(2, ''.'', '' ''); // South Africa, Rand
$currencies[''KRW''] = array(0, '''', '',''); // South Korea, Won
$currencies[''SZL''] = array(2, ''.'', '', ''); // Swaziland, Lilangeni
$currencies[''SEK''] = array(2, '','', ''.''); // Swedish Krona
$currencies[''CHF''] = array(2, ''.'', ''/'''); // Swiss Franc
$currencies[''TZS''] = array(2, ''.'', '',''); // Tanzanian Shilling
$currencies[''THB''] = array(2, ''.'', '',''); // Thailand, Baht
$currencies[''TOP''] = array(2, ''.'', '',''); // Tonga, Paanga
$currencies[''AED''] = array(2, ''.'', '',''); // UAE Dirham
$currencies[''UAH''] = array(2, '','', '' ''); // Ukraine, Hryvnia
$currencies[''USD''] = array(2, ''.'', '',''); // US Dollar
$currencies[''VUV''] = array(0, '''', '',''); // Vanuatu, Vatu
$currencies[''VEF''] = array(2, '','', ''.''); // Venezuela Bolivares Fuertes
$currencies[''VEB''] = array(2, '','', ''.''); // Venezuela, Bolivar
$currencies[''VND''] = array(0, '''', ''.''); // Viet Nam, Dong
$currencies[''ZWD''] = array(2, ''.'', '' ''); // Zimbabwe Dollar
// custom function to generate: ##,##,###.##
function formatinr($input)
{
$dec = "";
$pos = strpos($input, ".");
if ($pos === FALSE)
{
//no decimals
}
else
{
//decimals
$dec = substr(round(substr($input, $pos), 2), 1);
$input = substr($input, 0, $pos);
}
$num = substr($input, -3); // get the last 3 digits
$input = substr($input, 0, -3); // omit the last 3 digits already stored in $num
// loop the process - further get digits 2 by 2
while (strlen($input) > 0)
{
$num = substr($input, -2).",".$num;
$input = substr($input, 0, -2);
}
return $num.$dec;
}
if ($curr == "INR")
{
return formatinr($floatcurr);
}
else
{
return number_format($floatcurr, $currencies[$curr][0], $currencies[$curr][1], $currencies[$curr][2]);
}
}
¡Y no olvide verificar si la función existe!
if (!function_exists(''money_format'')) { //... }
Yo uso esta función:
function formatPrice($number, array $options = [])
{
$options = array_replace([
''alwaysShowDecimals'' => true,
''nbDecimals'' => 2,
''decPoint'' => ".",
''thousandSep'' => "",
''moneySymbol'' => "€",
''moneyFormat'' => "vs", // v represents the value, s represents the money symbol
], $options);
extract($options);
$v = number_format($number, $nbDecimals, $decPoint, $thousandSep);
if (false === $alwaysShowDecimals && $nbDecimals > 0) {
$p = explode($decPoint, $v);
$dec = array_pop($p);
if (0 === (int)$dec) {
$v = implode('''', $p);
}
}
$ret = str_replace([
''v'',
''s'',
], [
$v,
$moneySymbol,
], $moneyFormat);
return $ret;
}
Y úsalo así:
$numbers = [
1500,
90,
17.52,
3650.95,
];
$options = [
''alwaysShowDecimals'' => true,
''nbDecimals'' => 2,
''decPoint'' => ".",
''thousandSep'' => "",
''moneySymbol'' => "€",
''moneyFormat'' => "vs", // v represents the value, s represents the money symbol
];
foreach ($numbers as $number) {
echo formatPrice($number, $options);
echo "<br>";
}
/**
* output:
*
* 1500.00€
* 90.00€
* 17.52€
* 3650.95€
*
*/
function toMoney($val,$symbol=''$'',$r=2)
{
$n = $val;
$c = is_float($n) ? 1 : number_format($n,$r);
$d = ''.'';
$t = '','';
$sign = ($n < 0) ? ''-'' : '''';
$i = $n=number_format(abs($n),$r);
$j = (($j = strlen($i)) > 3) ? $j % 3 : 0;
return $symbol.$sign .($j ? substr($i,0, $j) + $t : '''').preg_replace(''/(/d{3})(?=/d)/'',"$1" + $t,substr($i,$j)) ;
}
echo toMoney(45); ;
salida: $ 45.00
<?php
function toMoney($val,$symbol=''$'',$r=2)
{
$n = $val;
$c = is_float($n) ? 1 : number_format($n,$r);
$d = ''.'';
$t = '','';
$sign = ($n < 0) ? ''-'' : '''';
$i = $n=number_format(abs($n),$r);
$j = (($j = $i.length) > 3) ? $j % 3 : 0;
return $symbol.$sign .($j ? substr($i,0, $j) + $t : '''').preg_replace(''/(/d{3})(?=/d)/'',"$1" + $t,substr($i,$j)) ;
}
echo toMoney(9856478521456.256);
?>
intenta esto, el código de salida del código anterior es "$ 9,856,478,521,456.26"