Методы isCurrency и isDecimal

Validator.js содержит набор методов для валидации строковых значений, имитирующих числа, валютные записи и другие форматы ввода. В контексте числовых данных особое значение имеют методы isDecimal и isCurrency, поскольку они решают разные задачи: проверку «чистого» десятичного числа и проверку строки, оформленной как денежное значение с учётом локалей, символов и форматирования.


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

Общая характеристика

Функция проверяет значения вроде:

  • "10"
  • "10.5"
  • "-3.14"
  • "0.0001"

и отклоняет:

  • "10,5" (если не задана соответствующая локаль)
  • "10.5.3"
  • "abc"
  • "10." (в зависимости от настроек)

Сигнатура

isDecimal(str [, options])
  • str — строка для проверки
  • options — объект конфигурации (необязательный)

Основные правила валидации

По умолчанию проверка достаточно строгая:

  • допускается только один разделитель дробной части (.)
  • допускается необязательный знак - или +
  • не допускаются пробелы
  • не допускаются разделители тысяч

Поведение по умолчанию

validator.isDecimal("10.25"); // true
validator.isDecimal("-10.25"); // true
validator.isDecimal("10,25"); // false
validator.isDecimal("10.25.1"); // false

Опции isDecimal

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

force_decimal

Требует обязательного наличия десятичной части.

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

decimal_digits

Ограничивает количество знаков после запятой.

validator.isDecimal("10.123", { decimal_digits: "2" }); // false
validator.isDecimal("10.12", { decimal_digits: "2" });  // true

Допустимы диапазоны:

{ decimal_digits: "1,3" } // от 1 до 3 знаков

locale

Позволяет учитывать локальные правила (например, запятую как десятичный разделитель).

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

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

  • метод не преобразует строку в число
  • работает исключительно на уровне синтаксического анализа
  • не допускает экспоненциальную форму (1e5 → false)
  • ориентирован на строгую проверку пользовательского ввода

isCurrency: проверка валютных форматов

Метод isCurrency используется для валидации строк, представляющих денежные значения. В отличие от isDecimal, он учитывает символ валюты, разделители тысяч, локальные форматы и дополнительные правила отображения.


Общая характеристика

Поддерживаются форматы:

  • "1000"
  • "1,000.00"
  • "$1000"
  • "€ 1.000,00"
  • "-1000"
  • "(1000)" (в некоторых конфигурациях)

Сигнатура

isCurrency(str [, options])

Базовое поведение

validator.isCurrency("1000.00"); // true
validator.isCurrency("$1000.00"); // false (без настройки символа)

Ключевые опции isCurrency

Метод обладает широким набором параметров, позволяющих описать практически любой валютный формат.


symbol

Определяет символ валюты.

validator.isCurrency("$100", { symbol: "$" }); // true

require_symbol

Требует обязательного наличия символа валюты.

validator.isCurrency("100", {
  symbol: "$",
  require_symbol: true
}); // false

allow_space_after_symbol

Разрешает пробел после символа валюты.

validator.isCurrency("$ 100", {
  symbol: "$",
  allow_space_after_symbol: true
}); // true

symbol_after_digits

Определяет расположение символа валюты после числа.

validator.isCurrency("100$", {
  symbol: "$",
  symbol_after_digits: true
}); // true

thousands_separator

Задает разделитель тысяч.

validator.isCurrency("1.000.000", {
  thousands_separator: "."
}); // true

decimal_separator

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

validator.isCurrency("1000,50", {
  decimal_separator: ","
}); // true

allow_decimal

Разрешает или запрещает дробную часть.

validator.isCurrency("1000", {
  allow_decimal: false
}); // true

validator.isCurrency("1000.50", {
  allow_decimal: false
}); // false

require_decimal

Требует обязательного наличия дробной части.

validator.isCurrency("1000", {
  require_decimal: true
}); // false

digits_after_decimal

Ограничивает количество знаков после запятой.

validator.isCurrency("1000.123", {
  digits_after_decimal: [1, 2]
}); // false

allow_negatives

Разрешает отрицательные значения.

validator.isCurrency("-1000", {
  allow_negatives: true
}); // true

parens_for_negatives

Поддержка отрицательных чисел в скобках.

validator.isCurrency("(1000)", {
  parens_for_negatives: true
}); // true

negative_sign_before_digits и negative_sign_after_digits

Контролируют расположение минуса.

validator.isCurrency("-1000", {
  negative_sign_before_digits: true
});

Примеры комплексных конфигураций

Европейский формат

validator.isCurrency("1.234.567,89", {
  symbol: "€",
  require_symbol: false,
  decimal_separator: ",",
  thousands_separator: "."
});

Американский формат

validator.isCurrency("$1,234,567.89", {
  symbol: "$",
  require_symbol: true,
  decimal_separator: ".",
  thousands_separator: ","
});

Строгая проверка без дробей

validator.isCurrency("1000", {
  allow_decimal: false,
  allow_negatives: false
});

Сравнение isDecimal и isCurrency

Формальная цель

  • isDecimal — проверка математического десятичного числа
  • isCurrency — проверка денежного формата с символами и локалями

Уровень строгости

  • isDecimal: строгий синтаксис числа
  • isCurrency: гибкий формат с поддержкой визуальных правил

Символы и оформление

  • isDecimal: не допускает символов валюты
  • isCurrency: допускает символы, пробелы, разделители

Применение

  • isDecimal: расчёты, числовая валидация, API ввод
  • isCurrency: пользовательские формы оплаты, интерфейсы финансовых данных

Поведенческие особенности парсинга

Оба метода:

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

Типовые ошибки при использовании

Использование isDecimal для валют

validator.isDecimal("$100"); // false

Ошибка заключается в попытке валидировать формат, содержащий символы.


Игнорирование локалей в isCurrency

validator.isCurrency("1000,50"); // false

без указания decimal_separator.


Неправильное сочетание опций

Конфликтующие параметры (например, require_decimal и allow_decimal: false) приводят к логически несовместимым проверкам, что делает результат всегда отрицательным.