我之前已经输入验证器来检查电子邮件模式,密码最小和最大长度,密码确认等。
现在我手上有了新的东西,我有点卡住,不知道从哪里开始。
我的输入必须是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是有效还是无效,具体取决于数学结果。
答案 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