PHP money_format for Windows

Problem:

I wanted to display money using the money_format.  It’s so simple to use, but it doesn’t work on Windows platform.

 

Solution:

The solution is really in the PHP manual comments.  Someone posted their solution to do money formatting manually.  I’ll repost here for convenience with an extra function check.  I also commented out a line so i don’t get a “USD” string in front of the number.

if ( ! function_exists( 'money_format' ) ) {
    /* 
    That it is an implementation of the function money_format for the 
    platforms that do not it bear.  

    The function accepts to same string of format accepts for the 
    original function of the PHP.  

    (Sorry. my writing in English is very bad)  

    The function is tested using PHP 5.1.4 in Windows XP 
    and Apache WebServer. 
    */ 
    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; 
    } 
}

search terms used: sprintf php money
Tagged with:

Leave a Reply

Your email address will not be published. Required fields are marked *

*