Работа с числовыми форматами в различных локалях валидации данных требует учёта различий в записи десятичных и тысячных разделителей, а также особенностей региональных стандартов представления чисел. В контексте библиотеки Validator.js эти задачи решаются через набор функций, ориентированных на проверку строковых значений, интерпретируемых как числа, с возможностью учёта локализации.
В различных странах применяются разные соглашения:
1234.561234,561 234, 1.234, 1,234Эти различия делают невозможным универсальную проверку числовых строк без учёта локали.
Validator.js учитывает эту проблему через параметр
locale в некоторых числовых валидаторах.
Функция isFloat предназначена для проверки чисел с
плавающей точкой и поддерживает локализованные форматы через опции.
import validator from 'validator';
validator.isFloat('1234.56'); // true (en-US формат)
validator.isFloat('1234,56', { locale: 'de-DE' }); // true
Поддерживаемые локали включают распространённые региональные форматы, такие как:
en-USde-DEfr-FRit-ITes-ESПри использовании локали библиотека автоматически интерпретирует:
При изменении параметра locale изменяется логика разбора
строки:
validator.isFloat('1,234.56', { locale: 'en-US' }); // true
validator.isFloat('1.234,56', { locale: 'en-US' }); // false
Здесь запятая рассматривается как разделитель тысяч, а точка — как десятичный разделитель.
validator.isFloat('1.234,56', { locale: 'de-DE' }); // true
validator.isFloat('1,234.56', { locale: 'de-DE' }); // false
В этом случае роли разделителей меняются местами.
Функция isDecimal используется для строгой проверки
десятичных чисел. Она также поддерживает локализацию:
validator.isDecimal('1234,56', { locale: 'fr-FR' }); // true
validator.isDecimal('1234.56', { locale: 'fr-FR' }); // false
Особенности поведения:
Функция isInt ориентирована на проверку целых чисел и не
поддерживает полноценную локализацию числовых разделителей. Основные
опции:
min, max — диапазон значенийallow_leading_zeroes — разрешение ведущих нулейgt, lt, ge, le —
логические ограниченияvalidator.isInt('1234'); // true
validator.isInt('1,234'); // false
Даже при наличии локальных форматов, таких как группировка тысяч, строка с разделителями не считается корректной.
Перед проверкой числовых значений часто требуется нормализация строки. Основные задачи:
Типичный подход:
function normalizeNumber(input) {
return input
.replace(/\s/g, '') // удаление пробелов
.replace(/\u202F/g, '') // узкий неразрывный пробел
.replace(',', '.'); // приведение запятой к точке
}
После нормализации данные можно проверять стандартными методами:
validator.isFloat(normalizeNumber('1 234,56'));
Validator.js строго ограничивает допустимые символы при проверке чисел:
0–9isFloat или isDecimal)Недопустимыми считаются:
1,234.56 в
de-DE)1234€, 12 34a)В случаях, когда нужная локаль не поддерживается напрямую, используется промежуточное преобразование строки в стандартный формат:
function toStandardFloat(value) {
const cleaned = value
.replace(/\./g, '')
.replace(',', '.');
return cleaned;
}
validator.isFloat(toStandardFloat('1.234,56'));
Такой подход позволяет унифицировать обработку чисел перед валидацией.
Распространённая проблема — строки, содержащие одновременно несколько типов разделителей:
1.234,56 — допустимо только для de-DE1,234.56 — допустимо только для en-US1.234.56 — недопустимо в любом форматеValidator.js в таких случаях строго следует указанной локали и отклоняет некорректные комбинации.
Если параметр locale не задан, используется стандартный
формат:
validator.isFloat('1234.56'); // true
validator.isFloat('1234,56'); // false
Это поведение важно учитывать при обработке пользовательского ввода, приходящего из разных регионов.
В isFloat и isDecimal локализация может
использоваться вместе с дополнительными ограничениями:
validator.isFloat('1234,56', {
locale: 'de-DE',
min: 0,
max: 2000
});
Такая комбинация позволяет одновременно:
Особое внимание требуется к следующим ситуациям:
Пример:
validator.isFloat('-1 234,56', { locale: 'de-DE' }); // true
validator.isFloat(' - 1234,56', { locale: 'de-DE' }); // false
Лишние пробелы вокруг знака минус приводят к отклонению строки.
В реальных приложениях локализация чисел редко ограничивается только Validator.js. Обычно используется двухэтапная схема:
isFloat или isDecimalТакой подход снижает зависимость от ограничений встроенной локализации и обеспечивает единообразие обработки данных из разных источников.