检查输入中输入的数字是否在数学上有效

时间:2018-06-04 21:32:16

标签: angular math angular5

我之前已经输入验证器来检查电子邮件模式,密码最小和最大长度,密码确认等。

现在我手上有了新的东西,我有点卡住,不知道从哪里开始。

我的输入必须是13个数字,并且必须根据下面发布的算法(数学结果)检查插入的13个数字是否包含有效或无效的公民身份ID。

Citizenship id长度为13个数字,格式如下:

DDMMGGGRRSSSK

DDMMGGG代表以下示例中的出生日期,月份和年份:

1010990,代表1990年10月10日。

RR代表公民的地区,可以包括以下数字:

00到99

SSS代表男性的性别数字,必须是低于499的数字,女性高于500.

现在最后一个数字是第13个数字是特殊控制号。

下面的工作CITIZENSHIP ID示例和包含的算法,以获取有效/无效的公民身份ID:

示例:ID 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 ====> ID是正确的

调用获得的总和“ZZZ”。 我们将“ZZZ”除以11。 让我们从“OST”上方的操作中调用剩余部分。 我们从11中减去OST然后得到我们称之为“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”不同,则ID不正确

我的数学和我的数学英语不是顶级水平,但希望有人可以从上面显示的数学例子中找到它。

这是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个数字,我希望它使用上面公布的算法显示插入的ID是有效还是无效,具体取决于数学结果。

1 个答案:

答案 0 :(得分:1)

您可以以正确的方式执行此操作,并为您的表单(或管道)编写自定义验证程序(docs:https://angular.io/guide/form-validation#custom-validators),或者您可以通过订阅以较不正确的方式(但合理地简单地)执行此操作改变输入,为状态创建局部变量,并在值上执行函数,当且仅当它长度为13个字符时。

例如Component(添加局部变量并根据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