Avatar ·

Как преобразовать строку в число в PHP? Все способы с примерами

Всем привет! Я только начал изучать PHP, и у меня возникла проблема. Я пишу простой скрипт, который складывает два числа, полученных из формы. Но вместо сложения у меня происходит конкатенация строк. Вот упрощённый пример: ```php ``` На самом деле, если я пишу `$sum = "10" + "20";` — это работает и выдаёт 30. Но когда я пробую с настоящими данными из формы, числа не складываются, а просто склеиваются: "1020". Я читал, что PHP сам преобразует типы, но почему тогда происходит конкатенация? Я пробовал ставить `(int)` перед переменными, но это не помогло. Мне нужно надёжное решение, которое будет работать с целыми числами, числами с плавающей точкой и строками, которые могут содержать пробелы или лишние символы. Как правильно и безопасно преобразовать строку в число в 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 и т.д.).