Как преобразовать строку в число в PHP: 5 рабочих способов

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: почему строки и числа в PHP — это вечная драма

Представьте: вы пишете калькулятор доставки, а пользователь вводит количество товаров строкой "5". Вы пытаетесь прибавить 10 — и получаете "510" вместо 15. Знакомо? Добро пожаловать в мир конвертации типов в PHP!

Вопрос "How do I convert a string to a number in PHP?" — один из самых популярных на Stack Overflow (более 2 миллионов просмотров). И не зря: PHP известен своей неявной типизацией, которая одновременно и упрощает жизнь, и создаёт ловушки.

В этом руководстве мы разберём 5 надёжных способов преобразования строки в число, развенчаем мифы и научимся избегать багов. Поехали!

Теория: что происходит под капотом PHP?

PHP — язык с динамической типизацией. Переменная может быть строкой, а через секунду — числом. Но есть нюанс:

  • Неявное приведение типов — PHP сам решает, как трактовать данные (и часто ошибается).
  • Явное приведение типов — вы берёте контроль в свои руки.

Когда вы пишете "5" + 10, PHP автоматически преобразует строку "5" в число. Но попробуйте "5 яблок" + 10 — и получите 15 (PHP молча отбросит " яблок"). А "яблоки 5" + 10 даст 10 (строка считается нулём). Хаос? Да. Но мы наведём порядок.

Способ 1: Оператор приведения типа (int) и (float)

Самый быстрый и простой способ — использовать кастование:

<?php
$string = "42.8";
$int = (int)$string;      // 42 (целая часть)
$float = (float)$string;  // 42.8

echo $int;   // 42
echo $float; // 42.8
?>

Важно: (int) отбрасывает дробную часть без округления. Для округления используйте round() после преобразования.

Когда использовать: когда вы уверены, что строка содержит только число, и вам нужно быстрое приведение.

Способ 2: Функции intval() и floatval()

Это «старшие братья» кастования — более читаемые и гибкие:

<?php
$string = "123.45abc";

$int = intval($string);     // 123
$float = floatval($string); // 123.45

// С указанием системы счисления (только для intval)
$hexString = "1A";
$hexInt = intval($hexString, 16); // 26 (преобразует шестнадцатеричную строку)

echo $int;    // 123
echo $float;  // 123.45
echo $hexInt; // 26
?>

Фишка: intval() умеет работать с разными системами счисления (двоичной, восьмеричной, шестнадцатеричной). floatval() — только с десятичной.

Когда использовать: когда нужна обработка «мусора» в конце строки или работа с нестандартными системами счисления.

Способ 3: Функция settype() — преобразование с возвратом true/false

Хотите не только конвертировать, но и проверить успешность операции? Используйте settype():

<?php
$string = "99.9";
$result = settype($string, "float"); // true

echo $string; // 99.9 (теперь это float)
echo $result; // 1 (true)

// Если строка нечисловая
$badString = "hello";
$result = settype($badString, "integer"); // false

echo $badString; // 0 (преобразовано в ноль)
echo $result;    // (пусто, false)
?>

Важно: settype() изменяет саму переменную, а не возвращает новое значение. Удобно, когда нужно гарантировать, что тип изменился.

Когда использовать: когда требуется проверка успешности конвертации (например, в пользовательском вводе).

Способ 4: Арифметические трюки (и почему их лучше не использовать)

Да, можно написать $number = $string + 0 — PHP сам приведёт строку к числу. Или $number = $string * 1. Это работает, но:

<?php
$string = "7.5";
$number = $string + 0; // 7.5 (float)
$number2 = $string * 1; // 7.5 (float)

$badString = "7.5abc";
$number = $badString + 0; // 7.5 (PHP отбросит "abc")
?>

Почему это плохая практика? Код становится неочевидным. Другой разработчик (или вы через месяц) будет гадать: «Это опечатка или intentional?». Всегда лучше явно указывать намерение.

Вердикт: используйте только в крайнем случае, когда скорость написания кода критична (например, в однострочных скриптах).

Способ 5: Функция number_format() — для форматирования чисел

Это не совсем конвертация, но часто после преобразования строки в число нужно вывести его красиво. number_format() пригодится:

<?php
$string = "1234.5678";
$number = (float)$string;
$formatted = number_format($number, 2, '.', ' '); // 1 234.57

echo $formatted; // 1 234.57
?>

Параметры: число, количество знаков после запятой, разделитель дробной части, разделитель тысяч.

Когда использовать: для вывода цен, статистики, любых чисел «для людей».

Проверка перед конвертацией: is_numeric() и ctype_digit()

Прежде чем преобразовывать строку, хорошо бы убедиться, что она вообще содержит число. Иначе получите 0 или NAN (Not a Number).

<?php
$values = ["42", "3.14", "1e4", "abc", "123abc"];

foreach ($values as $value) {
    if (is_numeric($value)) {
        $number = (float)$value;
        echo "'$value' → $number\n";
    } else {
        echo "'$value' — не число, пропускаем\n";
    }
}
?>

Разница:

  • is_numeric() — проверяет, является ли строка числом (включая экспоненциальную запись 1e4).
  • ctype_digit() — проверяет, состоит ли

Блоги

Рекомендаций по книгам