Как преобразовать строку в число в PHP? Все способы с примерами
Полное руководство по преобразованию строк в числа в PHP
Ваша проблема типична для новичков. Давайте разберёмся, почему происходит конкатенация и как это исправить.
Почему возникает конкатенация?
В вашем коде $num1 + $num2 с данными из $_POST может вести себя неожиданно, если строки содержат пробелы, символы или если вы случайно используете оператор . (конкатенация) вместо +. Но главная причина — PHP не всегда может автоматически преобразовать строку в число, если строка не начинается с цифры.
Способы преобразования строки в число
1. Явное приведение типов (casting)
<?php
$str = "123";
$num = (int) $str; // 123
$float = (float) "45.67"; // 45.67
// С пробелами в начале/конце
$str2 = " 42 ";
$num2 = (int) $str2; // 42 (пробелы игнорируются)
// С буквами в начале — получите 0
$str3 = "abc123";
$num3 = (int) $str3; // 0
?>
2. Функции intval() и floatval()
<?php
$str = "42.7";
$int = intval($str); // 42 (отбрасывает дробную часть)
$float = floatval($str); // 42.7
// Можно указать основание системы счисления
$hex = "1A";
$decimal = intval($hex, 16); // 26
?>
3. Функция number_format() — для форматирования чисел
<?php
$str = "1234.5678";
$num = (float) $str; // 1234.5678
$formatted = number_format($num, 2, '.', ''); // "1234.57" (строка)
?>
4. Проверка is_numeric() перед преобразованием
<?php
$input = " 99.5 ";
if (is_numeric(trim($input))) {
$number = (float) trim($input);
echo "Число: $number"; // 99.5
} else {
echo "Не число";
}
?>
Правильное решение для вашей задачи
<?php
// Получаем данные из формы
$rawNum1 = $_POST['number1'] ?? '';
$rawNum2 = $_POST['number2'] ?? '';
// Очищаем от пробелов
$num1 = trim($rawNum1);
$num2 = trim($rawNum2);
// Проверяем, что это числа
if (is_numeric($num1) && is_numeric($num2)) {
// Преобразуем в float (поддерживает и целые, и дробные)
$float1 = (float) $num1;
$float2 = (float) $num2;
$sum = $float1 + $float2;
echo "Сумма: " . $sum;
} else {
echo "Ошибка: введите корректные числа";
}
?>
Важные нюансы
- Автоматическое преобразование: PHP пытается преобразовать строку в число при арифметических операциях. Если строка начинается с цифры — берётся число до первого нецифрового символа (например, "123abc" → 123). Если строка не начинается с цифры — результат 0.
- Пробелы и символы:
(int)иintval()игнорируют пробелы, но не игнорируют буквы в начале строки. - Большие числа: Для чисел больше PHP_INT_MAX используйте
(float)или библиотеки для работы с большими числами (BCMath). - Локализация: Если числа приходят с запятой как десятичным разделителем (например, "1,5"), используйте
str_replace(',', '.', $str)перед преобразованием.
Рекомендация: Для безопасного преобразования всегда используйте is_numeric() + trim() + явное приведение типа. Это защитит от неожиданных значений и ошибок.
Альтернативный подход: фильтрация данных через filter_var()
В PHP есть встроенные функции фильтрации, которые могут быть удобнее ручного преобразования:
<?php
$rawInput = $_POST['number1'] ?? '';
// Фильтр для целых чисел
$int = filter_var($rawInput, FILTER_VALIDATE_INT);
if ($int !== false) {
echo "Целое число: $int";
} else {
echo "Не является целым числом";
}
// Фильтр для чисел с плавающей точкой
$float = filter_var($rawInput, FILTER_VALIDATE_FLOAT);
if ($float !== false) {
echo "Float: $float";
}
?>
Плюсы этого метода:
- Автоматически проверяет, является ли строка корректным числом
- Возвращает
falseпри неудаче (нужно строгое сравнение!==) - Поддерживает настройки (например, диапазон чисел через
FILTER_FLAG_ALLOW_THOUSAND) - Не требует ручного
trim()— фильтр сам игнорирует пробелы
Пример для вашей задачи:
<?php
$num1 = filter_var($_POST['number1'] ?? '', FILTER_VALIDATE_FLOAT);
$num2 = filter_var($_POST['number2'] ?? '', FILTER_VALIDATE_FLOAT);
if ($num1 !== false && $num2 !== false) {
$sum = $num1 + $num2;
echo "Сумма: $sum";
} else {
echo "Введите корректные числа";
}
?>
Этот подход считается более безопасным и читаемым, особенно при работе с пользовательским вводом. Фильтры также можно комбинировать с другими валидациями (URL, email и т.д.).
Ответов пока нет.
Войдите чтобы оставить ответ