Как преобразовать строку в число в PHP? Все способы и подводные камни
Основные способы преобразования строки в число в PHP
В PHP есть несколько способов преобразовать строку в число. Выбор зависит от того, какой тип числа вам нужен (целое или с плавающей точкой) и как вы хотите обрабатывать некорректный ввод.
1. Явное приведение типов (cast)
Самый простой и быстрый способ:
// В целое число
$int = (int) "1500"; // 1500
$int = (int) "1999.99"; // 1999 (дробная часть отбрасывается)
$int = (int) "abc"; // 0 (нечисловая строка даёт 0)
// В число с плавающей точкой
$float = (float) "1999.99"; // 1999.99
$float = (float) "1500"; // 1500.0
2. Функции intval() и floatval()
Эквивалентны приведению типов, но позволяют указать систему счисления для целых чисел:
$int = intval("1500"); // 1500
$int = intval("FF", 16); // 255 (шестнадцатеричная строка)
$float = floatval("1999.99"); // 1999.99
3. Функция settype()
Изменяет тип переменной напрямую:
$str = "1500";
settype($str, "integer"); // $str теперь 1500
Важные нюансы и подводные камни
- Пробелы и мусор: PHP игнорирует начальные пробелы, но если после числа есть буквы, они отбрасываются. "1500abc" станет 1500.
- Запятые: Строка "1,500" преобразуется в 1, потому что запятая не является частью числа. Используйте
str_replace(',', '', $str)перед преобразованием. - Нулевое значение: Если строка не начинается с числа, результат будет 0. Это может быть опасно — вы не узнаете, что ввод был некорректным.
- Неявное преобразование: PHP автоматически конвертирует строки в числа в математических операциях.
"1500" + "3"даст 1503, но"1500abc" + "3"даст 1503 (первая строка станет 1500).
Рекомендуемый безопасный подход
Для пользовательского ввода используйте проверку с is_numeric() или фильтрацию:
$input = $_POST['price'];
// Вариант 1: проверка is_numeric
if (is_numeric($input)) {
$price = (float) $input;
} else {
// Обработка ошибки: вывести сообщение пользователю
echo "Пожалуйста, введите корректное число";
}
// Вариант 2: фильтр с очисткой (рекомендуется)
$price = filter_var($input, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
if ($price !== false) {
$price = (float) $price;
} else {
// Ошибка
}
// Вариант 3: для валют с запятыми
$cleaned = str_replace(',', '.', str_replace(' ', '', $input));
if (is_numeric($cleaned)) {
$price = (float) $cleaned;
}
Сравнение производительности
Приведение типов (int) и (float) — самые быстрые. intval() и floatval() немного медленнее. Для большинства задач разница незаметна, но в циклах с миллионами операций используйте приведение.
Итог
Используйте (float) для чисел с плавающей точкой и (int) для целых, но всегда проверяйте ввод на корректность через is_numeric() или filter_var(). Не полагайтесь на неявное преобразование — оно может привести к трудноуловимым ошибкам.
Альтернативный подход: использование filter_var() для безопасного преобразования
В PHP есть встроенная функция filter_var(), которая не только преобразует строку в число, но и проверяет валидность ввода. Это особенно полезно для пользовательских данных из форм, API или файлов.
// Целое число с проверкой
$int = filter_var("1500", FILTER_VALIDATE_INT);
if ($int === false) {
echo "Некорректное целое число";
} else {
echo $int; // 1500
}
// Число с плавающей точкой
$float = filter_var("1999.99", FILTER_VALIDATE_FLOAT);
if ($float === false) {
echo "Некорректное число";
} else {
echo $float; // 1999.99
}
// Обработка отрицательных чисел и пробелов
$price = filter_var(" -1500.50 ", FILTER_VALIDATE_FLOAT);
// Вернёт -1500.5 (пробелы игнорируются)
Почему это лучше?
- Безопасность:
filter_var()возвращаетfalseдля нечисловых строк, а не 0. Вы точно знаете, что ввод был некорректным. - Гибкость: Можно добавить опции, например
FILTER_FLAG_ALLOW_THOUSANDдля чисел с разделителями тысяч. - Чистота кода: Одна функция заменяет связку
is_numeric()+(float).
Пример для формы с ценой
$price = filter_var($_POST['price'], FILTER_VALIDATE_FLOAT);
if ($price === false) {
$error = "Введите корректную цену (например, 1500.50)";
} else {
$total = $price * 3; // Безопасное умножение
}
Этот подход особенно рекомендую для новичков — он предотвращает большинство ошибок, связанных с неявным приведением типов.