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



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

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

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

公民身份ID的长度为13个数字,格式如下:

DDMMGGGRRSSSK

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

1010990代表1990年10月10日。

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

00 到 99

SSS代表男性的性别数字,它必须是低于499的数字,对于女性来说,它必须是高于500的数字。

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

下面的工作公民身份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 是有效还是无效,具体取决于数学结果。

你可以用正确的方式做,为你的表单(或管道(编写一个自定义验证器(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>

堆栈闪电战:https://stackblitz.com/edit/angular-gbrpoz

最新更新