不要重复使用PHP的number_format函数

和其他朋友聊起来,说是他们公司临近双十一做了一套秒杀系统,价值三千多的商品,被三块钱卖出去了。这种情况大概率是金额精度操作或者格式化有误之类的问题。果不其然,最后发现是重复使用number_format函数造成金额截取。这坑没有必要跳进去,现在写下来加深下记忆力,希望自己不会犯类似错误。

number_format() 函数通过千位分组来格式化数字。
Tips:该函数支持一个、两个或四个参数。

语法

number_format(number,decimals,decimalpoint,separator)

参数 描述
number 必需。要格式化的数字。如果未设置其他参数,则数字会被格式化为不带小数点且以逗号(,)作为千位分隔符。
decimals 可选。规定多少个小数。如果设置了该参数,则使用点号(.)作为小数点来格式化数字
decimalpoint 可选。规定用作小数点的字符串。
separator 可选。规定用作千位分隔符的字符串。仅使用该参数的第一个字符。比如 “xxx” 仅输出 “x”。
注释:如果设置了该参数,那么所有其他参数都是必需的。

技术细节

参数 备注
返回值: 返回已格式化的数字。
PHP 版本: 4+
更新日志: 自 PHP 5.4 起,该函数在参数 decimalpoint 和 separator 中支持多字节。
在更老的版本中,只使用每个分隔符的第一个字节。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$num = 4999.59;
echo number_format($num)."\n";
// 这里结果正确,四舍五入取整,输出结果为:5,000
$formattedNum = number_format($num, 2);
echo $formattedNum."\n";
// 这里结果正确,保留两位小数,输出结果为:4,999.59
echo number_format($num,2,'.',',')."\n";
// 这里结果正确,保留两位小数,输出结果为:4,999.59
echo number_format($formattedNum)."\n";
// 这里有报错提醒(PHP Notice: A non well formed numeric value encountered in /usercode/file.php on),输出结果为:4

// 假设以 $formattedNum 进行加减后再来一遍format就不会有报错,但是金额错的就更离谱了,假设运费六元 不考虑精度问题直接加减进行测试,如下
$fee = 6;
$totalAmount = $formattedNum + $fee;
echo number_format($totalAmount)."\n";

从上面的栗子可以明显看出来,重复使用number_format会导致数字异常,需要留意。

本文标题:不要重复使用PHP的number_format函数

文章作者:xugz

发布时间:2019年11月04日 - 17:34

最后更新:2021年09月11日 - 16:44

原始链接:https://xlline.github.io/2019/11/04/PHP-number_format%E5%87%BD%E6%95%B0/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。