PHP 8.5.0 Alpha 1 available for testing

number_format

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

number_formatFormatea un número para su visualización

Descripción

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

Formatea un número con los miles agrupados y opcionalmente con cifras decimales utilizando la regla de redondeo al más cercano.

Parámetros

num

El número a formatear.

decimals

Define el número de cifras decimales. Si es 0, el decimal_separator es omitido del valor de retorno. A partir de PHP 8.3.0, cuando el valor es negativo, num es redondeado a decimals cifras significativas antes del punto decimal. Antes de PHP 8.3.0, los valores negativos eran ignorados y tratados de la misma manera que 0.

decimal_separator

Define el separador para el punto decimal.

thousands_separator

Define el separador de miles.

Valores devueltos

Una versión formateada del número num.

Historial de cambios

Versión Descripción
8.3.0 Se añadió el manejo de valores negativos para decimals.
8.0.0 Antes de esta versión, number_format() aceptaba uno, dos o cuatro argumentos (pero no tres).
7.2.0 number_format() fue modificado para no permitir devolver -0, anteriormente -0 podía ser devuelto para casos donde num valía -0.01.

Ejemplo #1 Un valor negativo para decimals

A partir de PHP 8.3.0, un valor negativo para decimals es utilizado para redondear el número de cifras significativas antes del punto decimal.

<?php
$number
= "1234.5678";
var_dump(number_format($number, -1));
var_dump(number_format($number, -2));
var_dump(number_format($number, -3));
?>

El resultado del ejemplo sería:

string(5) "1 230"
string(5) "1 200"
string(5) "1 000"

Ejemplos

Ejemplo #2 Ejemplo con number_format()

En notación francesa, se utilizan generalmente dos cifras después de la coma, una coma como separador decimal y un espacio como separador de miles. El siguiente ejemplo muestra cómo formatear un número de diferentes maneras:

<?php

$number
= 1234.56;

// Notación inglesa (por omisión)
echo number_format($number), PHP_EOL;
// 1,235

// Notación francesa
echo number_format($number, 2, ',', ' '), PHP_EOL;
// 1 234,56

$number = 1234.5678;

// Notación inglesa sin separador de miles
echo number_format($number, 2, '.', ''), PHP_EOL;
// 1234.57

?>

Ver también

  • money_format() - Formatea un número como valor monetario
  • sprintf() - Devuelve una string formateada
  • printf() - Muestra una string formateada
  • sscanf() - Analiza una cadena utilizando un formato

add a note

User Contributed Notes 7 notes

up
427
thomas at weblizards dot de
16 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
info at ensostudio dot ru
3 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
41
james at bandit dot co.nz
16 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
19 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
22 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
5
Jeroen de Bruijn [NL]
19 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
13
stm555 at hotmail dot com
20 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];
}
?>
To Top