Конвертация в числа

validator.js содержит набор функций, ориентированных на проверку и нормализацию строковых значений, которые часто приходят из форм, HTTP-запросов и внешних API. Работа с числами в этой библиотеке строится вокруг идеи, что вход почти всегда является строкой, а преобразование в числовой тип должно быть предсказуемым и контролируемым.

В JavaScript исходные данные для валидации чаще всего представлены строками. Это связано с тем, что протоколы передачи данных (HTTP, JSON, form-data) не сохраняют строгую типизацию. Поэтому числовые преобразования в validator.js реализованы как отдельный слой, отделённый от проверки формата.

Основные задачи:

  • приведение строк к числовым типам;
  • проверка корректности числового представления;
  • исключение неявных преобразований JavaScript;
  • контроль диапазонов и форматов.

Внутри библиотеки преобразование не происходит автоматически при валидации: функции проверки и функции преобразования разделены.

Проверка числового формата и преобразование

Функции, связанные с числами, делятся на две категории:

  • проверяющие: isInt, isFloat, isNumeric
  • преобразующие: toInt, toFloat

Такое разделение исключает ситуацию, при которой строка неожиданно становится числом без явного намерения.

isNumeric и его ограничения

Функция isNumeric предназначена для проверки того, что строка может быть интерпретирована как число. Однако она не выполняет преобразование и не гарантирует строгую типизацию.

Особенности:

  • допускает строки с ведущими нулями;
  • может учитывать экспоненциальную форму записи;
  • не всегда эквивалентна строгой проверке Number.isFinite.

Пример логики:

  • "123" → допустимо
  • "12.3" → допустимо
  • "12e3" → допустимо
  • "abc" → недопустимо

При этом результатом всегда остаётся строка, а не число.

Преобразование через toInt

Функция toInt используется для явного приведения строки к целому числу.

Поведение зависит от параметров:

  • строка анализируется слева направо;
  • дробная часть отбрасывается;
  • при наличии некорректных символов возможна остановка парсинга.

Особенности реализации:

  • используется поведение, аналогичное parseInt, но с более предсказуемой обработкой входных данных;
  • поддерживается указание основания системы счисления (radix);
  • при отсутствии radix поведение может зависеть от контекста вызова.

Типичные преобразования:

  • "42"42
  • "42.9"42
  • " 42abc"42
  • "abc42"NaN

Радикс и системы счисления

Одним из ключевых аспектов является параметр radix — основание системы счисления.

Поддерживаемые варианты:

  • 10 — десятичная система (основная);
  • 2 — двоичная;
  • 8 — восьмеричная;
  • 16 — шестнадцатеричная.

Пример логики:

  • строка "11" при radix 2 → 3
  • строка "ff" при radix 16 → 255

Игнорирование radix может приводить к неоднозначному поведению, особенно при строках с ведущими нулями.

Преобразование через toFloat

Функция toFloat применяется для преобразования значений с плавающей точкой.

Особенности:

  • сохраняет дробную часть;
  • поддерживает научную нотацию;
  • игнорирует завершающие некорректные символы при частичном парсинге.

Примеры поведения:

  • "12.34"12.34
  • "12.34abc"12.34
  • "1e3"1000
  • "abc"NaN

В отличие от toInt, дробная часть не отбрасывается, а сохраняется в соответствии с IEEE 754 представлением чисел JavaScript.

Различие между проверкой и преобразованием

Ключевой принцип архитектуры validator.js заключается в разделении:

  • проверка отвечает на вопрос «является ли строка корректным числом»;
  • преобразование отвечает на вопрос «во что строка может быть интерпретирована».

Это предотвращает ситуации, при которых:

  • строка проходит проверку, но неожиданно преобразуется;
  • или наоборот — преобразование даёт число из формально некорректного значения.

Обработка некорректных значений

При невозможности преобразования результатом становится NaN.

Типичные случаи:

  • пустая строка;
  • строка без числовых символов;
  • полностью нечисловой ввод;
  • смешанные строки без начального числа.

Особенность Jav * aScript: NaN не равен самому себе, поэтому для проверки результата требуется отдельная логика.

Ведущие и завершающие символы

Механизм преобразования ориентирован на последовательное чтение строки:

  • ведущие пробелы игнорируются;
  • числовая часть читается до первого некорректного символа;
  • остаток строки отбрасывается.

Это поведение отличается от строгих парсеров, которые требуют полного соответствия формату.

Проблемы неявного приведения типов

JavaScript допускает неявное преобразование:

  • "10" * 220
  • "10" + 2"102"

validator.js избегает таких сценариев, требуя явного вызова toInt или toFloat. Это снижает риск ошибок при обработке пользовательского ввода.

Особенности работы с пустыми значениями

Пустая строка представляет отдельный случай:

  • ""NaN при преобразовании;
  • пробелы " " также считаются невалидными после тримминга.

Это поведение важно для форм, где отсутствие значения не должно интерпретироваться как ноль.

Граничные значения чисел

Преобразование учитывает ограничения Jav * aScript:

  • Number.MAX_SAFE_INTEGER;
  • Number.MIN_SAFE_INTEGER.

При выходе за пределы безопасной точности возможны:

  • округление;
  • потеря точности;
  • представление в экспоненциальной форме.

Сравнение строкового и числового представления

После преобразования важно учитывать, что:

  • исходная строка может не совпадать с числом;
  • форматирование теряется (например, ведущие нули);
  • дробные значения могут изменяться из-за особенностей IEEE 754.

Пример:

  • "0012"12
  • "12.3400"12.34

Контекст использования валидации чисел

Числовая конвертация в validator.js применяется в сценариях:

  • обработка форм регистрации и платежей;
  • API-параметры;
  • URL query string;
  • конфигурационные файлы.

Основная цель — отделить проверку входа от бизнес-логики приложения, обеспечивая предсказуемость результата преобразования.