Alternative à la fonction money_format () en PHP sur la plate-forme Windows

J’utilise la fonction money_format() en PHP, ce qui donne l’erreur suivante:

 Fatal error: Call to undefined function money_format() 

Les recherches sur cette erreur révèlent que la fonction money_format() est uniquement définie si le système possède des fonctionnalités strfmon . Par exemple, Windows ne le fait pas, donc money_format() n’est pas défini dans Windows.

Existe-t-il une fonction PHP équivalente disponible pour Windows?

Si vous avez l’ extension Intl , vous pouvez utiliser

  • NumberFormatter :: formatCurrency – Formate une valeur monétaire en fonction des règles du formateur.

Exemple de manuel

 $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"; 

Sortie

 1.234.567,89 € 1.234.567,89 RUR 1 234 567,89€ 1 234 567,89р. 

Voir aussi ma réponse sur comment parsingr cette chaîne d’argent formatée dans un flotteur:

  • PHP: l’argent non formaté

Rester simple!

 sprintf('%01.2f', $val); 
  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); ?> 

Essayez ceci le code de sortie ci-dessus est “$ 9,856,478,521,456.26”

  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); ; 

sortie: 45,00 $

Je suggère de jeter un oeil à NumberFormatter utilisant NumberFormatter::CURRENCY et les parameters régionaux.

La fonction Laravel number_format($price, 2) est également très utile.

Remarque, également utile fonctionnel qui semble contenir un format similaire:

 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]); } } 

Et n’oubliez pas de vérifier si la fonction existe!

 if (!function_exists('money_format')) { //... } 

Je l’ai toujours utilisé pour append manuellement le signe dollar:

 // for $k = 53.234234978 $k = "$ " . number_format($k, 2); // output = $ 53.23 

La fonction @Ajeet toMoney semble bonne, mais elle ne fonctionne pas pour le ‘0899’

Changer la length strlen()

$ j = (($ j = $ i.length)> 3)? $ j% 3: 0;

alors changez en dessous comme

$ j = (($ j = strlen ($ i))> 3)? $ j% 3: 0;

Maintenant, cela fonctionnera pour toutes les données.

  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 ?> 

Je ne comprends pas pourquoi @Ajeet le rend si compliqué pourquoi ne pas faire comme ça, il fonctionne maintenant pour les numéros à 4 chiffres pour répondre à @bharanikumar “mais il ne fonctionne pas pour le ‘0899’”

 function toMoney($val,$symbol='$',$r=2) { $n = $val; $sign = ($n < 0) ? '-' : ''; $i = number_format(abs($n),$r); return $symbol.$sign.$i; } 

@Y Talansky votre fonction pourrait être le prochain code:

 function number_to_money($value, $symbol = '$', $decimals = 2) { return $symbol . ($value < 0 ? '-' : '') . number_format(abs($value), $decimals); } 

**

Argent du CLP (moneda peso chileno, format miles)

**

  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 

J’utilise cette fonction:

 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; } 

Et l’utiliser comme ça:

 $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 "
"; } /** * output: * * 1500.00€ * 90.00€ * 17.52€ * 3650.95€ * */

Au lieu de money_format() vous pouvez également essayer ceci. J’espère que cela sera utile à tous les gars qui ont fait face à cet call to undefined function money_format() .

  

Sortie:

 $120.00 

La solution à ce problème est de créer un fichier PHP avec la fonction money_format () et d’utiliser la directive Apache auto_prepend_file dans votre fichier php.ini. Habituellement, si vous utilisez XAMPP, votre php.ini devrait être dans

 C:\XAMPP\php\php.ini 

Ajoutez cette ligne de code à votre fichier php.ini.

 auto_prepend_file = "C:\money_format.php" 

utiliser cette fonction dans 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)) { sortinggger_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; }