SOLUTION - Fatal error: Call to undefined function money_format() in Drupal 6 Modules

Michael Phipps's picture

The PHP function money_format() is only defined if your server has strfmon capabilities. For example, Windows does not, so money_format() is undefined in Windows - and the problem is not necessarily limited to windows.

To get around this, here is a simple module that you can use that provides the money_format() function. I'm just providing the code here, but if you get stuck, let me know and I'll try to make the module available for download.

First, create the directory sites/default/modules/money_format

Next, save this code in a file named sites/default/modules/money_format/money_format.info

name = money_format
description = Provides the money_format PHP function for systems that do not have strfmon capabilities.
core = 6.x

Then, save this code in a file named sites/default/modules/money_format/money_format.module

<?php 

function money_format($format, $number) { 

    $regex  = '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?'. 

              '(?:#([0-9]+))?(?:\.([0-9]+))?([in%])/'; 

    if (setlocale(LC_MONETARY, 0) == 'C') { 

        setlocale(LC_MONETARY, ''); 

    } 

    $locale = localeconv(); 

    preg_match_all($regex, $format, $matches, PREG_SET_ORDER); 

    foreach ($matches as $fmatch) { 

        $value = floatval($number); 

        $flags = array( 

            'fillchar'  => preg_match('/\=(.)/', $fmatch[1], $match) ? 

                           $match[1] : ' ', 

            'nogroup'   => preg_match('/\^/', $fmatch[1]) > 0, 

            'usesignal' => preg_match('/\+|\(/', $fmatch[1], $match) ? 

                           $match[0] : '+', 

            'nosimbol'  => preg_match('/\!/', $fmatch[1]) > 0, 

            'isleft'    => preg_match('/\-/', $fmatch[1]) > 0 

        ); 

        $width      = trim($fmatch[2]) ? (int)$fmatch[2] : 0; 

        $left       = trim($fmatch[3]) ? (int)$fmatch[3] : 0; 

        $right      = trim($fmatch[4]) ? (int)$fmatch[4] : $locale['int_frac_digits']; 

        $conversion = $fmatch[5]; 

 

        $positive = true; 

        if ($value < 0) { 

            $positive = false; 

            $value  *= -1; 

        } 

        $letter = $positive ? 'p' : 'n'; 

 

        $prefix = $suffix = $cprefix = $csuffix = $signal = ''; 

 

        $signal = $positive ? $locale['positive_sign'] : $locale['negative_sign']; 

        switch (true) { 

            case $locale["{$letter}_sign_posn"] == 1 && $flags['usesignal'] == '+': 

                $prefix = $signal; 

                break; 

            case $locale["{$letter}_sign_posn"] == 2 && $flags['usesignal'] == '+': 

                $suffix = $signal; 

                break; 

            case $locale["{$letter}_sign_posn"] == 3 && $flags['usesignal'] == '+': 

                $cprefix = $signal; 

                break; 

            case $locale["{$letter}_sign_posn"] == 4 && $flags['usesignal'] == '+': 

                $csuffix = $signal; 

                break; 

            case $flags['usesignal'] == '(': 

            case $locale["{$letter}_sign_posn"] == 0: 

                $prefix = '('; 

                $suffix = ')'; 

                break; 

        } 

        if (!$flags['nosimbol']) { 

            $currency = $cprefix . 

                        ($conversion == 'i' ? $locale['int_curr_symbol'] : $locale['currency_symbol']) . 

                        $csuffix; 

        } else { 

            $currency = ''; 

        } 

        $space  = $locale["{$letter}_sep_by_space"] ? ' ' : ''; 

 

        $value = number_format($value, $right, $locale['mon_decimal_point'], 

                 $flags['nogroup'] ? '' : $locale['mon_thousands_sep']); 

        $value = @explode($locale['mon_decimal_point'], $value); 

 

        $n = strlen($prefix) + strlen($currency) + strlen($value[0]); 

        if ($left > 0 && $left > $n) { 

            $value[0] = str_repeat($flags['fillchar'], $left - $n) . $value[0]; 

        } 

        $value = implode($locale['mon_decimal_point'], $value); 

        if ($locale["{$letter}_cs_precedes"]) { 

            $value = $prefix . $currency . $space . $value . $suffix; 

        } else { 

            $value = $prefix . $value . $space . $currency . $suffix; 

        } 

        if ($width > 0) { 

            $value = str_pad($value, $width, $flags['fillchar'], $flags['isleft'] ? 

                     STR_PAD_RIGHT : STR_PAD_LEFT); 

        } 

 

        $format = str_replace($fmatch[0], $value, $format); 

    } 

    return $format; 

 

Finally, go to admin/build/modules on your website and enable the module "money_format".

You should now be able to use any modules that use the money_format function.

© 2010 Your Name.. Drupal theme by Kiwi Themes.