money_format

(PHP 4 >= 4.3.0, PHP 5)

money_formatBir sayıyı para olarak biçemler

Açıklama

string money_format ( string $biçem , float $sayı )

money_format() işlevi belirtilen sayı'nın para olarak biçemlenmiş sürümünü döndürür. Bu gerçeklenimin bir defada sadece bir sayıyı dönüştürmesi dışında C kütüphanesinin strfmon() işlevinin yaptığını yapar.

Değiştirgeler

biçem

Biçem belirtimleri şu dizilimlerden oluşur:

  • % karakteri

  • seçimlik seçenekler

  • seçimlik alan genişlikleri

  • seçimlik sol taraf hassasiyeti

  • seçimlik sağ taraf hassasiyeti

  • gerekli bir dönüşüm karakteri

Seçenekler

Aşağıdaki seçeneklerden bir veya daha fazlası kullanılabilir:

=f

= iminden sonra gelen bir tek baytlık karakter sayısal dolgu karakteri olarak kullanılır. Boşluk, öntanımlı dolgu karakteridir.

^

Geçerli yerelde tanımlı binlik ayracını iptal eder.

+ veya (

Pozitif ve negatif sayılar için biçemleme tarzını belirler. + kullanılmışsa + ve - için yereldeki eşdeğeri kullanılır. ( kullanılmışsa negatif miktarlar yaylı ayraç içine alınır. Hiçbir şey belirtilmemişse + öntanımlıdır.

!

Çıktı dizgesinde para biriminin bulunmamasını sağlar.

-

Belirtilmesi halinde bütün alanlar sola yanaştırılır (sağ tarafa dolgu yapılır). Belirtilmemesi halinde (öntanımlı durum) alanlar sağa yanaştırılır (sol tarafa dolgu yapılır).

Alan genişliği

w

En küçük alan genişliğini belirten onluk bir rakam. - seçeneği belirtilmedikçe alan sağa yanaştırılır. Öntanımlı değer sıfırdır (0).

Sol taraf hassasiyeti

#n

Ondalık ayracın sol tarafındaki hanelerin azami sayısı (n). Normalde sayıları aynı sütun genişliğinde alt alta dizerken belirtilenden daha az genişliğe sahip sayılarda dolgu yapılması için kullanılır. Burada belirtilenden daha geniş sayılara bu belirtim uygulanmaz.

^ seçeneği ile binlik gruplama engellenmemişse eklenen (varsa) dolgu karakterlerinin öncesine binlik ayracı yerleştirilir. Binlik ayracı dolgu karakterlerine, 0 bile olsalar uygulanmaz.

Hizalamak amacıyla pozitif ve negatif biçemlerin genişliklerini eşitlemek için gerekirse, biçemli çıktıdaki sayıdan önceki veya sonraki herhangi bir karaktere kadar (para birimi veya işaret simgesi) boşluk karakteri doldurulur.

Sağ taraf hassasiyeti

.p

Ondalık ayracın sağındaki hane sayısı (p). Eğer p 0 (sıfır) ise, ondalık ayraç ve sağındaki rakamlar yoksayılır. Sağ taraf hassasiyeti olarak hiçbir şey belirtilmemişse geçerli yereldeki kullanılır. Belirtilen genişlikten daha fazla sayıda hane varsa bu haneler biçemleme öncesi yuvarlatılır.

Dönüşüm karakterleri

i

Sayı yerelin uluslararası para birimine göre biçemlenir (örn, en_US yereli için: USD 1,234.56).

n

Sayı yerelin ulusal para birimine göre biçemlenir (örn, de_DE yereli için: DM1.234,56).

%

% karakteri döner.

sayı

Biçemlenecek sayı.

Dönen Değerler

Biçemlenmiş dizge döner. Biçemlenen sayının önündeki veya ardındaki karakterler değişmeden döner. sayı bir sayısal değer değilse işlev NULL döndürür ve bir E_WARNING çıktılar.

Notlar

Bilginize:

money_format() işlevi sadece sistem strfmon yeteneklerine sahipse tanımlıdır. Örneğin Windows'ta money_format() kullanılamaz.

Bilginize:

Yerelin LC_MONETARY sınıfı bu işlevin davranışını etkiler. Bu bakımdan bu işlevi kullanmadan önce uygun bir yereli öntanımlı yerel yapmak için setlocale() işlevini kullanın.

Örnekler

Örnek 1 - money_format() örneği

Bu işlevin neler yapabileceğini göstermek için farklı yereller kullanacağız.

<?php

$number 
1234.56;

// Amerikan yereli için uluslararası biçemi kullanalım
setlocale(LC_MONETARY'en_US');
echo 
money_format('%i'$number) . "\n";
// USD 1,234.56

// 2 ondalık haneli İtalyan ulusal biçemi
setlocale(LC_MONETARY'it_IT');
echo 
money_format('%.2n'$number) . "\n";
// L. 1.234,56

// Negatif sayı kullanımı
$number = -1234.5672;

// Negatif sayılar için () ve sol tarafı 10 hanelik
// Amerikan ulusal biçemi
setlocale(LC_MONETARY'en_US');
echo 
money_format('%(#10n'$number) . "\n";
// ($        1,234.57)

// Yukarıdaki biçeme ek olarak sağ taraf için 2 hane
// ve dolgu karakteri olarak '*' kullanımı;
echo money_format('%=*(#10.2n'$number) . "\n";
// ($********1,234.57)

// Sola hizalı, 14 hane genişlikte, sol taraf hassasiyeti olarak 8,
// sağ taraf hassasiyeti olarak 2 hanelik, binlik ayracı kullanmaksızın
// Alman yereli için uluslararası biçemi kullanarak sayıyı biçemleyelim
setlocale(LC_MONETARY'de_DE');
echo 
money_format('%=*^-14#8.2i'1234.56) . "\n";
// DEM 1234,56****

// Dönüşüm belirtiminin önüne ve ardına bir şeyler ekleyelim
setlocale(LC_MONETARY'en_GB');
$fmt 'Son fiyat %i olur (%%10 indirim sonrası)';
echo 
money_format($fmt1234.56) . "\n";
// Son fiyat GBP 1,234.56 olur (%10 indirim sonrası)

?>

Ayrıca Bakınız

add a note add a note

User Contributed Notes 11 notes

up
6
todoventas at xarxa-cat dot net
11 months 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
5
jsb17NO at SPAMcornell dot edu
1 year 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
10
Rafael M. Salvioni
5 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
8
jeremy
6 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
6
richard dot selby at uk dot clara dot net
8 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
5
andrey.dobrozhanskiy [-a-t-] gmail com
4 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
4
phpdeveloperbalaji at gmail dot com
3 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
1
~B
2 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
1
swapnet
6 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
scot from ezyauctionz.co.nz
7 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.
up
-1
kaigillmann at googlemail dot com
6 months 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);
?>
To Top