PHP "is_numeric" принимает "E" как число - PullRequest
0 голосов
/ 19 декабря 2018

Я заметил, что PHP is_numeric() принимает "E" как число.У меня есть строка: "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 ]

0 голосов
/ 20 декабря 2018

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

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

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

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

0 голосов
/ 19 декабря 2018

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

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

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

<?php

$s = "88205052E00";

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

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

0 голосов
/ 19 декабря 2018

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

<?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
0 голосов
/ 19 декабря 2018

Если вы хотите убедиться, что строка является действительным целым числом, вы можете использовать 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
0 голосов
/ 19 декабря 2018

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

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

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

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

...