Введение: почему строки и числа в 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()— проверяет, состоит ли