• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar

My Monkey Do

A Log of Coding Solutions

  • Home
  • Web Hosts
  • Tools
  • About

PHP money_format for Windows

October 19, 2011 by Webhead

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

Filed Under: Coding Tagged With: php

Primary Sidebar

Topics

apache apple block editor chrome cms css debug eCommerce embed firebug firefox git gmail goDaddy google hosting htaccess html html 5 IE crap image iPad iPhone javascript jquery linux localization mac os x ms sql mysql open source optimize php php 5.3 responsive rest api seo svg tinymce woocommerce wordpress wpengine xss yii youtube




Categories

  • Coding
  • Off the Shelf
  • Plugins
  • Random Thoughts
  • Server Stuff
  • Tools