Проверьте, является ли число, введенное во ввод, математически допустимым - PullRequest
0 голосов
/ 05 июня 2018

Ранее я делал валидаторы ввода для проверки шаблонов электронной почты, минимальной и максимальной длины пароля, подтверждения пароля и т. Д.

Теперь у меня есть что-то новое, что я застрял и не могузнать, с чего начать.

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

Идентификатор гражданства состоит из 13 цифр и имеет следующий формат:

DDMMGGGRRSSSK

DDMMGGG представляет день, месяц и год рождения в следующем примере:

1010990, представляющий 10 октябряof 1990.

RR представляет регион гражданина и может включать числа между:

00 до 99

SSS представляет числа для пола для мужчин, это должно быть число ниже 499 идля женщин выше 500.

Теперь последний номер, который является 13-м номером, является специальным контрольным номером.

Пример работающего идентификатора ГРАЖДАНСТВА ниже aи включенный алгоритм для получения действительного / недействительного идентификатора гражданства:

Пример: идентификатор 0308964384007

ZZZ = (0 * 7) + (3 * 6) + (0 * 5) + (8 * 4) + (9 * 3) + (6 * 2) + (4 * 7) + (3 * 6) + (8 * 5) + (4 * 4) + (0 * 3) + (2 *0) = 0 +18 + 0 +32 +27 +12 +28 +18 +40 +16 +0 +0 = 191 191: 11 = 17 81 4 11-4 = 7 ====> Идентификатор правильный

Назовите полученную сумму "ZZZ".Разделим «ZZZ» на 11. Давайте назовем остатки от операции над «OST».Мы вычитаем OST из 11, а затем получаем разницу, которую будем называть «RAZ» (RAZ = 11-OST).

Если значение остальных равно 1 (OST = 1, RAZ = 10), то ID неверен

если значение покоя равно 0 (OST = 0, т. Е. Число ZZZ делится на 11 без остатка), контрольная цифра K равна 0 (K = 0)

if the residue number is between 1 and 11 (1 <OST <11) the control digit K is the difference between 11 and residue (K = RAZ)

Если Kотличается от «RAZ». Идентификатор неверен

Моя математика и мой математический английский не на верхнем уровне, но надеюсь, что кто-то сможет понять это из математического примера, показанного выше.

Эторабочий фрагмент в javascript:

_validateJMBG: function(value, countryCode) {
        if (!/^\d{13}$/.test(value)) {
            return false;
        }
        var day   = parseInt(value.substr(0, 2), 10),
            month = parseInt(value.substr(2, 2), 10),
            year  = parseInt(value.substr(4, 3), 10),
            rr    = parseInt(value.substr(7, 2), 10),
            k     = parseInt(value.substr(12, 1), 10);

        // Validate date of birth
        // FIXME: Validate the year of birth
        if (day > 31 || month > 12) {
            return false;
        }

        // Validate checksum
        var sum = 0;
        for (var i = 0; i < 6; i++) {
            sum += (7 - i) * (parseInt(value.charAt(i), 10) + parseInt(value.charAt(i + 6), 10));
        }
        sum = 11 - sum % 11;
        if (sum === 10 || sum === 11) {
            sum = 0;
        }
        if (sum !== k) {
            return false;
        }


        switch (countryCode.toUpperCase()) {
            case 'BA':
                return (10 <= rr && rr <= 19);
            case 'MK':
                return (41 <= rr && rr <= 49);
            case 'ME':
                return (20 <= rr && rr <= 29);
            case 'RS':
                return (70 <= rr && rr <= 99);
            case 'SI':
                return (50 <= rr && rr <= 59);
            default:
                return true;
        }
    },

    _ba: function(value) {
        return this._validateJMBG(value, 'BA');
    },

Надеюсь, кто-нибудь может помочь мне сделать это в angular2 + или, по крайней мере, направить меня в правильном направлении. Большое спасибо за потраченное время и усилия!

Чего я пытаюсь достичь?

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

1 Ответ

0 голосов
/ 05 июня 2018

Вы можете сделать это правильно и написать собственный валидатор (docs: https://angular.io/guide/form-validation#custom-validators) для вашей формы (или канала), или вы можете сделать это менее правильным способом (но достаточно просто) с помощьюподписавшись на изменение входных данных, создайте локальную переменную для статуса и выполняйте свою функцию для значения, если и только если оно имеет длину 13 символов.

например, Компонент (Добавить локальную переменную и назначить на основепо результату validateJMBG)

idVerificationStatus: string = 'Invalid';

checkVerificationStatus(value: string) {
    if (value.length === 13) {
       this.idVerificationStatus = this.validateJMBG(value, 'BA' ? 'Valid' : 'Invalid';
     }
}

validateJMBG(value, countryCode) {
     // paste your code here
}

например, Шаблон (Добавить (change) к вашему элементу ввода)

 <input id="yourInput" type="text" (change)="checkVerificationStatus($event.target.value) />
 <div class="verificationStatus">{{idVerificationStatus}}</div>

Stackblitz: https://stackblitz.com/edit/angular-gbrpoz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...