以下代码给出了两个不同的输出:
$number = '1562798794365432135246';
echo $number;
echo number_format($number);
任何人都能解释一下吗?
编辑:忘了提,上面给了我“1562798794365432135246 1,562,798,794,365,432,233,984”。请注意,最后六位数字是完全不同的,没有明显的原因(所有我要求它做的是插入千位分隔符)。答案 0 :(得分:5)
number_format()
,as stated by the PHP manual,将一个浮点数转换为一个包含数千个逗号组的字符串。
$number = '1562798794365432135246';
var_dump($number); // string(22) "1562798794365432135246"
var_dump(number_format($number)); // string(29) "1,562,798,794,365,432,233,984"
如果您正在尝试将字符串转换为整数,则可以这样执行:
$number = (int) $number;
但是,请注意,因为PHP中最大可能的整数值在32位系统上为2147483647
,在64位系统上为9223372036854775807
。如果您尝试在32位系统上将类似上面的字符串强制转换为int,则会将$number
分配给2147483647
而不是您想要的值!
number_format()
函数将 float 作为参数,具有类似的问题。将字符串作为参数传递给number_format()
时,它会在内部转换为float。浮点数比整数稍微复杂一点。而不是像一个整数值那样有一个硬上限,浮动在最低有效数字中逐渐丢失 precision ,使得最后几个位置不正确。
所以,不幸的是,如果你需要格式化这样的长字符串,你可能需要编写自己的函数。如果您只需要在数千个地方添加逗号,这应该很简单 - 只需使用strlen和substr从字符串末尾获取每个三个字符集并创建一个带逗号的新字符串之间。
答案 1 :(得分:2)
我知道这是一个老问题,但我最近遇到了这个问题并编写了一个适用于我的目的的函数。希望它能帮助别人。它适用于单引号字符串和$ _GET。我没有测试$ _POST。如果您正在处理负整数或非整数,则必须进行修改。
<?php
function format_big_numbers($number, $delimiter) {
$len = strlen($number);
if ($len > 3){
if ($len % 3 == 0) {
$split = str_split($number, 3);
$number_with_commas = implode("$delimiter", $split);
return $number_with_commas;
}
else if ($len % 3 == 1) {
$front = substr($number, 0, 1);
$split = substr($number, 1, $len - 1);
$split = str_split($split, 3);
$number_with_commas = implode("$delimiter", $split);
$number_with_commas = $front . "$delimiter" . $number_with_commas;
return $number_with_commas;
}
else {
$front = substr($number, 0, 2);
$split = substr($number, 2, $len - 2);
$split = str_split($split, 3);
$number_with_commas = implode("$delimiter", $split);
$number_with_commas = $front . "$delimiter" . $number_with_commas;
return $number_with_commas;
}
}
else {
return $number;
}
}
$num = '1234567891234567891234567891234';
echo format_big_numbers($num, ","); // output is 1,234,567,891,234,567,891,234,567,891,234
?>
答案 2 :(得分:1)
要使用PHP和这么大的数字,你应该使用一些库 Working with large numbers in PHP
BC Math - http://www.php.net/manual/en/book.bc.php,GMP - http://www.php.net/manual/en/book.gmp.php