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() 接受一个、两个或四个参数(但不接受三个)。
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

?>

参见

添加注释

用户贡献的注释 10 条注释

422
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
8
Jeroen de Bruijn [NL]
18 年前
如果您想在没有小数字符的情况下显示以 ,- 结尾的数字(例如 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,".",",") .",-";
}
10
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); // двенадцать тысяч триста семь целых пять десятых
?>
38
james at bandit dot co.nz
15 年前
输出人类可读的数字。

<?php
# 输出易读的数字
# 作者:james 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).' 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);
}
?>

输出

247,704,360 -> 247.7 million
866,965,260,000 -> 867 billion
22
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 等。
8
Theo Diem
21 年前
如果你使用 number_format 函数,格式化数字可能会更容易。

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

希望这有帮助 =)
[]'s
15
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];
}
?>
0
support at piri dot sk
1 年前
我对这个函数中小数位数超过指定位数的小数问题提出更简单的解决方案。

number_format() 的标准结果是..
number_format(5.00098, 2) = 5.00

我的函数将返回结果 = 5.001

<?php

// ** 警告:不适用于科学记数法。需要转换为实数。 **

echo auto_decimal_format(5.0005620); // 打印 5.0006
echo auto_decimal_format(5.0009820); // 打印 5.001
echo auto_decimal_format(5.00098, 8); // 打印 5.00098000
echo auto_decimal_format(1.0295691366783E-5, 2); // 打印 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; // 或者 break
}
$pos++;
}
}
return
number_format($n, $def);
}

?>
-1
liviu andrei (bls)
12 年前
为了防止在最后一个有效小数位后面的下一个数字为 5 时发生的舍入(下面提到了几个人)

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

if ((
$number * pow(10 , $decimals + 1) % 10 ) == 5) // 如果下一个非有效位是 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";
// 结果是:7.15 | 7.2 | 7.1

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

玩得开心!
-4
Mad Max
9 个月前
印度(约占世界人口的 18%)、巴基斯坦(约 3%)、孟加拉国(约 2%)、尼泊尔和缅甸对大型数字的显示方式不同

10,23,45,678.20

第一个千是“正常”的,但之后每两位数字就会有一个逗号。

现在看看 number_format() 函数。你是否看到了一种方法可以控制逗号的放置和频率?或者有一种模式选项/开关来处理对地球上近 1/4 人口显示数字?我也没有。

如果你正在为国际用户开发应用程序,基于 ICU 的 Intl PHP 扩展可能对你有用。但是,IBM 的 ICU 库是一个资源密集型库(因为...IBM),不是地球上最快的库(这对 IBM 来说也很正常),ICU 格式化器有点不可靠/不一致(是的,仍然是 IBM),而且 Intl 扩展并不总是可以在 PHP 中使用(这是 PHP 的问题)。因此,仅仅为了使用 Intl 扩展准备数字进行显示,就需要克服许多重大的障碍。

简而言之,目前大约有 23% 的地球用户无法使用此函数来显示大数字,并且除了自己编写一个完全替代此函数的轻量级解决方案外,没有好的内置 *轻量级* 替代方案。格式化数字以进行显示是一项极其常见的任务。

免责声明:此评论旨在提醒其他人,此函数目前不适合国际用户。此评论不是问题、错误报告或功能请求。我只是在评论此函数的现状。如果有人选择进行更改/改进,那很好,但这并非此处的目的。
To Top