PHP "is_numeric" принимает "E" как число

Я заметил PHP is_numeric() принимает "Е" в качестве числа. У меня есть строка: "88205052E00"и я хочу, чтобы результат был: НЕ числовой.

Вот код, который я тестировал.

<?php

$notnumber = '88205052E00';

if(is_numeric($notnumber)) {
    echo $notnumber . ' is a number';
} else {
    echo $notnumber . ' is NOT a number';
}

?>

Код выше дает результат:

88205052E00 is a number

Как я могу получить результат: 88205052E00 НЕ число?

5 ответов

Решение

Я буду держать ответ в том случае, если это поможет, но, как указывалось, есть недостатки с ctype_digit в том что не нравится - или же .,

Скорее всего, вы захотите использовать ctype_digit, который проверяет, все ли символы в предоставленной строке text являются числовыми.

Где as is_numeric - определяет, является ли переменная числом или числовой строкой

<?php

$s = "88205052E00";

if(ctype_digit($s)){
    echo "Yes";
} else {
    echo "No";
}

возвращает нет.

Просто используйте регулярное выражение:

<?php
if (preg_match("/^\-?[0-9]*\.?[0-9]+\z/", $notnumber)) {
    echo "$notnumber is numeric\n";
} else {
    echo "$notnumber is not numeric\n";
}

Результаты:

   1234 is numeric
1234E56 is not numeric
  -1234 is numeric
  .1234 is numeric
 -.1234 is numeric
 -12.34 is numeric

E действителен из-за чисел с плавающей точкой ( http://php.net/manual/en/language.types.float.php).

Если вы не хотите разрешать E по какой-либо причине вы можете проверить это самостоятельно:

if (strpos(strtolower($notnumber), 'e') === false && is_numeric($notnumber))

Это гарантирует, что E не существует и что оно также является числовым.

Предполагая, что вы хотите убедиться, что строка является допустимым целым числом, вы можете использовать filter_var:

$tests = ['1', '1.1', '1e0', '0x1'];
foreach($tests as $str) {
    $int = filter_var($str, FILTER_VALIDATE_INT);
    if ($int === false) {
        echo $str . ' is not an integer' . PHP_EOL;
    } else {
        echo $str . ' is an integer' . PHP_EOL;
    }
}

Результат:

1 is an integer
1.1 is not an integer
1e0 is not an integer
0x1 is not an integer

Давайте проверим определение:

Находит, является ли данная переменная числовой. Числовые строки состоят из необязательного знака, любого количества цифр, необязательной десятичной части и необязательной экспоненциальной части. таким образом +0123.45e6 является допустимым числовым значением. Шестнадцатеричный (например, 0xf4c3b00c) и двоичный (например, 0b10100111001) обозначения не допускаются.

Связь с литералами с плавающей запятой ясна, но как все это относится к целочисленным литералам?

В руководстве не указывается явно, каковы варианты использования, но в целом это скорее вспомогательный инструмент (для обеспечения возможности передачи строковых данных функциям, которые ожидают числовые значения), чем надлежащий валидатор формы. Если вход собирается в среде, где 88205052E00 не ожидается, тогда может быть хорошей идеей ожидать (и генерировать) локализованные данные и реализовывать решение с учетом локали.

Другие вопросы по тегам