В PHP 5 я использую intval () всякий раз, когда я получаю числа в качестве ввода. Таким образом, я хочу убедиться, что я не получаю ни строк, ни плавающих чисел. Мои номера ввода должны быть целыми числами. Но когда я получаю числа> = 2147483647, предел целочисленного знака скрещен.
Что я могу сделать, чтобы иметь эквивалент intval () для чисел всех размеров?
Вот что я хочу:
<?php $inputNumber = 3147483647.37; $intNumber = intvalEquivalent($inputNumber); echo $intNumber; // output: 3147483647 ?>
Заранее большое спасибо!
Изменить. Основываясь на некоторых ответах, я попытался закодировать эквивалентную функцию. Но он не работает точно так же, как intval (). Как я могу улучшить его? Что с этим не так?
function intval2($text) { $text = trim($text); $result = ctype_digit($text); if ($result == TRUE) { return $text; } else { $newText = sprintf('%.0f', $text); $result = ctype_digit($newText); if ($result == TRUE) { return $newText; } else { return 0; } } }
Попробуйте эту функцию, она будет правильно удалять любые десятичные числа, как это делает intval, и удалять любые нечисловые символы.
<?php function bigintval($value) { $value = trim($value); if (ctype_digit($value)) { return $value; } $value = preg_replace("/[^0-9](.*)$/", '', $value); if (ctype_digit($value)) { return $value; } return 0; } // SOME TESTING echo '"3147483647.37" : '.bigintval("3147483647.37")."<br />"; echo '"3498773982793749879873429874.30872974" : '.bigintval("3498773982793749879873429874.30872974")."<br />"; echo '"hi mom!" : '.bigintval("hi mom!")."<br />"; echo '"+0123.45e6" : '.bigintval("+0123.45e6")."<br />"; ?>
Вот результат:
"3147483647.37" : 3147483647 "3498773982793749879873429874.30872974" : 3498773982793749879873429874 "hi mom!" : 0 "+0123.45e6" : 0
Надеюсь, это поможет!
вы также можете использовать регулярные выражения, чтобы удалить все после числовых числовых частей:
<?php $inputNumber = "3147483647.37"; $intNumber = preg_replace('/^([0-9]*).*$/', "\\1", $inputNumber); echo $intNumber; // output: 3147483647 ?>
Либо используйте number_format($inputNumber, 0, '', '')
Или, если вы хотите проверить только ли его целое число, используйте ctype_digit($inputNumber)
Не используйте предложенный is_numeric
, так же как и floats являются числовыми. например, «+ 0123.45e6» принимается is_numeric
В дополнение к number_format вы можете использовать sprintf:
sprintf("%.0f", 3147483647.37) // 3147483647
Однако оба решения страдают от переполнения float, например:
sprintf("%.0f", 314734534534533454346483647.37) // 314734534534533440685998080
Если вы хотите обрабатывать номера произвольной точности, вам нужно будет использовать расширение gmp . Например, функция gmp_init()
преобразует строку в объект ресурса gmp. недостатком является то, что вы должны использовать другие функции этого расширения для дальнейшей обработки этого объекта. Преобразование его обратно в строку выполняется, например, с помощью gmp_strval()
.
$gmpObject = gmp_init($string, 10); if ($gmpObject === FALSE) { # The string was not a valid number, # handle this case here } echo gmp_strval($gmpObject);
Возможно, вы захотите только убедиться, что строка представляет допустимый номер и использует сама строку, если вы не собираетесь выполнять какие-либо операции над значением. Это можно сделать с помощью регулярного выражения:
$containsInt = preg_match('/^\d+$/', $string); # Or for floating point numbers: $containsFloat = preg_match('/^\d+(.\d+)?$/', $string); echo $string;
Другой вариант – использовать is_numeric()
. Но эта функция делает больше конверсий, чем вам может понравиться. Цитирование из документов этой функции:
… + 0123.45e6 – действительное числовое значение …
<?php $a = 453453445435.4; echo $bigint = floor($a);