PHP 8.3.4 Released!

number_format

(PHP 4, PHP 5, PHP 7, PHP 8)

number_format数字を千の位毎にグループ化してフォーマットする

説明

number_format(
    float $num,
    int $decimals = 0,
    ?string $decimal_separator = ".",
    ?string $thousands_separator = ","
): string

数値を千の位毎にグループ化し、オプションで小数の桁も追加してフォーマットします。小数の桁を追加する場合、四捨五入のルールを使います。

パラメータ

num

フォーマットする数値。

decimals

小数点以下の桁数。 0 を指定すると、 戻り値の decimal_separator は省略されます。

decimal_separator

小数点を表す区切り文字。

thousands_separator

千の位毎の区切り文字。

戻り値

num をフォーマットした結果を返します。

変更履歴

バージョン 説明
8.0.0 これより前のバージョンでは、 number_format() 関数は 引数を1個、2個、または4個受け入れていました(つまり、3個はダメでした)。
7.2.0 number_format() は、 -0 を返さないように変更されました。 これより前のバージョンでは、 num-0.01 のようなケースで -0 が返される場合がありました。

例1 number_format() の例

例えばフランスの表記法では、通常カンマ (',') を小数の区切りとした二桁の小数と、千位毎の区切りとしてスペース (' ') を用います。数値を書式設定するさまざまな方法を次の例で示します。

<?php

$number
= 1234.56;

// 英語での表記 (デフォルト)
$english_format_number = number_format($number);
// 1,235

// フランスの表記
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// 千位毎の区切りがない英語での表記
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>

参考

  • money_format() - 数値を金額文字列にフォーマットする
  • sprintf() - フォーマットされた文字列を返す
  • printf() - フォーマット済みの文字列を出力する
  • sscanf() - フォーマット文字列に基づき入力を処理する

add a note

User Contributed Notes 10 notes

up
417
thomas at weblizards dot de
15 years ago
It's not explicitly documented; number_format also rounds:

<?php
$numbers
= array(0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009);
foreach (
$numbers as $number)
print
$number."->".number_format($number, 2, '.', ',')."<br>";
?>

0.001->0.00
0.002->0.00
0.003->0.00
0.004->0.00
0.005->0.01
0.006->0.01
0.007->0.01
0.008->0.01
0.009->0.01
up
10
Jeroen de Bruijn [NL]
18 years ago
If you want to display a number ending with ,- (like 200,-) when there are no decimal characters and display the decimals when there are decimal characters i use:

function DisplayDouble($value)
{
list($whole, $decimals) = split ('[.,]', $value, 2);
if (intval($decimals) > 0)
return number_format($value,2,".",",");
else
return number_format($value,0,".",",") .",-";
}
up
10
info at ensostudio dot ru
2 years ago
Note: use NumberFormatter to convert in human-readable format instead user function from comments:
<?php
echo NumberFormatter::create('en', NumberFormatter::SPELLOUT)->format(12309); // twelve thousand three hundred nine
echo NumberFormatter::create('ru', NumberFormatter::SPELLOUT)->format(12307.5); // двенадцать тысяч триста семь целых пять десятых
?>
up
36
james at bandit dot co.nz
14 years ago
Outputs a human readable number.

<?php
# Output easy-to-read numbers
# by james at bandit.co.nz
function bd_nice_number($n) {
// first strip any formatting;
$n = (0+str_replace(",","",$n));

// is this a number?
if(!is_numeric($n)) return false;

// now filter it;
if($n>1000000000000) return round(($n/1000000000000),1).' trillion';
else if(
$n>1000000000) return round(($n/1000000000),1).' billion';
else if(
$n>1000000) return round(($n/1000000),1).' million';
else if(
$n>1000) return round(($n/1000),1).' thousand';

return
number_format($n);
}
?>

Outputs:

247,704,360 -> 247.7 million
866,965,260,000 -> 867 billion
up
21
MarcM
18 years ago
For Zero fill - just use the sprintf() function

$pr_id = 1;
$pr_id = sprintf("%03d", $pr_id);
echo $pr_id;

//outputs 001
-----------------

$pr_id = 10;
$pr_id = sprintf("%03d", $pr_id);
echo $pr_id;

//outputs 010
-----------------

You can change %03d to %04d, etc.
up
7
Theo Diem
20 years ago
formatting numbers may be more easy if u use number_format function.

I also wrote this :
function something($number)
{
$locale = localeconv();
return number_format($number,
$locale['frac_digits'],
$locale['decimal_point'],
$locale['thousands_sep']);
}

hope this helps =)
[]'s
up
16
stm555 at hotmail dot com
18 years ago
I ran across an issue where I wanted to keep the entered precision of a real value, without arbitrarily rounding off what the user had submitted.

I figured it out with a quick explode on the number before formatting. I could then format either side of the decimal.

<?php
function number_format_unlimited_precision($number,$decimal = '.')
{
$broken_number = explode($decimal,$number);
return
number_format($broken_number[0]).$decimal.$broken_number[1];
}
?>
up
-1
liviu andrei (bls)
12 years ago
To prevent the rounding that occurs when next digit after last significant decimal is 5 (mentioned by several people below):

<?php
function fnumber_format($number, $decimals='', $sep1='', $sep2='') {

if ((
$number * pow(10 , $decimals + 1) % 10 ) == 5) //if next not significant digit is 5
$number -= pow(10 , -($decimals+1));

return
number_format($number, $decimals, $sep1, $sep2);

}

$t=7.15;
echo
$t . " | " . number_format($t, 1, '.', ',') . " | " . fnumber_format($t, 1, '.', ',') . "\n\n";
//result is: 7.15 | 7.2 | 7.1

$t=7.3215;
echo
$t . " | " . number_format($t, 3, '.', ',') . " | " . fnumber_format($t, 3, '.', ',') . "\n\n";
//result is: 7.3215 | 7.322 | 7.321
} ?>

have fun!
up
-1
Mad Max
4 months ago
India (~18% of the world's population), Pakistan (~3%), Bangladesh (~2%), Nepal, and Myanmar, have a different way to display large numbers:

10,23,45,678.20

The first thousand is "normal" but then there is a comma every TWO digits after that.

Now look at the number_format() function. Do you see a way to control the placement and frequency of the commas? Or a mode option/switch to deal with displaying numbers for almost 1/4 of the total population on Earth? Neither do I.

If you are developing an application for an international audience, the ICU-based Intl PHP extension might work fine for you. However, IBM's ICU library is a resource heavy library (because...IBM), isn't the fastest library on the planet (also normal for IBM), ICU formatters are somewhat unreliable/inconsistent (yup, still IBM), and the Intl extension isn't always available in PHP (this one's PHP). So there are many significant hurdles to overcome just to prepare a number for display using the Intl extension.

In short, approximately 23% of the planet currently can't use this function for displaying large numbers and there isn't a good built-in *lightweight* alternative other than to roll your own solution that outright replaces this function. Formatting a number for display is an extremely common task.

Disclaimer: This comment serves as a warning to others that this function isn't suitable for an international audience in its current state. This comment is not a question, bug report, or feature request. I'm simply commenting on the current state of affairs with this function. If someone opts to make changes/improvements, then great, but that's not the purpose here.
up
-1
support at piri dot sk
11 months ago
My simpler solution to the problem of the decimal number in this function being longer than the specified number of decimals.

Standard result for number_format() is..
number_format(5.00098, 2) = 5.00

My function will return the result = 5.001

<?php

// ** Warning: Does not work with scientific notation. Conversion to a real number is required. **

echo auto_decimal_format(5.0005620); // print 5.0006
echo auto_decimal_format(5.0009820); // print 5.001
echo auto_decimal_format(5.00098, 8); // print 5.00098000
echo auto_decimal_format(1.0295691366783E-5, 2); // print 0.00

function auto_decimal_format($n, $def = 2) {
$a = explode(".", $n);
if (
count($a)>1) {
$b = str_split($a[1]);
$pos = 1;
foreach (
$b as $value) {
if (
$value != 0 && $pos >= $def) {
$c = number_format($n, $pos);
$c_len = strlen(substr(strrchr($c, "."), 1));
if (
$c_len > $def) { return rtrim($c, 0); }
return
$c; // or break
}
$pos++;
}
}
return
number_format($n, $def);
}

?>
To Top