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

Десятичные числа в JavaScript и в веб-приложениях в целом представлены строковым или числовым значением с плавающей точкой, содержащим разделитель дробной части. При обработке пользовательского ввода основной проблемой становится неоднозначность формата: допустимость ведущих нулей, наличие знака, использование точки или запятой, ограничение количества знаков после разделителя.

Библиотека validator.js предоставляет набор инструментов для строгой проверки строковых значений, включая специализированную функцию проверки десятичных чисел.


Проверка десятичного числа с помощью isDecimal

Основной метод для работы с десятичными значениями — isDecimal.

const validator = require('validator');

validator.isDecimal('123.45');

Метод возвращает:

  • true — если строка соответствует формату десятичного числа
  • false — если формат нарушен

Базовая проверка ориентирована на строковое представление числа и не выполняет приведение типов.


Базовые правила валидации

По умолчанию isDecimal допускает:

  • положительные числа
  • числа с дробной частью
  • отсутствие знака

Примеры:

validator.isDecimal('10');      // true
validator.isDecimal('10.5');    // true
validator.isDecimal('0.123');   // true

Примеры, которые не проходят проверку:

validator.isDecimal('10,5');    // false
validator.isDecimal('10.');     // false
validator.isDecimal('.5');      // false
validator.isDecimal('abc');     // false

Параметры конфигурации isDecimal

Функция поддерживает объект настроек, позволяющий адаптировать поведение под различные сценарии обработки данных.

decimal_digits

Определяет допустимое количество знаков после разделителя.

validator.isDecimal('12.345', { decimal_digits: '1,3' });

Форматы задания:

  • "1" — строго 1 знак после точки
  • "1,3" — диапазон от 1 до 3 знаков
  • "*" — любое количество знаков

Примеры:

validator.isDecimal('12.3', { decimal_digits: '2,4' });    // false
validator.isDecimal('12.34', { decimal_digits: '2,4' });   // true
validator.isDecimal('12.3456', { decimal_digits: '2,4' }); // true

force_decimal

Определяет обязательность наличия дробной части.

validator.isDecimal('10', { force_decimal: true });

Поведение:

  • true — обязательное наличие дробной части
  • false или отсутствие — дробная часть необязательна

Примеры:

validator.isDecimal('10', { force_decimal: true });   // false
validator.isDecimal('10.0', { force_decimal: true }); // true

locale

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

validator.isDecimal('10,5', { locale: 'de-DE' });

Примеры локалей:

  • en-US — точка как разделитель дробной части
  • de-DE — запятая как разделитель

Примеры:

validator.isDecimal('10.5', { locale: 'en-US' }); // true
validator.isDecimal('10,5', { locale: 'en-US' }); // false

validator.isDecimal('10,5', { locale: 'de-DE' }); // true

Ограничения и особенности формата

При работе с десятичными числами важно учитывать, что проверка ориентирована исключительно на строковое представление. Это означает:

  • числа с экспоненциальной записью не рассматриваются как десятичные
  • пробелы внутри строки недопустимы
  • ведущий знак минус по умолчанию не входит в допустимый формат

Примеры:

validator.isDecimal('-10.5');   // false
validator.isDecimal('1e5');     // false
validator.isDecimal(' 10.5 ');  // false

Отличие isDecimal от isFloat

В библиотеке присутствует также метод isFloat, который часто используется для аналогичных задач, однако различие заключается в области допустимых форматов:

  • isDecimal — более строгая проверка десятичной записи
  • isFloat — допускает научную нотацию и более широкий диапазон представлений
validator.isFloat('1e5');   // true
validator.isDecimal('1e5'); // false

Типовые сценарии применения

Проверка финансовых значений

validator.isDecimal('199.99', { decimal_digits: '1,2' });

Используется для контроля корректного ввода сумм, где допустим фиксированный диапазон копеек.


Валидация измерений

validator.isDecimal('0.75', { force_decimal: true });

Применяется при работе с метрическими значениями, где целые числа считаются некорректными.


Локализованный ввод

validator.isDecimal('12,50', { locale: 'ru-RU' });

Используется в формах, адаптированных под региональные стандарты представления чисел.


Комбинирование с другими проверками

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

Пример последовательной проверки:

validator.isNumeric(value);
validator.isDecimal(value, { decimal_digits: '1,2' });

Такой подход позволяет сначала отсечь явно некорректные значения, а затем применить строгие правила формата.


Обработка пользовательского ввода

При интеграции в формы ввода важно учитывать, что данные поступают в виде строк. Даже если поле HTML типа number, на уровне JavaScript значение остаётся строковым.

function validatePrice(value) {
  return validator.isDecimal(value, {
    decimal_digits: '1,2',
    force_decimal: false
  });
}

Поведение при некорректных данных

Функция не выбрасывает исключений. Любое несоответствие формату приводит к возврату false, что упрощает интеграцию в цепочки валидации и middleware-слои серверных приложений.

const result = validator.isDecimal(null); // false

Особенности работы с нулями и форматированием

Допустимые и недопустимые случаи:

validator.isDecimal('0.0');   // true
validator.isDecimal('00.1');  // true (в некоторых конфигурациях)
validator.isDecimal('.1');    // false
validator.isDecimal('1.');    // false

Поведение может уточняться через параметры decimal_digits и force_decimal, однако базовое правило требует наличия обеих частей числа при использовании строгого режима.


Роль в серверной и клиентской валидации

Использование единой библиотеки для проверки десятичных значений на клиенте и сервере снижает вероятность расхождения логики обработки данных. Валидация на основе isDecimal часто включается в:

  • схемы проверки REST API
  • обработку форм регистрации и оплаты
  • системы фильтрации и поиска по числовым диапазонам

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