Декоратор @IsCurrency используется для валидации
строковых значений, представляющих денежные суммы в различных форматах
валют. Проверка охватывает корректность символа валюты, расположение
знака, разделители тысяч и дробной части, а также допустимость
отрицательных значений.
Основная задача — обеспечение строгого соответствия входных данных финансовому формату, исключающему неоднозначные или некорректные представления денежных значений.
Проверка выполняется над строковым значением и включает несколько этапов:
Значение считается валидным только при полном соответствии всем активным правилам.
import { IsCurrency } from 'class-validator';
@IsCurrency(options?: IsCurrencyOptions)
IsCurrencyOptions определяет правила валидации
формата:
interface IsCurrencyOptions {
symbol?: string;
require_symbol?: boolean;
allow_space_after_symbol?: boolean;
symbol_after_digits?: boolean;
allow_negatives?: boolean;
thousands_separator?: string;
decimal_separator?: string;
}
Определяет ожидаемый символ валюты.
Примеры:
$€₽Если символ задан, строка обязана ему соответствовать.
Управляет обязательностью валютного символа.
true — символ обязателен;false — допускаются числовые значения без символа.Разрешает пробел между символом и числом.
Примеры допустимых форм:
$100$ 100Определяет расположение символа относительно числа.
false — символ перед числом ($100);true — символ после числа (100$).Контролирует поддержку отрицательных значений.
true — допускаются -100,
-$100;false — отрицательные значения считаются
невалидными.Задает символ разделителя тысяч.
Примеры:
, → 1,000. → 1.0001 000Несоответствие разделителя приводит к ошибке валидации.
Определяет символ отделения дробной части.
Примеры:
. → 10.50, → 10,50Используется совместно с thousands_separator, формируя
строгий формат числа.
import { IsCurrency } from 'class-validator';
class PaymentDto {
@IsCurrency()
amount: string;
}
В этом случае применяется стандартный набор правил без строгой привязки к конкретной валюте.
class PaymentDto {
@IsCurrency({
symbol: '$',
require_symbol: true,
})
amount: string;
}
Допустимые значения:
$100$100.00Недопустимые:
100€100class AccountDto {
@IsCurrency({
symbol: '€',
allow_negatives: true,
})
balance: string;
}
Допустимые значения:
€100-€100class ReportDto {
@IsCurrency({
symbol: '₽',
thousands_separator: ' ',
decimal_separator: ',',
})
total: string;
}
Корректные значения:
₽1 000,50₽10 000Некорректные:
₽1000.50₽1,000.50class CustomDto {
@IsCurrency({
symbol: 'USD',
symbol_after_digits: true,
})
amount: string;
}
Допустимые значения:
100USDНедопустимые:
USD100class ComplexDto {
@IsCurrency({
symbol: '$',
require_symbol: true,
allow_space_after_symbol: true,
allow_negatives: false,
thousands_separator: ',',
decimal_separator: '.',
})
price: string;
}
Примеры валидных значений:
$100$ 1,000.00Примеры невалидных:
1000$1.000,00-$100thousands_separator: ',',
decimal_separator: '.'
Вход: 1.000,00 → невалидно из-за обратного порядка
разделителей.
symbol: '$',
symbol_after_digits: true
Вход: $100 → невалидно, так как символ должен быть после
числа.
require_symbol: true
Вход: 100 → не проходит проверку независимо от
числа.
Валидация денежных значений часто применяется в DTO-слоях для обеспечения корректности входных данных перед бизнес-логикой:
Каждое поле с денежным значением проходит предварительную фильтрацию до попадания в сервисный слой.
@IsCurrency не выполняет преобразование типов. Он
работает исключительно как валидатор строкового представления.
Приведение к числу осуществляется отдельно, если требуется дальнейшая
математическая обработка значения.
Поддержка форматов с различными разделителями позволяет адаптировать валидацию под региональные стандарты:
1.000,00;1,000.00;Гибкость достигается за счет ручной настройки параметров, а не автоматического определения локали.