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

时间:2013-12-16 09:26:52

标签: php

我需要检查参数(string或int或float)是否为“大”整数。 “大整数”是指它没有小数位,可以超过PHP_INT_MAX。它用作msec时间戳,内部表示为float。

我想到了{p> ctype_digit,但强制执行字符串类型。 is_int作为辅助检查仅限于PHP_INT_MAX范围,is_numeric将接受带小数位的浮点数,这是我不想要的。

依靠这样的东西是否安全还是有更好的方法:

if (is_numeric($val) && $val == floor($val)) {
    return (double) $val;
}
else ...

4 个答案:

答案 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。