Intereting Posts

PHP: intval () эквивалент для чисел> = 2147483647

В 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; } } } 

Solutions Collecting From Web of "PHP: intval () эквивалент для чисел> = 2147483647"

Попробуйте эту функцию, она будет правильно удалять любые десятичные числа, как это делает 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);