Я заметил 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 — это НЕ номер?
Я буду держать ответ, если это поможет, но, как указано, есть недостатки с 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
не ожидается, тогда было бы неплохо ожидать (и генерировать) локализованные данные и реализовывать локально-ориентированное решение.