Как проверить, что строка является интервалом, но не двойным, и т.д.?

PHP имеет intval() функция, которая преобразует строку в целое число. Однако я хочу проверить, что строка является целым числом заранее, так, чтобы я мог дать полезное сообщение об ошибке пользователю, если это неправильно. PHP имеет is_int(), но это возвращает false для строки как "2".

PHP имеет is_numeric() функция, но это возвратит true, если число будет двойным. Я хочу что-то, что возвратит false для двойного, но верный для интервала.

например:

my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
141
задан Lightness Races with Monica 7 January 2012 в 10:46
поделиться

6 ответов

Как насчет использования ctype_digit?

Из руководства:

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
    if (ctype_digit($testcase)) {
        echo "The string $testcase consists of all digits.\n";
    } else {
        echo "The string $testcase does not consist of all digits.\n";
    }
}
?>

Приведенный выше пример выдаст:

The string 1820.20 does not consist of all digits.
The string 10002 consists of all digits.
The string wsl!12 does not consist of all digits.

Это сработает только в том случае, если ваш вход всегда будет строкой:

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false

Если ваш вход может быть типа int, то комбинируйте ctype_digit с is_int.

Если вас волнуют отрицательные числа, то вам необходимо проверить вход на наличие предшествующих -, и если да, то вызовите ctype_digit на подложке входной строки. Что-то подобное могло бы сделать это:

function my_is_int($input) {
  if ($input[0] == '-') {
    return ctype_digit(substr($input, 1));
  }
  return ctype_digit($input);
}
167
ответ дан 23 November 2019 в 23:09
поделиться
[
/**
 * Check if a number is a counting number by checking if it
 * is an integer primitive type, or if the string represents
 * an integer as a string
 */
function is_int_val($data) {
    if (is_int($data) === true) return true;
    if (is_string($data) === true && is_numeric($data) === true) {
        return (strpos($data, '.') === false);
    }
}
] [

][]Source[].[

]
7
ответ дан 23 November 2019 в 23:09
поделиться
[

]Можно использовать is_numeric(), затем проверить наличие "..." в строке (не особенно культурно-чувствительной, однако).[

] [

]Альтернативное использование is_numeric(), а затем преобразовать в double и посмотреть, $var == floor($var) (должен ли возвращать true, если это целое число).[

].
-1
ответ дан 23 November 2019 в 23:09
поделиться

+1 к ответу Доминика (используя ctype_digit). Другой способ сделать это - с помощью принуждения типа:

$inty = "2";
$inty2 = " 2";
$floaty = "2.1";
$floaty2 = "2.0";

is_int($inty + 0); // true
is_int($floaty + 0); // false
is_int($floaty2 + 0); // false

// here's difference between this and the ctype functions.
is_int($inty2 + 0);  // true
ctype_digit($inty2); // false
19
ответ дан 23 November 2019 в 23:09
поделиться

filter_var должен сделать это:

var_dump(filter_var('2', FILTER_VALIDATE_INT));   // 2
var_dump(filter_var('2.0', FILTER_VALIDATE_INT)); // false
var_dump(filter_var('2.1', FILTER_VALIDATE_INT)); // false

но

var_dump(filter_var(2, FILTER_VALIDATE_INT));     // 2
var_dump(filter_var(2.0, FILTER_VALIDATE_INT));   // 2
var_dump(filter_var(2.1, FILTER_VALIDATE_INT));   // false

Если вы просто хотите, чтобы Булеан как возвращаемые значения, оберните его в функцию, например,

function validatesAsInt($number)
{
    $number = filter_var($number, FILTER_VALIDATE_INT);
    return ($number !== FALSE);
}
80
ответ дан 23 November 2019 в 23:09
поделиться

Передайте это в интенсивную службу. если он все еще имеет то же значение его int;

function my_is_int($var) {
  $tmp = (int) $var;
  if($tmp == $var)
       return true;
  else
       return false;
}
13
ответ дан 23 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: