PHP:如何检查变量是否为“;大整数”;


PHP: How to check if variable is a "large integer"

我需要检查一个参数(字符串、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。