Альтернатива функции money_format () в PHP на платформе Windows

Я использую money_format() в PHP, которая дает следующую ошибку:

 Fatal error: Call to undefined function money_format() 

Поиски этой ошибки показывают, что функция money_format() определяется только в том случае, если система имеет функции strfmon . Например, Windows не делает этого, поэтому money_format() не определен в Windows.

Есть ли эквивалентная функция PHP, доступная для Windows?

Если у вас есть расширение Intl , вы можете использовать

  • NumberFormatter :: formatCurrency – форматирует значение валюты в соответствии с правилами форматирования.

Пример из руководства

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

Вывод

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

Также см. Мой ответ о том, как разбрать эту форматированную денежную строку обратно в float:

  • PHP: unformat money

Будь проще!

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

попробуйте этот код выше кода «$ 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); ; 

выход: $ 45,00

Я бы предложил взглянуть на NumberFormatter используя NumberFormatter::CURRENCY и locale.

Также функция Laravel number_format($price, 2) очень полезна.

Заметьте, также полезный функционал, который, похоже, содержит схожий формат:

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

И не забудьте проверить, существует ли функция!

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

Я всегда использовал это, чтобы вручную добавить знак доллара:

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

Функция @Ajeet toMoney выглядит хорошо, но она не работает для '0899'

Изменить length В strlen()

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

поэтому измените ниже

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

Теперь это будет работать для любых данных.

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

Я не понимаю, почему @Ajeet делает это настолько сложным, что не так, как сейчас. Он также теперь работает для четырехзначных чисел, чтобы ответить на @bharanikumar, «но он не работает для« 0899 »»

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

@Y Talansky вашей функцией может быть следующий код:

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

**

CLP money (moneda peso chileno, con formato 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 

Я использую эту функцию:

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

И используйте его вот так:

 $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€ * */ 

Вместо money_format() вы также можете попробовать это. Надеюсь, этому поможет любой парень, который столкнулся с этим call to undefined function money_format() .

 <?php $price = number_format($price, 2); echo "$".$price; ?> 

Вывод:

 $120.00