Skip to content
do- edited this page Sep 22, 2024 · 20 revisions

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

Все строки, обрабатываемые Check, должны:

  • быть фиксированной длины (totalLength);
  • состоять только из цифр (0..9);
  • иметь постфикс фиксированной длины checkSumLength, вычисляемый по как остаток от деления некоторой функции от последовательных цифр предшествующей части строки на на 10..01 и 10..0 соответствующей длины.

Конкретные функции для вычисления контрольных сумм определены в потомках Check: ScalarProduct и Horner, однако сам он напрямую используется для проверки и генерации кодов КПП.

Конструктор

 const c = new Check (totalLength, checkSumLength)

Смысл параметров такой же, как у одноимённых полей.

Поля

Имя Описание
totalLength Общее количество цифр в коде
checkSumLength Количество цифр в контрольной сумме
valueLength Количество цифр в коде за вычетом контрольной суммы
modulus1 знаменатель для первого деления с остатком: modulus2 + 1 (то есть 11 для односимвольного контрольного числа)
modulus2 знаменатель для окончательного деления с остатком: для checkSumLength >=1 — 10 в степени checkSumLength (то есть 10 для односимвольного контрольного числа)

Методы

Вычисление контрольной суммы

adjustSum (str)

Исправляет значение this.sum в том случае, если длина его десятичного представления превышает checkSumLength.

В базовой реализации устанавливает this.sum = 0, что соответствует требованиям вида: "Если остаток равен 10, то n = 0" — и равносильно делению с остатком на modulus2.

checkSum (str, checkAllDigits)

Вызывает process (str), после чего заменяет this.sum = 0 на его остаток от деления на modulus1. Если результат не менее modulus2 (то есть не помещается в checkSumLength), вызывается adjustSum (str).

В качестве результата выдаётся this.sum, дополненной слева нулями до длины checkSumLength.

process (str)

Устанавливает this.sum=0 и проходит в цикле первые valueLength символов строки, для каждого из них проверяет, является ли он цифрой и вызывает метод processDigit (pos, digit).

processDigit (pos, digit)

Этот метод вызывается по ходу process (см. ниже) для цифры digit, обнаруженной по индексу pos. В базовой реализации не делает ничего.

Проверки и оформление ошибок

mustBeEqual (asis, tobe, code)

Если asis отличается от tobe, выдаёт ошибку "Invalid ${code}" с дополнительными полями {asis, tobe, code}.

raise (message, options)

Выдаёт ошибку с сообщением message, дополненную полями из options.

verify (str)

Проверяет:

  • строка ли на входе
  • требуемая ли у неё длина
  • совпадает ли вычисленная контрольная сумма:
    • с последними checkSumLength символами (при checkSumLength > 0)
    • иначе с '0'

Генерация случайных кодов

appendCheckSum (str)

Если str — строка цифр длины valueLength, то возвращает её с добавленной на конце контрольной суммой.

random (options)

Генерирует случайный код, проходящий проверку контрольной суммы (композиция appendCheckSum (randomValue (options))) и начинающийся с одного из элементов options.pre.

randomValue (options)

Генерирует строку длины valueLength из случайных цифр, первые из которых — один из элементов массива options.pre (по умолчанию ([''])).