Проверка ISBN

Validator.js предоставляет набор методов для проверки строковых значений на соответствие различным стандартам, включая формат ISBN. Проверка ISBN (International Standard Book Number) в этой библиотеке реализована через универсальный метод isISBN, который поддерживает как ISBN-10, так и ISBN-13 и учитывает правила контрольных сумм, допустимые разделители и символы.

ISBN существует в двух основных форматах:

ISBN-10

Формат, использовавшийся до перехода на ISBN-13. Состоит из 10 символов:

  • первые 9 символов — цифры
  • последний символ — контрольная цифра, которая может быть числом от 0 до 9 или символом X

Контрольная сумма вычисляется по модулю 11 с весами от 10 до 1. Если результат равен 10, используется X.

Пример:

0-306-40615-2

ISBN-13

Современный формат, основанный на EAN-13:

  • 13 цифр
  • контрольная сумма вычисляется по модулю 10 с чередующимися весами 1 и 3

Пример:

978-3-16-148410-0

Метод isISBN в Validator.js

Основной метод проверки:

validator.isISBN(str [, version])

Параметры

  • str — строка ISBN для проверки

  • version — необязательный параметр:

    • 10 — проверка только ISBN-10
    • 13 — проверка только ISBN-13
    • undefined — проверка обоих форматов

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

Проверка любого ISBN

import validator from 'validator';

validator.isISBN('978-3-16-148410-0'); // true
validator.isISBN('0-306-40615-2');     // true

Проверка конкретной версии

validator.isISBN('0-306-40615-2', 10); // true
validator.isISBN('0-306-40615-2', 13); // false

validator.isISBN('978-3-16-148410-0', 13); // true
validator.isISBN('978-3-16-148410-0', 10); // false

Нормализация входных данных

ISBN часто приходит в разных форматах записи:

  • с дефисами
  • с пробелами
  • без разделителей

Validator.js автоматически нормализует строку перед проверкой.

Примеры эквивалентных значений:

9783161484100
978-3-16-148410-0
978 3 16 148410 0

Все они могут быть корректно распознаны как ISBN-13.

Алгоритм проверки ISBN-10

Validator.js выполняет следующие шаги:

  1. Удаление дефисов и пробелов
  2. Проверка длины (10 символов)
  3. Проверка первых 9 символов на числовой формат
  4. Вычисление контрольной суммы:

Формула:

(1×d1 + 2×d2 + ... + 10×d10) mod 11 === 0

Где d10 может быть X, интерпретируемым как 10.

Особое внимание уделяется последнему символу:

  • допустимы цифры
  • либо X (только в последней позиции)

Алгоритм проверки ISBN-13

Для ISBN-13 используется модуль 10:

  1. Удаление разделителей
  2. Проверка длины (13 цифр)
  3. Проверка всех символов на числовой формат
  4. Применение весов:

Формула:

(d1 + 3×d2 + d3 + 3×d4 + ... + d13) mod 10 === 0

Контрольная цифра подбирается так, чтобы сумма была кратна 10.

Обработка ошибок и некорректных значений

Метод isISBN возвращает строго булево значение:

  • true — строка соответствует стандарту ISBN
  • false — любое отклонение от формата

Типичные причины возврата false:

  • неверная длина строки
  • недопустимые символы (буквы вне позиции X)
  • неправильная контрольная сумма
  • смешение ISBN-10 и ISBN-13 в параметре version

Примеры:

validator.isISBN('1234567890'); // false (невалидная контрольная сумма)

validator.isISBN('978-3-16-148410-9'); // false (ошибка checksum)

validator.isISBN('0-306-40615-X', 13); // false (неверная версия)

Особенности реализации в Validator.js

Игнорирование форматирования

Библиотека не требует предварительной очистки строки:

  • дефисы игнорируются
  • пробелы игнорируются
  • регистр символов не влияет (для X)

Строгая проверка структуры

Несмотря на гибкость ввода, проверка остаётся строгой:

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

Поддержка только стандартных ISBN

Не поддерживаются:

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

Практические сценарии использования

Валидация пользовательского ввода

function validateBookForm(isbn) {
  return validator.isISBN(isbn);
}

Проверка перед сохранением в базу данных

if (!validator.isISBN(book.isbn, 13)) {
  throw new Error('Некорректный ISBN-13');
}

Фильтрация массива значений

const validIsbns = list.filter(item =>
  validator.isISBN(item)
);

Комбинация с другими методами Validator.js

ISBN часто используется вместе с другими проверками:

validator.isISBN(str) &&
validator.isLength(str, { min: 10, max: 17 }) &&
validator.isAlphanumeric(str.replace(/-/g, ''))

Хотя такая комбинация обычно избыточна, она может использоваться при строгой бизнес-валидации.

Типичные ошибки при использовании

Игнорирование версии ISBN

validator.isISBN('978-3-16-148410-0', 10); // всегда false

Попытка ручной очистки без необходимости

// не требуется
const cleaned = isbn.replace(/-/g, '');
validator.isISBN(cleaned);

Ожидание возврата информации о формате

Метод не возвращает тип ISBN, только факт валидности.

Поведение при некорректных типах данных

Если передана не строка:

validator.isISBN(9783161484100); // false
validator.isISBN(null);          // false
validator.isISBN(undefined);     // false

Валидация выполняется только над строковыми значениями.

Итоговые особенности проверки ISBN

  • поддержка ISBN-10 и ISBN-13
  • автоматическая обработка разделителей
  • строгая проверка контрольных сумм
  • отсутствие побочных эффектов
  • предсказуемое булево поведение