Alternative to money_format() function
Solution 1
If you have the Intl extension, you can use
- NumberFormatter::formatCurrency — Format a currency value according to the formatter rules.
Example from Manual
$fmt = new NumberFormatter( 'de_DE', NumberFormatter::CURRENCY );
echo $fmt->formatCurrency(1234567.891234567890000, "EUR")."\n";
echo $fmt->formatCurrency(1234567.891234567890000, "RUR")."\n";
$fmt = new NumberFormatter( 'ru_RU', NumberFormatter::CURRENCY );
echo $fmt->formatCurrency(1234567.891234567890000, "EUR")."\n";
echo $fmt->formatCurrency(1234567.891234567890000, "RUR")."\n";
Output
1.234.567,89 €
1.234.567,89 RUR
1 234 567,89€
1 234 567,89р.
Also see my answer on how to parse that formatted money string back into a float:
Solution 2
Keep it simple!
sprintf('%01.2f', $val);
Solution 3
<?php
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 = $i.length) > 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(9856478521456.256);
?>
try this the out put of above code is "$9,856,478,521,456.26"
Solution 4
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')) { //... }
Solution 5
I always just used this to manually add the dollar sign:
// for $k = 53.234234978
$k = "$ " . number_format($k, 2);
// output = $ 53.23
Comments
-
Pramod Kumar Sharma over 1 year
I am trying to use the
money_format()
function in PHP, but it gives the following error:Fatal error: Call to undefined function money_format()
Searches about this error reveal that the function
money_format()
is only defined if the system hasstrfmon
capabilities (for example, Windows does not) and also that the function has been removed from PHP 8.0.Is there an equivalent PHP function available?
-
Michael J.V. almost 13 yearsNo, you can't, manual explicitly says so - so does googling.
-
-
Sisir over 10 yearsI wonder what
$c
and$d
does. They never used in the function? -
Charity Leschinski over 10 yearsThis is a good suggestion, but what if you want the
-
sign in front of the$
for negative dollar amounts? What if you want()
instead of-
? -
danielson317 almost 9 yearsFor US Dollors
$fmt = new NumberFormatter( 'en_US', NumberFormatter::CURRENCY ); echo $fmt->formatCurrency($float, 'USD');
-
jazcam over 8 years@CharityAbbott,
$val = "-".sprintf('%01.2f;, $val);
or$val = "(".sprintf('%01.2f;, $val).")";
-
enhzflep about 8 yearsGreat stuff for those without both
money_format
and theNumberFormatter
class. Your solution prints -70927.43 as $-70,927.43 whereas the format -$70,927.43 is more common at least in this neck of the woods. By swapping$symbol
and$sign
in the return statement, I achieved what I was interested in. -
enhzflep about 8 yearsFurther to my above comment, your code fails for numbers less than 10,000. The value 8994.68 is printed as $8994.68. The fix appears to be $j % 2 (rather than % 3) in the following:
$j = (($j = strlen($i)) > 3) ? $j % 2 : 0;
:) Again, thanks.. -
Chris Baker over 7 yearsDon't use such obscure variable names. It makes your code into unreadable junk.
-
Ryan almost 6 yearsThis doesn't handle negatives in the way most people would want.
-
Alex Angelico about 5 yearsI cant make the auto_prepend to work, but the function does, thanks!
-
Dimitar almost 4 yearsYou can see all formats from Wikipedia. bg.wikipedia.org/wiki/ISO_4217
-
Brayan Jaimes over 2 yearsBest answer for Windows
-
Jamon Holmgren about 2 yearsI'd recommend using this; just drop it into a file, wrap it in the
if (!function_exists("money_format")) { ....
line, and include it before anything that might use it.