Как преобразовать строку в число в PHP: пошаговое руководство

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

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

Начать курс

Введение: почему строки не хотят складываться?

Каждый разработчик, который хоть раз писал на PHP, сталкивался с ситуацией, когда вместо ожидаемого числа получается странный результат. Вы пытаетесь сложить две переменные, полученные из формы или базы данных, а PHP выдаёт что-то вроде 1520 вместо 35. Знакомо? Это классическая проблема: преобразование строки в число в PHP.

PHP — язык с динамической типизацией. Это одновременно и благословение, и проклятие. С одной стороны, он пытается угадать, что вы имели в виду, и автоматически конвертирует типы. С другой — такие "угадайки" часто приводят к трудноуловимым багам. Сегодня мы разберём все способы преобразования строки в число в PHP — от простого до продвинутого — и научимся делать это правильно.

Короткий ответ: 4 способа за 30 секунд

Если вам нужно быстрое решение — вот шпаргалка. Но не спешите закрывать статью: каждый метод имеет свои особенности и подводные камни.

<?php
// Способ 1: Явное приведение типа
$number = (int) "42";          // int(42)
$float  = (float) "3.14";     // float(3.14)

// Способ 2: Функция intval()
$number = intval("42");       // int(42)

// Способ 3: Функция floatval() / doubleval()
$float  = floatval("3.14");   // float(3.14)

// Способ 4: С помощью settype()
$str = "42";
settype($str, "integer");     // теперь $str = int(42)
?>

Все четыре метода рабочие, но ведут они себя по-разному в пограничных ситуациях. Давайте разберём каждый подробно.

1. Явное приведение типов: (int) и (float)

Самый быстрый и очевидный способ преобразовать строку в число в PHP — использовать операторы приведения типов. Они работают как "принудительное переключение" типа переменной.

Примеры с (int)

<?php
echo (int) "42";           // 42
echo (int) "3.99";         // 3 (дробная часть отбрасывается!)
echo (int) "42 яблока";    // 42 (число в начале)
echo (int) "яблоко 42";    // 0 (не может распознать число)
echo (int) "";             // 0
echo (int) null;           // 0
?>

Важно: PHP пытается найти число в начале строки. Если строка начинается с букв, результатом будет 0. Это поведение часто становится причиной ошибок, особенно при работе с пользовательским вводом.

Примеры с (float)

<?php
echo (float) "3.14";       // 3.14
echo (float) "3,14";       // 3.0 (запятая не работает!)
echo (float) "2.99 евро";  // 2.99
echo (float) "абв";        // 0
?>

Лайфхак: Помните, что PHP использует точку как десятичный разделитель. Если пользователи вводят числа с запятой (как принято в России), нужно сначала заменить запятую на точку с помощью str_replace(',', '.', $str).

2. Функции intval() и floatval()

Эти функции — более "интеллектуальная" версия явного приведения. Они делают то же самое, но позволяют задать систему счисления для intval().

<?php
// intval() — преобразование в целое число
echo intval("42");            // 42
echo intval("1010", 2);       // 10 (двоичная система!)
echo intval("FF", 16);        // 255 (шестнадцатеричная)
echo intval("42.99");         // 42 (дробная часть отбрасывается)

// floatval() — преобразование в число с плавающей точкой
echo floatval("3.14");        // 3.14
echo floatval("2.71828");     // 2.71828
?>

Когда использовать: intval() незаменим, если вы работаете с числами в разных системах счисления (например, парсите HEX-коды цветов). Для обычных чисел разницы с (int) практически нет.

3. Функция settype(): преобразование на месте

В отличие от предыдущих методов, settype() не возвращает новое значение, а изменяет тип исходной переменной. Это может быть удобно, но требует осторожности.

<?php
$price = "19.99";
settype($price, "float");
echo $price;  // 19.99 (теперь это float)

$count = "5";
settype($count, "integer");
echo $count;  // 5 (теперь это int)
?>

Подводный камень: Функция возвращает true при успехе или false при неудаче. Если преобразование невозможно (например, строка "abc" в число), то переменная останется строкой, а settype() вернёт false. Всегда проверяйте результат!

<?php
$str = "не число";
if (settype($str, "integer")) {
    echo "Успех: $str";
} else {
    echo "Не удалось преобразовать";
}
?>

4. Неявное преобразование: PHP делает это за вас

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

<?php
$result = "10" + "20";        // 30 (строки стали числами)
$result = "10" . "20";        // "1020" (конкатенация!)
$result = "10 яблок" + 5;     // 15 (число из начала строки)
$result = "яблоко" + 5;       // 5 (строка стала 0)
?>

Золотое правило: Никогда не полагайтесь на неявное преобразование в критических местах. Всегда используйте явное приведение типов или функции, чтобы ваш код был предсказуемым.

5. Безопасное преобразование: проверяем и валидируем

Самая большая проблема с преобразованием строки в число — это невалидные данные. Если пользователь ввёл буквы вместо цифр, все методы выше вернут 0 или 0.0. А это может быть валидным числом! Как отличить настоящий ноль от ошибочного?

Используем is_numeric()

<?php
function safeToInt($str) {
    if (is_numeric($str)) {
        return (int) $str;
    }
    return null; // или выбросить исключение
}

echo safeToInt("42");       // 42
echo safeToInt("abc");      // null
echo safeToInt("");         // null
?>

Фильтрация с filter_var()

Блоги

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