Валидация денежных форматов

Форматы денежных значений в веб-приложениях обладают высокой вариативностью: различаются разделители тысяч, символы валют, порядок расположения знаков, допустимые десятичные разряды и локальные соглашения. Валидация таких значений требует не только проверки на числовую корректность, но и учёта контекста отображения и ввода.

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


Денежные значения в пользовательском вводе могут принимать разнообразные формы:

  • 1000
  • 1,000
  • 1.000
  • $1000
  • € 1.000,50
  • 1 000.00

Ключевые факторы различий:

1. Разделитель тысяч

  • запятая: 1,000
  • точка: 1.000
  • пробел: 1 000

2. Десятичный разделитель

  • точка: 10.50
  • запятая: 10,50

3. Символ валюты

  • префикс: $100
  • суффикс: 100$
  • с пробелом: € 100

4. Количество десятичных знаков

  • фиксированное (например, 2 для валют)
  • переменное (для криптовалют или научных данных)

Возможности Validator.js для денежных строк

Метод isCurrency в Validator.js предназначен для проверки строк, которые должны соответствовать денежному формату. Он не выполняет математических операций и не преобразует значения, а лишь проверяет соответствие заданным правилам.

Базовый синтаксис:

validator.isCurrency(str [, options])
  • str — проверяемая строка
  • options — объект конфигурации

Возвращаемое значение: true или false


Основной метод isCurrency

Метод анализирует строку по нескольким критериям:

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

Пример базовой проверки:

import validator from 'validator';

validator.isCurrency('1000'); // true
validator.isCurrency('$1,000.00'); // true
validator.isCurrency('1.000,00'); // false (зависит от настроек)

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

Гибкость isCurrency обеспечивается набором параметров.

symbol

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

validator.isCurrency('$100', { symbol: '$' });

Также поддерживаются регулярные выражения:

validator.isCurrency('USD 100', { symbol: 'USD ' });

require_symbol

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

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

allow_space_after_symbol

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

validator.isCurrency('$ 100', { allow_space_after_symbol: true });

symbol_after_digits

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

validator.isCurrency('100$', { symbol_after_digits: true });

allow_negatives

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

validator.isCurrency('-100', { allow_negatives: true });

parens_for_negatives

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

validator.isCurrency('(100)', { parens_for_negatives: true });

thousands_separator

Задает допустимый разделитель тысяч.

validator.isCurrency('1,000,000', {
  thousands_separator: ','
});

decimal_separator

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

validator.isCurrency('1000.50', {
  decimal_separator: '.'
});

allow_decimal

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

validator.isCurrency('1000.50', { allow_decimal: true });
validator.isCurrency('1000', { allow_decimal: false });

digits_after_decimal

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

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

Примеры комплексной настройки

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

validator.isCurrency('1.000,50', {
  symbol: '€',
  require_symbol: true,
  thousands_separator: '.',
  decimal_separator: ',',
  allow_space_after_symbol: true
});

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

validator.isCurrency('$1,000.50', {
  symbol: '$',
  require_symbol: true,
  thousands_separator: ',',
  decimal_separator: '.'
});

Формат без валютного символа

validator.isCurrency('1000.00', {
  require_symbol: false,
  allow_decimal: true
});

Региональные особенности форматов

Разные локали используют несовместимые соглашения, что требует явной настройки валидации:

  • США: 1,000.00
  • Европа: 1.000,00
  • Индия: 1,00,000.00
  • Швейцария: 1'000.00

Validator.js не выполняет автоматическое определение локали, поэтому разработчик обязан явно задавать правила под конкретный контекст.


Типичные ошибки при валидации

1. Отсутствие явного указания разделителей

Без настройки thousands_separator и decimal_separator возможны ложные срабатывания.


2. Игнорирование символа валюты

При включённом require_symbol строка без валютного знака будет считаться невалидной.


3. Смешение форматов

Строка вида 1,000.50 может быть интерпретирована по-разному в зависимости от локали.


4. Неправильная работа с отрицательными значениями

Неактивированный allow_negatives блокирует валидные финансовые данные.


Практики интеграции в формы ввода

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

  • формы оплаты
  • финансовые отчёты
  • бухгалтерские системы
  • калькуляторы стоимости

При интеграции с Validator.js часто используется комбинирование:

  • предварительная нормализация строки (удаление пробелов)
  • применение isCurrency
  • дополнительная проверка бизнес-логики (например, диапазоны значений)

Пример цепочки обработки:

let value = input.trim();

if (validator.isCurrency(value, {
  symbol: '$',
  thousands_separator: ',',
  decimal_separator: '.'
})) {
  // значение допустимо
}

Гибкая настройка параметров делает проверку денежных значений в Validator.js применимой в широком спектре финансовых интерфейсов, где требуется строгий контроль формата ввода без привязки к единственной локали или стандарту.