PHP Conference Japan 2024

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。从 PHP 8.3.0 开始,当该值为负数时,num 会先舍入到小数点前 decimals 位有效数字。在 PHP 8.3.0 之前,负值会被忽略并与 0 的处理方式相同。

decimal_separator

设置小数点的分隔符。

thousands_separator

设置千位分隔符。

返回值

num 的格式化版本。

变更日志

版本 描述
8.3.0 添加了对 decimals 的负值处理。
8.0.0 在此版本之前,number_format() 接受一个、两个或四个参数(但不接受三个)。
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

?>

示例 #2 decimals 的负值

从 PHP 8.3.0 开始,decimals 的负值用于舍入小数点前有效数字的位数。

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

以上示例将输出

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

参见

添加注释

用户贡献的注释 7 个注释

thomas at weblizards dot de
15 年前
没有明确说明;number_format 也会进行舍入

<?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
info at ensostudio dot ru
2 年前
注意:使用 NumberFormatter 转换为人类可读的格式,而不是注释中的用户函数
<?php
echo NumberFormatter::create('en', NumberFormatter::SPELLOUT)->format(12309); // twelve thousand three hundred nine
echo NumberFormatter::create('ru', NumberFormatter::SPELLOUT)->format(12307.5); // двенадцать тысяч триста семь целых пять десятых
?>
james at bandit dot co.nz
15 年前
输出人类可读的数字。

<?php
# 输出易于阅读的数字
# 作者:james at bandit.co.nz
function bd_nice_number($n) {
// 首先去除任何格式化;
$n = (0+str_replace(",","",$n));

// 这是一个数字吗?
if(!is_numeric($n)) return false;

// 现在过滤它;
if($n>1000000000000) return round(($n/1000000000000),1).' 万亿';
else if(
$n>1000000000) return round(($n/1000000000),1).' 十亿';
else if(
$n>1000000) return round(($n/1000000),1).' 百万';
else if(
$n>1000) return round(($n/1000),1).' 千';

return
number_format($n);
}
?>

输出

247,704,360 -> 247.7 百万
866,965,260,000 -> 867 十亿
Jeroen de Bruijn [NL]
19 年前
如果您想显示以 ,- 结尾的数字(例如 200,-),当没有小数字符时,并在有小数字符时显示小数,我使用

function DisplayDouble($value)
{
list($whole, $decimals) = split ('[.,]', $value, 2);
if (intval($decimals) > 0)
return number_format($value,2,".",",");
else
return number_format($value,0,".",",") .",-";
}
Theo Diem
21 年前
如果您使用 number_format 函数,格式化数字可能会更容易。

我还写了这个
function something($number)
{
$locale = localeconv();
return number_format($number,
$locale['frac_digits'],
$locale['decimal_point'],
$locale['thousands_sep']);
}

希望这有帮助 =)
[]'s
MarcM
18 年前
对于零填充 - 只需使用 sprintf() 函数

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

//输出 001
-----------------

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

//输出 010
-----------------

您可以将 %03d 更改为 %04d 等。
stm555 at hotmail dot com
19 年前
我遇到了一个问题,我想保留实数值的输入精度,而无需任意舍入用户提交的内容。

我在格式化之前对数字进行快速 explode 操作解决了这个问题。然后我可以格式化小数点两侧。

<?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