money_format

(PHP 4 >= 4.3.0, PHP 5)

money_format — Форматирует число как денежную величину

Описание

string money_format ( string $format , float $number )

money_format() форматирует число number как денежную величину. Эта функция вызывает функцию strfmon языка C, но позволяет преобразовать только одно число за один вызов.

Замечание: Функция money_format() определена только если в системе присутствует функция strfmon. Например, в Windows она отсутствует, поэтому money_format() не определена в Windows.

Описание формата состоит из:

  • символа %

  • необязательных флагов

  • необязательной ширины поля

  • необязательной точности до запятой

  • необязательной точности после запятой

  • обязательного описателя преобразования

Флаги

Могут быть использованы следующие флаги:

=f

Символ =, за которым следует еще один символ, задает символ заполнения. По умолчанию пробел.

^

Запрещает группировку символов (определяемую текущей локалью).

+ или (

Задает способ форматирования положительных и отрицательных значений. При использовании + будут использоваться аналоги символов + и - из текущей локали. Если указана (, отрицательные числа будут заключены в скобки. По умолчанию +.

!

Подавляет вывод символа валюты.

-

Если этот флаг задан, поля будут выравнены влево, вместо используемого по умолчанию выравнивания вправо.

Ширина поля

w

Строка из десятичных цифр, задающая минимальную ширину поля. Поле будет выравнено вправо, если не указан флаг -. Значение по умолчанию - 0 (ноль).

Точность до запятой

#n

Максимальное количество цифр (n), которое ожидается до запятой. Это обычно используется при выводе значений одно под другим, чтобы десятичные точки распологались в одной колонке, при этом используется символ заполнения, если число цифр меньше n. Если число цифр больше n, этот параметр игнорируется.

Если группировка не была запрещена флагом ^, разделители групп будут вставлены перед добавлением символов заполнения. Разделители групп не вставляются между символами заполнения, даже если заполнитель - цифра.

Для обеспечения выравнивания, все символы, выводимые до или после числа, такие как сивол валюты или знак, будут дополнены пробелами до одинаковой ширины.

Точность после запятой

.p

Точка, за которой следует число знаков, выводимых после запятой. Если значение p рано нулю, десятичная точка и цифры после нее не будут выводиться. Если этот параметр отсутствует, число знаков после запятой определяется текущей локалью. Перед форматированием число округляется до указанного количества знаков.

Описатель преобразования

i

Используется международный денежный формат из текущей локали (например, для американской локали: USD 1,234.56).

n

Используется национальный денежный формат из текущей локали (например, для локали de_DE: DM1.234,56).

%

Вставляет символ %.

Замечание: На работу этой функции влияет установка категории LC_MONETARY текущей локали. Перед использованием этой функции установите нужную локаль с помощью setlocale().
Символы перед и после описания формата возвращаются без изменений.

Пример #1 Пример использования money_format()

Проиллюстрируем применение этой функции для различных локалей и разных описаний формата.

<?php

$number 
1234.56;

// международный формат в локали en_US
setlocale(LC_MONETARY'en_US');
echo 
money_format('%i'$number) . "\n";  
// USD 1,234.56

// Итальянский национальный формат с 2 знаками после запятой
setlocale(LC_MONETARY'it_IT');
echo 
money_format('%.2n'$number) . "\n";
// L. 1.234,56

// Использование отрицательных чисел
$number = -1234.5672;

// национальный формат США, с использованием скобок для
// отрицательных чисел и 10 знаков до запятой
setlocale(LC_MONETARY'en_US');
echo 
money_format('%(#10n'$number) . "\n";
// ($        1,234.57)

// подобно предыдущему, но с  добавлением 2 знаков после запятой
// и '*' в качестве символа заполнения
echo money_format('%=*(#10.2n'$number) . "\n";
// ($********1,234.57)
    
// Выравнивание влево, ширина 14 знаков, 8 знаков дозапятой,
// 2 знака после запятой, без разбиения на группы
// с использованием  международного формата в локали de_DE.
setlocale(LC_MONETARY'de_DE');
echo 
money_format('%=*^-14#8.2i'1234.56) . "\n";
// DEM 1234,56****

// А теперь добавим текст перед и после описателя формата
setlocale(LC_MONETARY'en_GB');
$fmt 'The final value is %i (after a 10%% discount)';
echo 
money_format($fmt1234.56) . "\n";
// The final value is  GBP 1,234.56 (after a 10% discount)

?>

См. также описание функций setlocale(), number_format(),sprintf(), printf() и sscanf().

Коментарии

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.
2006-02-17 09:02:01
http://php5.kiev.ua/manual/ru/function.money-format.html
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.
2007-10-06 06:10:34
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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($numstrlen($num)-3strlen($num));
           
$restunits substr($num0strlen($num)-3); // extracts the last three digits
           
$restunits = (strlen($restunits)%== 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($restunits2);
            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.
2008-07-22 23:24:55
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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.
2008-09-30 13:41:27
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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_MONETARY0) == 'C') {
       
setlocale(LC_MONETARY'');
    }
   
$locale localeconv();
   
preg_match_all($regex$format$matchesPREG_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"] == && $flags['usesignal'] == '+':
               
$prefix $signal;
                break;
            case 
$locale["{$letter}_sign_posn"] == && $flags['usesignal'] == '+':
               
$suffix $signal;
                break;
            case 
$locale["{$letter}_sign_posn"] == && $flags['usesignal'] == '+':
               
$cprefix $signal;
                break;
            case 
$locale["{$letter}_sign_posn"] == && $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 && $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;
}

?>
2009-02-19 14:20:24
http://php5.kiev.ua/manual/ru/function.money-format.html
This function divides integer value by commas. F.e.

<?php
echo formatMoney(1050); # 1,050
echo formatMoney(1321435.4true); # 1,321,435.40
echo formatMoney(10059240.42941true); # 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;
}
?>
2010-07-07 12:43:42
http://php5.kiev.ua/manual/ru/function.money-format.html
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,
2011-09-28 04:04:29
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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
2012-08-17 19:58:58
http://php5.kiev.ua/manual/ru/function.money-format.html
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
2013-08-02 23:10:51
http://php5.kiev.ua/manual/ru/function.money-format.html
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(=> 3=> 3)
       
    );
?>
2014-01-09 05:27:47
http://php5.kiev.ua/manual/ru/function.money-format.html
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);
?>
2014-06-12 10:24:43
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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.
2015-02-20 00:21:59
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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;
    }
2016-06-30 15:43:59
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
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($sum2);

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

// 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);
}
2017-07-04 14:49:02
http://php5.kiev.ua/manual/ru/function.money-format.html
Be aware, since PHP 7.3 this method is deprecated and from PHP 7.4 this launch a deprecated error, so, setup your PHP web server to untrack E_DEPRECATED error reporting.
2020-07-28 19:25:38
http://php5.kiev.ua/manual/ru/function.money-format.html
Автор:
Rafael M. Salvioni's code has a small bug in it when the value is positive and the format provided contains a ( flag.  The value should only be surrounded in parenthesis when the value is negative.  This should fix it:

<?php
   
if (!function_exists('money_format'))
    {
        function 
money_format($format$number)
        {
           
$regex  '/%((?:[\^!\-]|\+|\(|\=.)*)([0-9]+)?'.
                   
'(?:#([0-9]+))?(?:\.([0-9]+))?([in%])/';
            if (
setlocale(LC_MONETARY0) == 'C') {
               
setlocale(LC_MONETARY'');
            }
           
$locale localeconv();
           
preg_match_all($regex$format$matchesPREG_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"] == && $flags['usesignal'] == '+':
                       
$prefix $signal;
                        break;
                    case 
$locale["{$letter}_sign_posn"] == && $flags['usesignal'] == '+':
                       
$suffix $signal;
                        break;
                    case 
$locale["{$letter}_sign_posn"] == && $flags['usesignal'] == '+':
                       
$cprefix $signal;
                        break;
                    case 
$locale["{$letter}_sign_posn"] == && $flags['usesignal'] == '+':
                       
$csuffix $signal;
                        break;
                    case 
$flags['usesignal'] == '(' && !$positive:
                    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 && $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;
        }   
    }
?>
2023-10-12 08:03:59
http://php5.kiev.ua/manual/ru/function.money-format.html

    Поддержать сайт на родительском проекте КГБ