Is numeric: примеры (PHP)

Функция is_numeric в PHP: примеры использования и особенности
Раздел: Работа с переменными
is_numeric(mixed $value): bool
Описание функции is_numeric

Функция is_numeric проверяет, является ли переданное значение числом или строкой, содержащей число. Она возвращает true, если значение представляет собой целое число, число с плавающей точкой, или строковое представление числа (включая научную нотацию и числа с предшествующими знаками).

Функция используется для валидации пользовательского ввода, когда нужно убедиться, что значение может быть интерпретировано как число, перед выполнением математических операций или сохранением в базу данных.

Аргументы функции

Функция принимает один обязательный аргумент:

  • $value (mixed) - Проверяемое значение. Может быть любого типа.

Возвращаемое значение: bool (true или false).

Короткие примеры использования
Простые случаи
echo is_numeric(42) ? 'Да' : 'Нет';
Да
echo is_numeric(3.14) ? 'Да' : 'Нет';
Да
echo is_numeric('42') ? 'Да' : 'Нет';
Да
echo is_numeric('3.14') ? 'Да' : 'Нет';
Да
Специальные форматы
echo is_numeric('0xFF') ? 'Да' : 'Нет'; // Шестнадцатеричная запись не считается числовой строкой
Нет
echo is_numeric('1e4') ? 'Да' : 'Нет'; // Научная нотация
Да
echo is_numeric('+42') ? 'Да' : 'Нет'; // Знак плюс
Да
echo is_numeric('-42') ? 'Да' : 'Нет'; // Знак минус
Да
Нечисловые значения
echo is_numeric('42abc') ? 'Да' : 'Нет';
Нет
echo is_numeric('abc') ? 'Да' : 'Нет';
Нет
echo is_numeric(null) ? 'Да' : 'Нет';
Нет
echo is_numeric(true) ? 'Да' : 'Нет';
Нет
Похожие функции в PHP
  • is_int() - Проверяет, является ли значение целым числом. Не принимает строки, даже если они содержат целое число. Более строгая, чем is_numeric.
  • is_float() (или is_double()) - Проверяет, является ли значение числом с плавающей точкой. Также не работает со строковыми представлениями.
  • ctype_digit() - Проверяет, все ли символы в строке являются цифрами. Работает только со строками. Не принимает отрицательные числа или числа с плавающей точкой.
  • filter_var() с фильтром FILTER_VALIDATE_INT или FILTER_VALIDATE_FLOAT - Альтернатива для валидации чисел, предоставляет больше опций, например, указание диапазона.

Когда что использовать: is_numeric применяют, когда нужно принять и число, и его строковое представление. is_int или is_float используют для строгой проверки типа. ctype_digit подходит для проверки строк, содержащих только цифры. filter_var применяют для комплексной валидации с дополнительными параметрами.

Типичные ошибки
Путаница с типами данных
// Ожидание, что is_numeric проверяет только тип, а не содержимое
$value = '123';
if (is_numeric($value)) {
$result = $value + 10; // Неявное преобразование строки в число
echo $result;
} else {
echo 'Не число';
}
133

Ошибки нет, но важно помнить, что строка преобразуется в число. Если нужна строгая проверка типа, используют is_int.

Проверка шестнадцатеричных чисел
// is_numeric не распознает шестнадцатеричную запись в виде строки
$hex = '0xFF';
var_dump(is_numeric($hex));
var_dump(filter_var($hex, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX));
bool(false)
int(255)

Для проверки шестнадцатеричных чисел нужно использовать filter_var с соответствующим флагом.

Проверка массивов и объектов
// Передача массива или объекта
var_dump(is_numeric([1, 2, 3]));
var_dump(is_numeric(new stdClass()));
bool(false)
bool(false)

Функция возвращает false для нескалярных типов, что может быть неочевидным, если ожидается ошибка.

Изменения в последних версиях PHP
  • В PHP 7.0 добавлена строгая типизация. Однако is numeric остается функцией проверки содержимого, а не типа.
  • В PHP 8.0 не было внесено существенных изменений в поведение is_numeric. Однако общие изменения в системе типов PHP могут влиять на контекст, в котором используется функция.
  • В PHP 8.1 и 8.2 функция работает стабильно, без изменений в основном поведении.

Начиная с PHP 8, рекомендуется явно указывать типы аргументов и возвращаемых значений в объявлениях функций, что делает использование is numeric в сочетании с приведением типов более предсказуемым.

Расширенные примеры использования
Валидация пользовательского ввода
Пример php
function validateUserInput($input) {
if (is_numeric($input)) {
$number = (float)$input;
if ($number >= 0 && $number <= 100) {
return 'Число в допустимом диапазоне: ' . $number;
} else {
return 'Число вне диапазона 0-100.';
}
} else {
return 'Введенное значение не является числом.';
}
}

echo validateUserInput('42.5') . '
';
echo validateUserInput('150') . '
';
echo validateUserInput('abc') . '
';
Число в допустимом диапазоне: 42.5
Число вне диапазона 0-100.
Введенное значение не является числом.
Обработка данных из формы
Пример php
// Эмуляция данных из $_POST
$_POST = ['price' => ' 19.99 ', 'quantity' => '5', 'discount' => '10%'];

foreach ($_POST as $key => $value) {
$trimmed = trim($value);
if (is_numeric($trimmed)) {
echo "Поле {$key} содержит число: {$trimmed}
";
} else {
echo "Поле {$key} не содержит допустимое число.
";
}
}
Поле price содержит число: 19.99
Поле quantity содержит число: 5
Поле discount не содержит допустимое число.
Работа с научной нотацией
Пример php
$scientific = ['1e3', '2.5E-2', '1.23e+4', 'e5'];
foreach ($scientific as $val) {
echo "is_numeric('{$val}') = " . (is_numeric($val) ? 'true' : 'false') . '
';
}
is_numeric('1e3') = true
is_numeric('2.5E-2') = true
is_numeric('1.23e+4') = true
is_numeric('e5') = false
Сравнение с приведением типа
Пример php
$values = ['123', 123, '123abc', 'abc123', '0123'];
foreach ($values as $val) {
$numeric = is_numeric($val);
$int = (int)$val;
echo "Значение: '" . htmlspecialchars((string)$val) . "', is_numeric: " . ($numeric ? 'да' : 'нет') . ", (int): {$int}
";
}
Значение: '123', is_numeric: да, (int): 123
Значение: '123', is_numeric: да, (int): 123
Значение: '123abc', is_numeric: нет, (int): 123
Значение: 'abc123', is_numeric: нет, (int): 0
Значение: '0123', is_numeric: да, (int): 123
Использование в условных операциях
Пример php
function processValue($val) {
// Проверка на числовое значение и приведение к float для расчетов
$num = is_numeric($val) ? (float)$val : null;
if ($num !== null) {
return $num * 2;
}
return 'Невозможно выполнить операцию';
}

echo processValue('10.5') . '
'; // 21
echo processValue('0xff') . '
'; // Невозможно выполнить операцию
echo processValue('5e1') . '
'; // 100
21
Невозможно выполнить операцию
100
Аналоги функции в других языках

Is numeric в Python

# Использование isinstance и проверки строки
def is_numeric_py(value):
try:
float(value)
return True
except (ValueError, TypeError):
return False

print(is_numeric_py('42'))
print(is_numeric_py('3.14'))
print(is_numeric_py('abc'))
True
True
False

Is numeric в Javascript

// Функция isNaN и преобразование Number
function isNumericJS(value) {
return !isNaN(parseFloat(value)) && isFinite(value);
}

console.log(isNumericJS('42'));
console.log(isNumericJS('3.14'));
console.log(isNumericJS('abc'));
true
true
false

Is numeric в MySQL

-- Оператор REGEXP для проверки строк
SELECT '123' REGEXP '^[0-9]+$' AS is_integer,
'12.34' REGEXP '^[0-9]*\.[0-9]+$' AS is_float;
is_integer: 1
is_float: 1

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

PHP is_numeric function comments

En
Is numeric Finds whether a variable is a number or a numeric string