我需要检查一个参数(字符串、int或float)是否是"大"整数。我所说的"大整数"是指它没有小数点,可以超过PHP_INT_MAX
。它被用作毫秒时间戳,内部表示为浮点。
会想到ctype_digit
,但它强制使用字符串类型。is_int
作为二次检查仅限于PHP_INT_MAX
范围,is_numeric
将接受带小数位数的浮点值,这是我不想要的。
依赖这样的东西安全吗?或者有更好的方法:
if (is_numeric($val) && $val == floor($val)) {
return (double) $val;
}
else ...
我推荐使用二进制计算器,因为它不关心长度和最大字节数。它将您的"整数"转换为二进制字符串,并以这种方式进行所有计算。
BC math-lib是在PHP中生成RSA密钥/加密的唯一可靠方法,因此它可以轻松处理您的需求:
$userNumber = '1233333333333333333333333333333333333333312412412412';
if (bccomp($userNumber, PHP_INT_MAX, 0) === 1) {
// $userNumber is greater than INT MAX
}
第三个参数是浮动位数。
所以基本上你想检查一个特定的变量是否像整数?
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,并将数字保持为字符串格式。
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;
}
我做到了在函数末尾,检查数字数据。
return is_numeric($text)&&!(is_int(strpos($text,".",0)));
它将首先检查它是否是数字,然后通过检查是否找到位置来检查字符串中是否没有小数。如果它这样做了,返回的位置是一个int,所以is_int()会捕获它。
(strpos($text,".",0)==FALSE)也可以根据strpos手册工作,但有时该功能似乎根本不会像那样返回任何信息
echo (strpos($text,".",0));
可能什么都不是,并且需要==FALSE。