【发布时间】:2018-08-22 07:50:16
【问题描述】:
我编写了一个自定义函数,它必须调用 number_format() 将我的输入数字(浮点数)四舍五入到预定的小数位数(小数位数应上限为 5)并修改小数字符和千位分隔符。
数字四舍五入并格式化后,我还希望有条件地从十进制值中修剪一些尾随零。
具体来说,如果输入值要四舍五入到小数点后 0、1 或 2 位,则不需要进行零修整。但是,如果四舍五入到 3 位或更多位,则可以删除尾随零,直到只剩下两位小数。
这是一个测试用例矩阵和我想要的输出:
| D E C I M A L P L A C E S
INPUT | 0 | 1 | 2 | 3 | 4 | 5 | 6
----------------+-------+---------+----------+-----------+------------+-------------+------------
1.01 | 1 | 1,0 | 1,01 | 1,01 | 1,01 | 1,01 | 1,01
----------------+-------+---------+----------+-----------+------------+-------------+------------
1.044 | 1 | 1,0 | 1,04 | 1,044 | 1,044 | 1,044 | 1,044
----------------+-------+---------+----------+-----------+------------+-------------+------------
0.240000 | 0 | 0,2 | 0,24 | 0,24 | 0,24 | 0,24 | 0,24
----------------+-------+---------+----------+-----------+------------+-------------+------------
0.200 | 0 | 0,2 | 0,20 | 0,20 | 0,20 | 0,20 | 0,20
----------------+-------+---------+----------+-----------+------------+-------------+------------
0.24540 | 0 | 0,2 | 0,25 | 0,245 | 0,2454 | 0,2454 | 0,2454
----------------+-------+---------+----------+-----------+------------+-------------+------------
0.24546 | 0 | 0,2 | 0,25 | 0,245 | 0,2455 | 0,24546 | 0,24546
----------------+-------+---------+----------+-----------+------------+-------------+------------
6500.00 | 6 500 | 6 500,0 | 6 500,00 | 6 500,00 | 6 500,00 | 6 500,00 | 6 500,00
----------------+-------+---------+----------+-----------+------------+-------------+------------
3760.54 | 3 761 | 3 760,5 | 3 760,54 | 3 760,54 | 3 760,54 | 3 760,54 | 3 760,54
----------------+-------+---------+----------+-----------+------------+-------------+------------
3760.000000000 | 3 760 | 3 760,0 | 3 760,00 | 3 760,00 | 3 760,00 | 3 760,00 | 3 760,00
----------------+-------+---------+----------+-----------+------------+-------------+------------
0.04000 | 0 | 0,0 | 0,04 | 0,04 | 0,04 | 0,04 | 0,04
----------------+-------+---------+----------+-----------+------------+-------------+------------
1.000000 | 1 | 1,0 | 1,00 | 1,00 | 1,00 | 1,00 | 1,00
----------------+-------+---------+----------+-----------+------------+-------------+------------
1.000005 | 1 | 1,0 | 1,00 | 1,00 | 1,00 | 1,00001 | 1,00001
这是我当前的代码:
function format($number, $decimal=0, $thousands=' ')
{
$number = number_format($number, $decimal, '.', '');
$whole = floor($number);
$fraction = $number - $whole;
if(!(int)$fraction && $decimal > 2) {
$decimal = 2;
}
if (false !== strpos($number, '.')) {
$number = rtrim(rtrim($number, '0'), '.');
}
$number = number_format($number, $decimal, '.', $thousands);
return $number;
}
【问题讨论】:
标签: php floating-point conditional number-formatting decimal-point