我需要检查参数(string或int或float)是否为“大”整数。 “大整数”是指它没有小数位,可以超过PHP_INT_MAX
。它用作msec时间戳,内部表示为float。
ctype_digit
,但强制执行字符串类型。 is_int
作为辅助检查仅限于PHP_INT_MAX
范围,is_numeric
将接受带小数位的浮点数,这是我不想要的。
依靠这样的东西是否安全还是有更好的方法:
if (is_numeric($val) && $val == floor($val)) {
return (double) $val;
}
else ...
答案 0 :(得分:4)
我推荐使用二进制计算器,因为它不关心长度和最大字节数。它将您的“整数”转换为二进制字符串,并按此方式进行所有计算。
BC math lib是在PHP中进行RSA密钥生成/加密的唯一可靠方式,因此它可以轻松满足您的要求:
$userNumber = '1233333333333333333333333333333333333333312412412412';
if (bccomp($userNumber, PHP_INT_MAX, 0) === 1) {
// $userNumber is greater than INT MAX
}
第三个参数是浮动数字。
答案 1 :(得分:4)
所以基本上你想检查特定变量是否类似于整数?
function isInteger($var)
{
if (is_int($var)) {
// the most obvious test
return true;
} elseif (is_numeric($var)) {
// cast to string first
return ctype_digit((string)$var);
}
return false;
}
请注意,使用浮点变量来保持大整数将失去精度,并且当大到足以变成分数时,例如9.9999999999991E+36
,显然无法通过上述测试。
如果在给定环境(32位或64位)上该值超过INT_MAX,我建议改为使用gmp并以字符串格式保留数字。
答案 2 :(得分:0)
function isInteger($var)
{
if (is_int($var)) {
return true;
} elseif (is_numeric($var)) {
// will throw warning
if (!gmp_init($var)) {
return false;
} elseif (gmp_cmp($var, PHP_INT_MAX) >0) {
return true;
} else {
return floor($var) == $var;
}
}
return false;
}
答案 3 :(得分:0)
我做到了 在函数末尾检查数字数据。
return is_numeric($text)&&!(is_int(strpos($text,".",0)));
它将首先检查它是否是数字,然后通过检查是否找到位置来检查字符串中是否没有小数。如果确实如此,则返回的位置是一个 int,因此 is_int() 将捕获它。
(strpos($text,".",0)==FALSE) 也可以基于 strpos manual 工作,但有时该函数似乎根本没有像
echo (strpos($text,".",0));
可能什么都没有,并且需要 ==FALSE。