Created
February 15, 2024 08:25
-
-
Save woody180/6ba9c97253be16941218a11ad0834e9c to your computer and use it in GitHub Desktop.
money_format function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment