Валидация введенных данных

Валидация чисел в контексте Globalize опирается на правила CLDR (Unicode Common Locale Data Repository), где формат чисел определяется локалью: разделители тысяч, десятичные символы, особенности группировки и допустимые символы.

Основной инструмент — разбор строки в число через Globalize.parseNumber. Поведение функции напрямую связано с текущей локалью и набором подключённых CLDR-данных.

Globalize.locale("en");

Globalize.parseNumber("1,234.56"); // 1234.56
Globalize.parseNumber("1.234,56"); // NaN в en

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

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

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

const value = Globalize.parseNumber(input);

const isValid = typeof value === "number" && !isNaN(value);

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

Особенности локалей

Различия между локалями влияют на допустимый формат:

  • en: десятичный разделитель ., группировка ,
  • de: десятичный разделитель ,, группировка .
  • fr: пробелы как разделители групп
Globalize.locale("de");

Globalize.parseNumber("1.234,56"); // 1234.56
Globalize.parseNumber("1,234.56"); // NaN

Несоответствие формату локали приводит к неуспешному разбору даже при «логически правильном» числе.


Валидация валютных значений

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

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

Globalize.locale("en");

Globalize.parseNumber("$1,200.00"); // 1200
Globalize.parseNumber("€1,200.00"); // NaN без предварительной обработки

Нормализация валютного ввода

Перед парсингом часто требуется нормализация строки:

  • удаление символов валют
  • удаление пробелов
  • унификация разделителей
function normalizeCurrency(input) {
  return input.replace(/[^\d.,-]/g, "");
}

const normalized = normalizeCurrency("$1,200.00");
Globalize.parseNumber(normalized); // 1200

Подобная схема позволяет отделить формат отображения от логики проверки.


Проверка процентных значений

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

function parsePercent(input) {
  const cleaned = input.replace("%", "");
  const value = Globalize.parseNumber(cleaned);
  return value;
}

parsePercent("45%"); // 45

Дополнительная проверка корректности включает ограничение диапазона значений:

const isValidPercent =
  value >= 0 && value <= 100 && !isNaN(value);

Валидация дат и времени

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

Globalize.locale("en");

Globalize.parseDate("12/31/2025"); // Date object
Globalize.parseDate("31/12/2025"); // null или Invalid Date

Поведение при некорректном вводе

Некорректные строки возвращают null или объект Date, который не проходит проверку через isNaN(date.getTime()).

const date = Globalize.parseDate(input);

const isValidDate =
  date instanceof Date && !isNaN(date.getTime());

Локальные форматы дат

Разные локали изменяют порядок компонентов:

  • en-US: MM/DD/YYYY
  • de-DE: DD.MM.YYYY
  • ja-JP: YYYY/MM/DD
Globalize.locale("de-DE");

Globalize.parseDate("31.12.2025"); // корректно
Globalize.parseDate("12/31/2025"); // некорректно

Строгая и нестрогая валидация

Валидация в Globalize не имеет единого режима «strict», однако строгая логика формируется на уровне приложения.

Нестрогая модель

Допускает предварительную очистку строки:

Globalize.parseNumber("  1,234.50 ");

Поддерживаются пробелы и частичные отклонения формата.

Строгая модель

Строгость достигается дополнительными проверками:

  • сравнение обратного форматирования
  • проверка на наличие лишних символов
  • полное соответствие регулярному выражению локали
const parsed = Globalize.parseNumber(input);
const formatted = Globalize.formatNumber(parsed);

const isStrict =
  parsed != null &&
  formatted === input;

Сравнение форматирования и парсинга как механизм валидации

Одним из устойчивых подходов является проверка «обратимости»:

const number = Globalize.parseNumber(input);

const normalized = Globalize.formatNumber(number);

const isValid = normalized === input;

Этот подход позволяет выявлять:

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

Ограничение метода связано с тем, что форматирование может отличаться от исходного ввода (например, пробелы или альтернативные представления).


Обработка ошибок и NaN-состояний

Основной индикатор невалидного числового ввода — NaN.

const value = Globalize.parseNumber(input);

if (isNaN(value)) {
  // ошибка валидации
}

Для дат аналогом выступает Invalid Date.

const date = Globalize.parseDate(input);

if (!date || isNaN(date.getTime())) {
  // ошибка валидации даты
}

Валидация многозначных форматов

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

Списки чисел

function validateNumberList(input) {
  return input.split(",").every((part) => {
    const value = Globalize.parseNumber(part.trim());
    return !isNaN(value);
  });
}

Табличные данные

При обработке CSV-подобных структур локаль влияет на интерпретацию десятичного разделителя, что требует явного контроля разделения колонок до парсинга.


Зависимость валидации от CLDR-данных

Корректность всех операций парсинга определяется полнотой CLDR-ресурсов:

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

Отсутствие или неполная загрузка CLDR приводит к деградации валидации: часть строк перестаёт корректно распознаваться даже при правильном синтаксисе.


Нормализация ввода перед валидацией

Практика работы с Globalize предполагает предварительную нормализацию входных данных:

  • удаление невидимых символов
  • унификация пробелов
  • приведение к стандартной кодировке
  • устранение альтернативных разделителей
function normalize(input) {
  return input
    .replace(/\u00A0/g, " ")
    .trim();
}

Нормализация снижает количество ложных ошибок парсинга.


Комбинированная валидация чисел и дат

В интерфейсных сценариях часто применяется универсальный валидатор:

function validate(input) {
  const number = Globalize.parseNumber(input);
  if (!isNaN(number)) return { type: "number", value: number };

  const date = Globalize.parseDate(input);
  if (date && !isNaN(date.getTime())) {
    return { type: "date", value: date };
  }

  return { type: "invalid", value: null };
}

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


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

  • игнорирование локали при парсинге
  • отсутствие CLDR-данных
  • смешивание форматов (например, 1,234.56 в немецкой локали)
  • отсутствие проверки NaN
  • попытка использовать форматирование как единственный критерий валидности
  • предварительное удаление символов, искажающее структуру числа

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