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
) обозначения не допускаются.
Связь с литералами с плавающей запятой ясна, но как все это относится к целочисленным литералам?
- Восьмеричное обозначение считается числовым.
- Шестнадцатеричная запись перестала рассматриваться в PHP / 7.0.
- Двоичная запись никогда не была.
- Целочисленное переполнение не является прямой проблемой, но приведет к потере точности.
В руководстве не указывается явно, каковы варианты использования, но в целом это скорее вспомогательный инструмент (для обеспечения возможности передачи строковых данных функциям, которые ожидают числовые значения), чем надлежащий валидатор формы. Если вход собирается в среде, где 88205052E00
не ожидается, тогда может быть хорошей идеей ожидать (и генерировать) локализованные данные и реализовывать решение с учетом локали.