PHP 7.2.7 Released

money_format

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

money_formatFormatiert eine Zahl als Währungs-Zeichenkette

Beschreibung

string money_format ( string $format , float $number )

money_format() gibt eine formatierte Version von number zurück. Diese Funktion nutzt die C Funktion strfmon(), mit dem Unterschied, dass diese Implementierung jeweils nur eine Zahl auf einmal konvertiert.

Parameter-Liste

format

Die Formatangabe besteht aus folgender Sequenz:

  • ein % Zeichen

  • optionales Flag

  • optionale Feldbreite

  • optionale Links-Genauigkeit

  • optionale Rechts-Genauigkeit

  • ein erforderliches Umwandlungszeichen

Flags

Eines oder mehrere der folgenden optionalen Flags können benutzt werden:

=f

Das Zeichen = , gefolgt von einem (single byte) Zeichen f wird als numerisches Füllzeichen benutzt. Das Standard-Füllzeichen ist das Leerzeichen.

^

Deaktiviert die Verwendung von Gruppierungszeichen (wie in der aktuellen locale-Einstellung definiert).

+ or (

Gibt den Formatierungsstil für positive und negative Zahlen an. Wird + benutzt, wird das locale Äquivalent für + und - benutzt. Wird ( benutzt, werden negative Beträge von Klammern umschlossen. Ist kein Formatierungsstil angegeben, wird der Standardwert + benutzt.

!

Unterdrückt das Währungssymbol aus dem Ausgabestring.

-

Falls vorhanden, werden alle Felder linksbündig angeordnet, im Gegensatz zum Standardverhalten, welches die Felder rechtsbündig anordnet.

Feldbreite

w

Eine aus dezimalen Ziffern bestehende Zeichenkette, die die Mindestfeldbreite angibt. Das Feld wird rechtbündig ausgerichtet, es sei denn, das Flag - wird verwendet. Der Standardwert ist 0 (Null).

Links-Genauigkeit

#n

Die Höchstanzahl von Ziffern (n), die links vom Dezimaltrenner (z.B. dem Dezimalkomma) erwartet werden. Dies wird üblicherweise verwendet, um die formatierten Ausgabe an derselben Spalte auszurichten, wobei das Füllzeichen verwendet wird, wenn die Ziffernanzahl kleiner ist als n. Ist die Anzahl der tatsächlichen Ziffern größer als n, dann wird diese Angabe ignoriert.

Wurde die Gruppierung durch Verwendung des ^ Flags nicht unterdrückt, werden die Gruppentrennzeichen eingefügt, bevor die Füllzeichen (falls es welche gibt) ergänzt werden. Gruppentrenner werden nicht auf die Füllzeichen angewandt, auch wenn das Füllzeichen eine Ziffer sein sollte.

Um die Ausrichtung zu gewährleisten, werden jegliche Zeichen vor oder nach der Zahl in der formatierten Ausgabe, wie etwa Währungs- oder Vorzeichen, mit Leerzeichen aufgefüllt, so dass die positiven und negativen Formate die gleiche Länge haben.

Rechts-Genauigkeit

.p

Ein Punkt, gefolgt von der Ziffernanzahl (p) nach dem Dezimaltrenner. Ist der Wert von p gleich 0 (Null), wird der Dezimaltrenner und die Ziffern rechts davon ausgelassen. Ist keine Rechts-Genauigkeit angegeben, wird der Standardwert durch das aktuelle Locale bestimmt. Der zu formatierende Betrag wird vor der Formatierung auf die angegebene Ziffernanzahl gerundet.

Umwandlungszeichen

i

Die Zahl wird gemäß des internationalen Währungsformats des Locale formatiert (z.B. für das USA Locale: USD 1,234.56).

n

Die Zahl wird gemäß des nationalen Währungsformats des Locale formatiert (z.B. für das de_DE Locale: EU1.234,56).

%

Gibt das %-Zeichen zurück.

number

Die zu formatierende Zahl.

Rückgabewerte

Gibt die formatierte Zeichenkette zurück. Zeichen vor und nach der Formatzeichenkette werden unverändert zurückgegeben. Eine nicht-numerische number führt zur Rückgabe von NULL, und dem Erzeugen eines E_WARNING.

Anmerkungen

Hinweis:

Die Funktion money_format() ist nur definiert, wenn das System strfmon unterstützt. Beispielsweise ist dies unter Windows nicht so, so dass money_format() unter Windows nicht definiert ist.

Hinweis:

Die Kategorie LC_MONETARY der Locale-Einstellungen hat Einfluss auf das Verhalten dieser Funktion. setlocal() ist zu verwenden, um das gewünschte Locale einzustellen bevor diese Funktion verwendet wird.

Beispiele

Beispiel #1 money_format() Beispiel

Wir verwenden unterschiedliche Locales und Formatangaben, um die Verwendung dieser Funktion zu verdeutlichen.

<?php

$number 
1234.56;

// wir geben das internationale Format für das  en_US Locale aus
setlocale(LC_MONETARY'en_US');
echo 
money_format('%i'$number) . "\n";
// USD 1,234.56

// das italienische nationale Format mit 2 Dezimalstellen
setlocale(LC_MONETARY'it_IT');
echo 
money_format('%.2n'$number) . "\n";
// Eu 1.234,56

// Verwendung einer negativen Zahl
$number = -1234.5672;

// das national US Format, unter Verwendung von () für negative Zahlen
// und 10 Ziffern für die Links-Genauigkeit
setlocale(LC_MONETARY'en_US');
echo 
money_format('%(#10n'$number) . "\n";
// ($        1,234.57)

// ein ähnliches Format wie zuvor, aber mit zusätzlich 2 Ziffern
// Rechts-Genauigkeit und '*' al Füllzeichen
echo money_format('%=*(#10.2n'$number) . "\n";
// ($********1,234.57)

// wir richten linksbündig aus, mit 14 Zeichen Breite, 8 Ziffern
// Links-Genauigkeit, 2 Rechts-Genauigkeit, ohne Gruppentrenner
// und unter Verwendung des internationalen Formats für das de_DE Locale.
setlocale(LC_MONETARY'de_DE');
echo 
money_format('%=*^-14#8.2i'1234.56) . "\n";
// Eu 1234,56****

// wir ergänzen etwas Text vor und nach der Formatangabe
setlocale(LC_MONETARY'en_GB');
$fmt 'Der Endwert ist %i (mit 10%% Nachlass)';
echo 
money_format($fmt1234.56) . "\n";
// Der Endwert ist  GBP 1,234.56 (mit 10% Nachlass)

?>

Siehe auch

  • setlocale() - Legt regionale (locale) Einstellungen fest
  • sscanf() - Überträgt einen String in ein angegebenes Format
  • sprintf() - Gibt einen formatierten String zurück
  • printf() - Gibt einen formatierten String aus
  • number_format() - Formatiert eine Zahl mit Tausender-Trennzeichen

add a note add a note

User Contributed Notes 15 notes

up
34
tim
3 years ago
For most of us in the US, we don't want to see a "USD" for our currency symbol, so '%i' doesn't cut it.  Here's what I used that worked to get what most  people expect to see for a number format.

$number = 123.4
setlocale(LC_MONETARY, 'en_US.UTF-8');
money_format('%.2n', $number);

output:
$123.40

That gives me a dollar sign at the beginning, and 2 digits at the end.
up
34
Rafael M. Salvioni
9 years ago
This is a some function posted before, however various bugs were corrected.

Thank you to Stuart Roe by reporting the bug on printing signals.

<?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;
}

?>
up
16
todoventas at xarxa-cat dot net
4 years ago
In Rafael M. Salvioni function localeconv(); returns an invalid array in my Windows XP SP3 running PHP 5.4.13 so to prevent the Warning Message: implode(): Invalid arguments passed i just add the $locale manually. For other languages just fill the array with the correct settings.

<?

       $locale
= array(
       
'decimal_point'        => '.',
       
'thousands_sep'        => '',
       
'int_curr_symbol'    => 'EUR',
       
'currency_symbol'    => '€',
       
'mon_decimal_point'    => ',',
       
'mon_thousands_sep'    => '.',
       
'positive_sign'        => '',
       
'negative_sign'     => '-',
       
'int_frac_digits'    => 2,
       
'frac_digits'        => 2,
       
'p_cs_precedes'        => 0,
       
'p_sep_by_space'    => 1,
       
'p_sign_posn'        => 1,
       
'n_sign_posn'        => 1,
       
'grouping'            => array(),
       
'mon_grouping'        => array(0 => 3, 1 => 3)
       
    );
?>
up
12
jsb17NO at SPAMcornell dot edu
4 years ago
To drop zero value decimals, use the following:
<?php
   
/*
        Same as php number_format(), but if ends in .0, .00, .000, etc... , drops the decimals altogether
        Returns string type, rounded number - same as php number_format()):
        Examples:
            number_format_drop_zero_decimals(54.378, 2) ==> '54.38'
            number_format_drop_zero_decimals(54.00, 2) ==> '54'
     */
   
function number_format_drop_zero_decimals($n, $n_decimals)
    {
        return ((
floor($n) == round($n, $n_decimals)) ? number_format($n) : number_format($n, $n_decimals));
    }
?>
Results:
number_format_drop_zero_decimals(54.377, 2) ==> 54.38
number_format_drop_zero_decimals('54.377', 2) ==> 54.38
number_format_drop_zero_decimals(54.377, 3) ==> 54.377
number_format_drop_zero_decimals(54.007, 2) ==> 54.01
number_format_drop_zero_decimals(54.000, 2) ==> 54
number_format_drop_zero_decimals(54.00, 2) ==> 54
number_format_drop_zero_decimals(54.0, 2) ==> 54
number_format_drop_zero_decimals(54.1, 2) ==> 54.10
number_format_drop_zero_decimals(54., 2) ==> 54
number_format_drop_zero_decimals(54, 2) ==> 54
number_format_drop_zero_decimals(54, 3) ==> 54
number_format_drop_zero_decimals(54 + .13, 2) ==> 54.13
number_format_drop_zero_decimals(54 + .00, 2) ==> 54
number_format_drop_zero_decimals(54.0007, 4) ==> 54.0007
number_format_drop_zero_decimals(54.0007, 3) ==> 54.001
number_format_drop_zero_decimals(54.00007, 3) ==> 54  //  take notice
up
16
jeremy
9 years ago
If money_format doesn't seem to be working properly, make sure you are defining a valid locale.  For example, on Debian, 'en_US' is not a valid locale - you need 'en_US.UTF-8' or 'en_US.ISO-8559-1'.

This was frustrating me for a while.  Debian has a list of valid locales at /usr/share/i18n/SUPPORTED; find yours there if it's not working properly.
up
2
Felix Duterloo
1 year ago
Improvement to Rafael M. Salvioni's solution for money_format on Windows: when no currency symbol is selected, in the formatting, the minus sign was also lost when the locale puts it in position 3 or 4. Changed $currency = '';  to: $currency = $cprefix .$csuffix;

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 = $cprefix .$csuffix;
            }
            $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;
    }
up
8
~B
5 years ago
We found that after switching from Ubuntu 10.04 php -v 5.3.2, to Ubuntu 12.04 php -v 5.3.10 this no longer worked:

<?php setlocale(LC_MONETARY, 'en_US'); ?>

Found that using:

<?php setlocale(LC_MONETARY, 'en_US.UTF-8'); ?>

worked find
up
5
richard dot selby at uk dot clara dot net
12 years ago
Double check that money_format() is defined on any version of PHP you plan your code to run on.  You might be surprised.

For example, it worked on my Linux box where I code, but not on  servers running  BSD 4.11 variants. (This is presumably because strfmon  is not defined - see note at the top of teis page). It's not just a windows/unix issue.
up
3
kaigillmann at googlemail dot com
4 years ago
If you get "EUR" instead of the euro symbol, set the locale to utf8 charset like this:

<?php
setlocale
(LC_MONETARY, 'de_DE.utf8');
echo
money_format('%+n', 1234.56);
?>
up
5
andrey.dobrozhanskiy [-a-t-] gmail com
7 years ago
This function divides integer value by commas. F.e.

<?php
echo formatMoney(1050); # 1,050
echo formatMoney(1321435.4, true); # 1,321,435.40
echo formatMoney(10059240.42941, true); # 10,059,240.43
echo formatMoney(13245); # 13,245

function formatMoney($number, $fractional=false) {
    if (
$fractional) {
       
$number = sprintf('%.2f', $number);
    }
    while (
true) {
       
$replaced = preg_replace('/(-?\d+)(\d\d\d)/', '$1,$2', $number);
        if (
$replaced != $number) {
           
$number = $replaced;
        } else {
            break;
        }
    }
    return
$number;
}
?>
up
2
swapnet
9 years ago
Consider formatting currency for some South Asian countries that use ##,##,###.## money format.
The following code generates something like Rs. 4,54,234.00 and so on.

<?php
function convertcash($num, $currency){
    if(
strlen($num)>3){
           
$lastthree = substr($num, strlen($num)-3, strlen($num));
           
$restunits = substr($num, 0, strlen($num)-3); // extracts the last three digits
           
$restunits = (strlen($restunits)%2 == 1)?"0".$restunits:$restunits; // explodes the remaining digits in 2's formats, adds a zero in the beginning to maintain the 2's grouping.

           
$expunit = str_split($restunits, 2);
            for(
$i=0; $i<sizeof($expunit); $i++){
               
$explrestunits .= (int)$expunit[$i].","; // creates each of the 2's group and adds a comma to the end
           
}   

           
$thecash = $explrestunits.$lastthree;
    } else {
          
$thecash = $convertnum;
    }
   
    return
$currency.$thecash.".00"; // writes the final format where $currency is the currency symbol.
}
?>

now call the function as  convertcash($row['price'], 'Rs '); // that's the price from the database I called using an Indian Rupees prefix where the price has to be a plain number format, say something like 454234.
up
1
phpdeveloperbalaji at gmail dot com
6 years ago
Hi,

For South Asian Currencies, this function could be a handy one.

It will handle negative as well as float(Paise).

<?php
function my_money_format($number)
{
    if(
strstr($number,"-"))
    {
       
$number = str_replace("-","",$number);
       
$negative = "-";
    }
   
   
$split_number = @explode(".",$number);
   
   
$rupee = $split_number[0];
   
$paise = @$split_number[1];
   
    if(@
strlen($rupee)>3)
    {
       
$hundreds = substr($rupee,strlen($rupee)-3);
       
$thousands_in_reverse = strrev(substr($rupee,0,strlen($rupee)-3));
        for(
$i=0; $i<(strlen($thousands_in_reverse)); $i=$i+2)
        {
           
$thousands .= $thousands_in_reverse[$i].$thousands_in_reverse[$i+1].",";
        }
       
$thousands = strrev(trim($thousands,","));
       
$formatted_rupee = $thousands.",".$hundreds;
       
    }
    else
    {
       
$formatted_rupee = $rupee;
    }
   
    if((int)
$paise>0)
    {
       
$formatted_paise = ".".substr($paise,0,2);
    }
   
    return
$negative.$formatted_rupee.$formatted_paise;

}
?>

Thanks,
up
0
justsomeone
11 months ago
Using the money_format function with float values which have more than two decimal digits can result in rounding errors.
Maybe this function will help you to avoid these failures:

<?php
// A product with a base price of 12.95
$price = 1295;

// The quantity is also an integer but translated it would be 11.91
$quantity = 1191;

// Result: 154.2345
// It's the same like 12.95 * 11.91
$sum = ($price / 100) * ($quantity  /100);

// Wrong result: 154.23
money_format('%!i', $sum);

// Wrong result: 154.23
number_format($sum, 2);

// Wrong result: 154.23
bcmul($price / 100, $quantity / 100, 2);

// Correct result : 154.24
money_format_rounded('%!i', $sum);

/**
* Formats a number as a currency string. Rounds every decimal digit to a defined precision on its own.
*
* @param string $format The format for the money_format function
* @param float|int|string $number The number to be formatted
* @param int $maxPrecision Round up to the $maxPrecision number of decimal digit. Default is: 2
* @param int $roundingType Rounding type for the round function. Default is: \PHP_ROUND_HALF_UP
*
* @return string
*/
function money_format_rounded($format, $number, $maxPrecision = 2, $roundingType = \PHP_ROUND_HALF_UP)
{
   
$strlen = strlen($number);
    if (
$strlen === 0) {
        return
money_format($format, $number);
    }

   
$length = $strlen - strrpos($number, '.') - 1;
    if (
$length <= 0) {
        return
money_format($format, $number);
    }

   
$rounded = $number;
    for (
$i = --$length; $i >= $maxPrecision; $i--) {
       
$rounded = round($rounded, $i, $roundingType);
    }

    return
money_format($format, $rounded);
}
up
0
jonah at jonah dot name
1 year ago
Be careful when using money_format with rounding.  It uses floating-point numbers to round, so the precision is not perfect.  Specifically, rounding over 63.5 may be incorrectly rounded down.  See the bug report here:

https://bugs.php.net/bug.php?id=61787

Bearing this in mind, I'd recommend using http://php.net/round on your number first.

$number = 64.005;
echo money_format('%.2n', $number); // $65.00 (incorrect behavior for PHP_ROUND_HALF_UP)

$number2 = round($number, 2);
echo money_format('%.2n', $number2); // $65.01 (correct)
up
-1
scot from ezyauctionz.co.nz
10 years ago
This is a handy little bit of code I just wrote, as I was not able to find anything else suitable for my situation.
This will handle monetary values that are passed to the script by a user, to reformat any comma use so that it is not broken when it passes through an input validation system that checks for a float.

It is not foolproof, but will handle the common input as most users would input it, such as 1,234,567 (outputs 1234567) or 1,234.00 (outputs 1234.00), even handles 12,34 (outputs 12.34), I expect it would work with negative numbers, but have not tested it, as it is not used for that in my situation.

This worked when other options such as money_format() were not suitable or possible.

<?php
///////////////
// BEGIN CODE convert all price amounts into well formatted values
function converttonum($convertnum,$fieldinput){
       
$bits = explode(",",$convertnum); // split input value up to allow checking
       
       
$first = strlen($bits[0]); // gets part before first comma (thousands/millions)
       
$last = strlen($bits[1]); // gets part after first comma (thousands (or decimals if incorrectly used by user)
       
       
if ($last <3){ // checks for comma being used as decimal place
           
$convertnum = str_replace(",",".",$convertnum);
        }
        else{
// assume comma is a thousands seperator, so remove it
           
$convertnum = str_replace(",","",$convertnum);
        }
       
       
$_POST[$fieldinput] = $convertnum; // redefine the vlaue of the variable, to be the new corrected one
}

@
converttonum($_POST[inputone],"inputone");
@
converttonum($_POST[inputtwo],"inputtwo");
@
converttonum($_POST[inputthree],"inputthree");
// END CODE
//////////////

?>

This is suitable for the English usage, it may need tweaking to work with other types.
To Top