-
Notifications
You must be signed in to change notification settings - Fork 0
Check
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 для односимвольного контрольного числа) |
Исправляет значение this.sum
в том случае, если длина его десятичного представления превышает checkSumLength
.
В базовой реализации устанавливает this.sum = 0
, что соответствует требованиям вида: "Если остаток равен 10, то n = 0" — и равносильно делению с остатком на modulus2
.
Вызывает process (str)
, после чего заменяет this.sum = 0
на его остаток от деления на modulus1
. Если результат не менее modulus2
(то есть не помещается в checkSumLength
), вызывается adjustSum (str)
.
В качестве результата выдаётся this.sum
, дополненной слева нулями до длины checkSumLength
.
Устанавливает this.sum=0
и проходит в цикле первые valueLength
символов строки, для каждого из них проверяет, является ли он цифрой и вызывает метод processDigit (pos, digit)
.
Этот метод вызывается по ходу process
(см. ниже) для цифры digit
, обнаруженной по индексу pos
. В базовой реализации не делает ничего.
Если asis
отличается от tobe
, выдаёт ошибку "Invalid ${code}" с дополнительными полями {asis, tobe, code}
.
Выдаёт ошибку с сообщением message
, дополненную полями из options
.
Проверяет:
- строка ли на входе
- требуемая ли у неё длина
- совпадает ли вычисленная контрольная сумма:
- с последними
checkSumLength
символами (приcheckSumLength > 0
) - иначе с
'0'
- с последними
Если str
— строка цифр длины valueLength
, то возвращает её с добавленной на конце контрольной суммой.
Генерирует случайный код, проходящий проверку контрольной суммы (композиция appendCheckSum (randomValue (options))
) и начинающийся с одного из элементов options.pre
.
Генерирует строку длины valueLength
из случайных цифр, первые из которых — один из элементов массива options.pre
(по умолчанию (['']
)).