
В JavaScript строки часто необходимо преобразовывать в числа для выполнения арифметических операций, валидации данных или работы с пользовательским вводом. Неправильное преобразование может привести к неожиданным результатам: «42px» превратится в NaN, а » 10 « – в валидное число. Поэтому важно понимать, какие методы использовать в зависимости от структуры строки и контекста применения.
Функция Number() подходит для большинства случаев, когда строка содержит только цифры и пробелы. Например, Number("15") вернёт 15, а Number(" 15 ") – тоже 15. Однако Number("15px") выдаст NaN, поскольку содержит недопустимые символы.
Функция parseInt() полезна, когда нужно извлечь целое число из строки, начинающейся с цифр. parseInt("100 рублей") вернёт 100. Она игнорирует символы после цифр, но не допускает пробелы до числа. Для работы с десятичными числами используют parseFloat(), которая возвращает число с плавающей точкой: parseFloat("3.14 метра") даёт 3.14.
Унарный оператор + – самый короткий способ преобразовать строку в число: +"8" превращается в 8. Этот метод работает быстро, но легко приводит к ошибкам при наличии нечисловых символов. +"12px" даст NaN, в отличие от parseInt("12px"), который вернёт 12.
Внимательное отношение к типу и содержимому строки – ключ к безопасному преобразованию. Перед использованием любого метода рекомендуется проверять данные с помощью isNaN() или Number.isFinite(), особенно при работе с пользовательским вводом.
Преобразование строки в целое число с помощью parseInt()

Функция parseInt() принимает строку и необязательный второй аргумент – систему счисления (radix). Без указания radix функция может работать некорректно: строка «010» может быть интерпретирована как восьмеричное число. Чтобы избежать неоднозначностей, всегда указывайте основание системы счисления, чаще всего 10.
Пример: parseInt("42", 10) вернёт 42. Если передать «42px», результатом также будет 42, поскольку parseInt() останавливается при первом нецифровом символе. Однако parseInt("px42", 10) вернёт NaN, так как строка не начинается с цифры.
При использовании parseInt() важно понимать, что дробные значения обрезаются: parseInt("3.14", 10) даст 3. Это поведение полезно, когда необходимо извлечь целое число из строки, но неприемлемо, если требуется точное числовое представление.
Нельзя полагаться на parseInt() для валидации ввода. Например, parseInt("123abc", 10) вернёт 123, что может быть неожиданно в некоторых сценариях. Для строгого преобразования используйте дополнительные проверки: Number.isInteger(parseInt(str, 10)).
Использование parseFloat() для преобразования строки с десятичной частью

Функция parseFloat() предназначена для извлечения числа с плавающей точкой из строки. Она возвращает число, начиная с первого символа, который можно интерпретировать как часть десятичного значения.
parseFloat("3.14")вернёт3.14parseFloat(" 2.71828")– пробелы в начале игнорируются, результат:2.71828parseFloat("6.02e23")– поддерживается экспоненциальная запись, вернёт6.02e+23parseFloat("123.45abc")– вернёт123.45, строка обрезается при первом недопустимом символеparseFloat("abc123.45")– вернётNaN, так как строка не начинается с числа
Для надёжного использования parseFloat():
- Проверяйте результат с помощью
isNaN(), чтобы отсеять некорректные значения. - Ограничивайте ввод пользователя, чтобы минимизировать риск непредсказуемого поведения.
- Не используйте
parseFloat()для строгой валидации: оно лояльно к лишним символам.
Важно: parseFloat() не подходит для точной финансовой арифметики из-за особенностей представления чисел с плавающей точкой. В таких случаях применяйте специализированные библиотеки, например, decimal.js.
Применение унарного плюса для быстрого преобразования
Унарный плюс (`+`) – самый короткий способ преобразовать строку в число в JavaScript. Он работает быстрее, чем `parseInt()` или `Number()`, поскольку не выполняет лишние проверки или парсинг по правилам формата.
Например, выражение +"42" немедленно возвращает число 42. При этом +"42px" даст NaN, так как вся строка должна быть числом. Это поведение делает унарный плюс особенно полезным, когда заранее известен формат строки.
Преобразование "+0.5" возвращает 0.5, "+-3" – -3, а пустая строка +"" – 0. Булевы строки, такие как "true", не конвертируются и дают NaN, поэтому применять унарный плюс следует только к строкам, гарантированно содержащим числовые значения.
Также унарный плюс полезен при приведении значений из полей форм: +input.value позволяет сразу работать с числом без промежуточных переменных и дополнительных вызовов.
Для повышения надежности рекомендуется комбинировать унарный плюс с проверкой через isNaN() или Number.isFinite(), если исходная строка может быть нечисловой.
Различия между Number() и parseInt() при работе со строками
Number() преобразует всю строку в число, учитывая десятичные дроби, знак и пробелы по краям. Если строка содержит недопустимые символы (например, буквы внутри числа), результатом будет NaN.
parseInt() анализирует строку посимвольно слева направо и преобразует до первого недопустимого символа. Например, parseInt(«123abc») вернёт 123, тогда как Number(«123abc») – NaN.
Функция parseInt() принимает второй аргумент – систему счисления. Без него строка, начинающаяся с 0x, интерпретируется как шестнадцатеричное число, а с 0 – как восьмеричное (в старых реализациях). Всегда указывайте основание: parseInt(«08», 10) исключает ошибки.
Number() всегда работает в десятичной системе и интерпретирует 0x1A корректно как 26, но «08» или «09» – как 8 и 9 соответственно, без неожиданного поведения.
Для надёжного преобразования целых чисел из строк, содержащих посторонние символы, используйте parseInt() с указанием основания. Для точного анализа числовых значений с плавающей точкой или строго типизированного преобразования – Number().
Обработка строк с нечисловыми символами

Если строка содержит нечисловые символы, попытка преобразования с помощью Number() или унарного плюса (+) приведёт к NaN. Например, Number("123abc") вернёт NaN, так как в строке присутствуют недопустимые символы.
Чтобы извлечь число из строки, содержащей лишние символы, используйте регулярные выражения. Пример:
const str = "Цена: 4500 руб.";
const match = str.match(/\d+(\.\d+)?/);
const num = match ? parseFloat(match[0]) : NaN;
Функция parseInt() способна игнорировать нечисловые символы после цифр. Например, parseInt("150px") вернёт 150. Однако она не подходит для извлечения десятичных значений:
parseInt("3.14м") // 3
parseFloat("3.14м") // 3.14
Если требуется обработка отрицательных чисел или чисел с плавающей точкой, используйте parseFloat() в паре с предварительной фильтрацией строки:
const input = "≈−12.7°C";
const cleaned = input.replace(/[^\d\.\-]+/g, "");
const result = parseFloat(cleaned);
Для строгой валидации перед преобразованием используйте регулярные выражения:
const value = "123abc";
if (/^-?\d+(\.\d+)?$/.test(value)) {
const num = Number(value);
} else {
// недопустимая строка
}
Не используйте parseInt() для строк с префиксом 0, так как могут возникнуть ошибки из-за восьмеричной интерпретации в старых реализациях:
parseInt("010") // может вернуть 8 или 10, в зависимости от среды
Рекомендуется всегда явно указывать основание системы счисления:
parseInt("010", 10) // 10
Как избежать NaN при преобразовании строки в число
- Проверяйте строку на пустоту:
if (str.trim() === "")– пустая строка не может быть корректно преобразована. - Исключайте недопустимые символы: допустимы только цифры, один десятичный разделитель и, при необходимости, знак
+или-в начале. - Для преобразования используйте
Number()илиparseFloat()/parseInt(), но учитывайте их поведение:Number("123abc")вернётNaN,parseInt("123abc")вернёт123.
- Для проверки результата используйте
Number.isNaN()вместо глобальногоisNaN(), чтобы исключить ложноположительные значения:Number.isNaN(Number("abc"))вернётtrue,isNaN("abc")тоже вернётtrue, ноisNaN("123")–false, даже если значение не преобразовано.
- Используйте регулярные выражения для валидации:
/^-?\d+(\.\d+)?$/проверяет, является ли строка корректным числом.
- Валидация строки перед преобразованием.
- Явное использование
Number()для целостных чисел иparseFloat()– для десятичных. - Проверка результата с
Number.isNaN().
Избежать NaN можно только при строгом контроле входных данных и выборе подходящего метода преобразования с проверкой результата.
Преобразование строки, полученной из формы, в число

При получении значения из текстового поля формы с помощью document.querySelector или document.getElementById, результат всегда будет строкой, даже если пользователь ввёл число. Например:
const value = document.getElementById('input').value;
Чтобы использовать это значение в арифметических операциях, необходимо явно преобразовать его в число. Простой и безопасный способ – использовать Number():
const number = Number(value);
Если поле может быть пустым или содержать нечисловой ввод, стоит проверить результат:
if (!isNaN(number)) { /* использовать число */ }
Для преобразования целых чисел предпочтительнее parseInt() с указанием основания системы счисления:
const intValue = parseInt(value, 10);
Для чисел с плавающей точкой используйте parseFloat():
const floatValue = parseFloat(value);
Перед преобразованием желательно удалять лишние пробелы:
const trimmed = value.trim();
Комбинируя trim() и Number(), можно избежать большинства ошибок, связанных с неявным приведением типов:
const result = Number(value.trim());
