W3docs

is_numeric()

Функция is_numeric() в PHP проверяет, является ли переменная числом или числовой строкой, и возвращает boolean.

Введение

is_numeric() — встроенная PHP-функция, которая проверяет, является ли значение числом или числовой строкой. Последнее — главная причина её существования: PHP часто получает числа в виде строк из полей форм, параметров запроса, JSON, CSV-файлов — и вам нужен надёжный способ спросить «можно ли это трактовать как число?» перед выполнением арифметических операций. is_numeric() отвечает именно на этот вопрос и возвращает boolean.

На этой странице рассмотрены синтаксис, что считается числовым (и что неожиданно таковым не является), отличие от is_int() и is_float(), а также практический паттерн валидации входных данных.

Синтаксис

is_numeric(mixed $value): bool

Функция принимает один аргумент $value и возвращает true, если $value является числом или числовой строкой, и false в противном случае. Она никогда не выбрасывает исключений и не изменяет свой аргумент.

Базовый пример

php— editable, runs on the server

$var1 — строка "42", $var2 — float 3.14, $var3 — строка "hello". Первые два являются числовыми, поэтому is_numeric() возвращает true; третье — нет.

Совет: Используйте var_dump() вместо echo при тестировании boolean-значений. echo выводит true как "1", а false как пустую строку — это легко неправильно интерпретировать. var_dump() выводит bool(true) / bool(false), поэтому результат однозначен.

Что считается числовым

Строка является числовой, если она представляет корректное целое число или число с плавающей точкой в десятичной или научной нотации. Это включает ведущий знак, ведущую или завершающую десятичную точку, окружающие пробелы и показатели степени:

<?php
var_dump(is_numeric("1e3"));    // bool(true)  — scientific notation (1000)
var_dump(is_numeric("+42"));    // bool(true)  — leading sign
var_dump(is_numeric("-0.5"));   // bool(true)  — negative float
var_dump(is_numeric(".5"));     // bool(true)  — leading decimal point
var_dump(is_numeric("  42"));   // bool(true)  — leading whitespace

var_dump(is_numeric("0x1A"));   // bool(false) — hex strings are NOT numeric (since PHP 7)
var_dump(is_numeric("0b101"));  // bool(false) — binary strings are not numeric
var_dump(is_numeric(""));       // bool(false) — empty string
var_dump(is_numeric("42px"));   // bool(false) — trailing non-numeric characters
?>

Типичные подводные камни:

  • Шестнадцатеричные и двоичные строки возвращают false. "0x1A" считалось числовым до PHP 7, но теперь нет. Числовые литералы, записанные в коде (например, 0x1A), уже являются настоящими целыми числами, поэтому is_numeric() видит обычный int и возвращает true.
  • Завершающая единица измерения делает всю строку нечисловой. "42px" — это false. Если нужно извлечь число из такой строки, используйте вместо этого приведение (int) или filter_var().
  • Ведущие/завершающие пробелы допустимы (завершающие пробелы стали допускаться в PHP 8.0).

is_numeric() против is_int() и is_float()

Эти три функции легко перепутать. Разница в том, важен ли тип или только значение:

<?php
$value = "10";          // a string that looks like a number

var_dump(is_numeric($value)); // bool(true)  — value can be a number
var_dump(is_int($value));     // bool(false) — type is string, not int
var_dump(is_float($value));   // bool(false) — type is string, not float
?>
  • is_numeric() учитывает значение: «может ли это быть числом?» Она принимает числовые строки.
  • is_int() и is_float() учитывают объявленный тип: они возвращают true только для настоящего int или float, но никогда для строки.

Используйте is_numeric() при валидации входных данных, которые приходят в виде текста; используйте is_int() / is_float(), когда вам действительно нужно знать тип переменной.

Практическое применение: валидация входных данных перед математикой

Типичная задача is_numeric() в реальных проектах — защита арифметических операций над недоверенными входными данными, чтобы избежать TypeError или неявных нулей:

<?php
$inputs = ["100", "12.5", "5e2", "abc", "12px", ""];

foreach ($inputs as $in) {
    if (is_numeric($in)) {
        echo "$in is numeric -> " . ($in + 0) . "\n";
    } else {
        echo "$in is NOT numeric\n";
    }
}
// 100 is numeric -> 100
// 12.5 is numeric -> 12.5
// 5e2 is numeric -> 500
// abc is NOT numeric
// 12px is NOT numeric
//  is NOT numeric
?>

Добавление + 0 (или приведение через (int) / (float)) преобразует проверенную строку в настоящее число, как только вы убедились, что это безопасно. Для более строгой валидации — например, чтобы принимать только целые числа или применять диапазон — комбинируйте это с filter_var() и фильтрами FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT.

Заключение

is_numeric() надёжно определяет, можно ли значение — включая строку — трактовать как число, что делает её правильным защитником перед выполнением арифметики над данными из форм, URL или файлов. Помните, что она возвращает false для шестнадцатеричных/двоичных строк и для любой строки с нечисловыми завершающими символами, а также что она проверяет значение, а не тип — используйте is_int() или is_float(), когда важен объявленный тип. Смотрите также gettype() и PHP Data Types для более широкого контекста.

Практика

Практика
Что делает функция is_numeric в PHP?
Что делает функция is_numeric в PHP?
Was this page helpful?