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

Задаёт количество десятичных разрядов. Значение параметра decimal_separator опускается в возвращаемом значении, если в параметр передали значение 0.

decimal_separator

Устанавливает разделитель дробной части.

thousands_separator

Устанавливает разделитель классов многозначного числа.

Возвращаемые значения

Функция возвращает отформатированное число num.

Список изменений

Версия Описание
8.0.0 До этой версии функция number_format() принимала один, два или четыре параметр, но не три.
7.2.0 Функцию number_format() изменили, чтобы не возвращать значение -0. Раньше функция могла вернуть значение -0, если параметр num равнялся -0.01.

Примеры

Пример #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
422
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
8
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
38
james at bandit dot co.nz
15 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
22
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
8
Theo Diem
21 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
15
stm555 at hotmail dot com
19 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
0
support at piri dot sk
1 year 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);
}

?>
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
-4
Mad Max
8 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.
To Top