Alternative to money_format() Function in PHP on Windows Platform

前端 未结 13 1719
天命终不由人
天命终不由人 2020-12-01 09:02

I am using the money_format() function in PHP, which gives the following error:

Fatal error: Call to undefined function money_format()


        
相关标签:
13条回答
  • 2020-12-01 09:30

    The solution to this problem is create a PHP file with the money_format() function and use the Apache auto_prepend_file directive in your php.ini file. Usually, if you use XAMPP, your php.ini should be in

    C:\XAMPP\php\php.ini
    

    Append this line of code to your php.ini file.

    auto_prepend_file = "C:\money_format.php"
    

    use this function in 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; 
    } 
    
    0 讨论(0)
  • 2020-12-01 09:30

    **

    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
    
    0 讨论(0)
  • 2020-12-01 09:33
     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); ; 
    

    output:$45.00

    0 讨论(0)
  • 2020-12-01 09:34

    I would suggest taking a look into NumberFormatter using NumberFormatter::CURRENCY and locale.

    Also Laravel number_format($price, 2) function is super useful.

    Note, also useful functional that seems to contain similar format:

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

    And don't forget to check if the function exist!

    if (!function_exists('money_format')) { //... }
    
    0 讨论(0)
  • 2020-12-01 09:36

    I don't understand why @Ajeet is making it so complicated why not do like this, It also now works for 4 digit numbers to answer @bharanikumar "but it is not working for the '0899'"

    function toMoney($val,$symbol='$',$r=2)
    {
        $n = $val;
        $sign = ($n < 0) ? '-' : '';
        $i = number_format(abs($n),$r);
    
        return  $symbol.$sign.$i;
    }
    
    0 讨论(0)
  • 2020-12-01 09:42

    @Y Talansky your function could be the next code:

    function number_to_money($value, $symbol = '$', $decimals = 2)
    {
        return $symbol . ($value < 0 ? '-' : '') . number_format(abs($value), $decimals);
    }
    
    0 讨论(0)
提交回复
热议问题