PHP: как проверить, является ли переменная "большим целым числом"
Мне нужно проверить, является ли параметр (строка или 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 ...
Ответы
Ответ 1
Итак, в основном вы хотите проверить, является ли конкретная переменная целочисленной?
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
, что, очевидно, не позволит выполнить вышеуказанные тесты.
Если значение превышает INT_MAX в данной среде (32-разрядной или 64-разрядной), я бы рекомендовал вместо этого использовать gmp и сохраняйте числа в строковом формате.
Ответ 2
Я рекомендую двоичный калькулятор, поскольку он не заботится о длине и максимальных байтах. Он преобразует ваше "целое число" в двоичную строку и делает все вычисления таким образом.
BC math lib - единственный надежный способ генерации/шифрования ключей RSA в PHP, поэтому он может легко справиться с вашими требованиями:
$userNumber = '1233333333333333333333333333333333333333312412412412';
if (bccomp($userNumber, PHP_INT_MAX, 0) === 1) {
// $userNumber is greater than INT MAX
}
Третий параметр - количество плавающих цифр.