Проверка ISIN

validator.js предоставляет набор инструментов для проверки строковых значений, включая финансовые идентификаторы. Одним из таких форматов является ISIN — международный идентификатор ценных бумаг, используемый для однозначной идентификации финансовых инструментов.

ISIN всегда имеет фиксированную длину — 12 символов и состоит из трёх логических частей:

  • Двухбуквенный код страны (ISO 3166-1 alpha-2)
  • Девятисимвольный национальный идентификатор (буквы и цифры)
  • Контрольная цифра (последний символ)

Пример корректного значения:

US0378331005

Каждая часть несёт строго определённую функцию, а контрольная цифра вычисляется по модифицированному алгоритму Луна.


Алгоритм вычисления контрольной цифры

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

Преобразование символов

Перед вычислением:

  • Буквы преобразуются в числа по схеме A = 10, B = 11, …, Z = 35
  • Полученная строка разворачивается в последовательность цифр

Пример:

US -> 30 28

Шаги проверки

  1. Все символы, кроме контрольной цифры, преобразуются в числовую строку
  2. Числа обрабатываются справа налево
  3. Каждая вторая цифра удваивается
  4. Если результат больше 9 — вычитается 9
  5. Суммируются все цифры
  6. Контрольная цифра = (10 - (сумма % 10)) % 10

Этот механизм позволяет выявлять большинство ошибок ввода и опечаток.


Проверка ISIN в Validator.js

Библиотека validator.js предоставляет встроенную функцию:

validator.isISIN(str)

Функция возвращает true, если строка соответствует стандарту ISIN и проходит проверку контрольной суммы.


Подключение библиотеки

Установка через npm

npm install validator

Импорт

const validator = require('validator');

или при использовании ES Modules:

import validator from 'validator';

Базовый пример проверки

import validator from 'validator';

const isin = 'US0378331005';

const isValid = validator.isISIN(isin);

console.log(isValid); // true или false

Функция учитывает:

  • корректность формата
  • допустимые символы
  • соответствие контрольной суммы

Особенности валидации ISIN

1. Регистр символов

ISIN может содержать как заглавные, так и строчные буквы, однако стандарт предполагает использование только uppercase:

validator.isISIN('us0378331005'); // корректно обработается

2. Недопустимые символы

Любые символы вне диапазона [A-Z0-9] автоматически делают значение невалидным:

validator.isISIN('US03783310@5'); // false

3. Проверка длины

ISIN всегда должен иметь строго 12 символов:

validator.isISIN('US037833100');   // false (11 символов)
validator.isISIN('US03783310055');  // false (13 символов)

Использование в формах ввода

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

function validateForm(data) {
    if (!validator.isISIN(data.isin)) {
        throw new Error('Некорректный ISIN');
    }
    return true;
}

Нормализация данных перед проверкой

Перед валидацией часто выполняется предварительная очистка:

function normalizeISIN(value) {
    return value.replace(/\s+/g, '').toUpperCase();
}

const input = ' us 0378331005 ';
const normalized = normalizeISIN(input);

validator.isISIN(normalized); // true

Удаление пробелов и приведение к верхнему регистру повышает устойчивость проверки.


Частые ошибки при проверке ISIN

Ошибка 1: использование неправильного идентификатора

ISIN отличается от:

  • CUSIP (США)
  • SEDOL (Великобритания)

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


Ошибка 2: игнорирование контрольной суммы

Даже корректный по структуре ISIN может быть отклонён, если контрольная цифра не совпадает с вычисленной.


Ошибка 3: смешивание форматов

Часто встречается ошибка при конкатенации данных:

'US' + '037833100' + 'X' // недопустимо, если X не контрольная цифра

Интеграция в серверную валидацию

ISIN часто проверяется на уровне API:

app.post('/security', (req, res) => {
    const { isin } = req.body;

    if (!validator.isISIN(isin)) {
        return res.status(400).json({ error: 'Invalid ISIN' });
    }

    // дальнейшая обработка
});

Производительность проверки

Функция isISIN выполняет:

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

Это делает её подходящей для массовой валидации в реальном времени, включая:

  • финансовые платформы
  • биржевые системы
  • API с высокой нагрузкой

Безопасность использования

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

  • соответствие ISIN реальному эмитенту
  • актуальность инструмента
  • наличие в базе данных ценных бумаг

Клиентская проверка служит только первым фильтром перед более глубокими проверками на сервере.


Обработка массивов ISIN

При работе с портфелями ценных бумаг часто требуется массовая валидация:

const isins = ['US0378331005', 'GB0002634946', 'DE000BASF111'];

const results = isins.map(isin => ({
    isin,
    valid: validator.isISIN(isin)
}));

Такой подход применяется в аналитических и брокерских системах для предварительной очистки данных.


Сочетание с другими валидаторами

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

validator.isISIN(isin) &&
validator.isLength(description, { min: 10 }) &&
validator.isISO8601(date)

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