关于香港身份证有效性和格式的一套标准校验

前几天项目中有个input输入框要求是用户输入香港的身份证号,那这就涉及到对输入的身份证号做校验,由于香港身份证号的特殊性,我们也可以直接判断它的有效性

废话不多说,直接上代码:

 IsHKID(value) {
    let pattern = new RegExp("^[a-zA-Z0-9\-\s\(\)]+$");
    if(""==value){
      this.$scope.Rex = false;
      this.$scope.IsHKID = false;
      return;
    }
    if(!pattern.test(value)){
      this.$scope.Required = false;
      this.$scope.Rex= true;
      return;
    }else{
        this.Rex = false;
      
        let strValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
        if (value.length<8)  {
          this.$scope.IsHKID= true;
          return ;
        }
 
        if (value.charAt(value.length - 3) == '(' && value.charAt(value.length - 1) == ')') {
          value = value.substring(0, value.length - 3) + value.charAt(value.length - 2);
        }
        
        value = value.toUpperCase();

        
        let hkidPat = /^([A-Z]{1,2})([0-9]{6})([A0-9])$/;
        let matchArray = value.match(hkidPat);

 
        if (matchArray == null){
          this.$scope.IsHKID = true;
          return;
        }


        let charPart = matchArray[1];
        let numPart = matchArray[2];
        let checkDigit = matchArray[3];


        let checkSum = 0;
        if (charPart.length == 2) {
          checkSum += 9 * (1 + strValidChars.indexOf(charPart.charAt(0)));
          checkSum += 8 * (1 + strValidChars.indexOf(charPart.charAt(1)));
        } else {
     
          checkSum += 8 * (1 + strValidChars.indexOf(charPart));
        }


        for (let i = 0, j = 7; i < numPart.length; i++ , j--)
          checkSum += j * numPart.charAt(i);


        let remaining = checkSum % 11;
        let verify = '';
        if(remaining==0){
          verify = 0;
        }else{
          verify = 11 - remaining == 10 ? 'A' : 11 - remaining;
        }
        if (verify == checkDigit) {
          this.$scope.IsHKID = false;
          this.$scope.Required = false;
        } else {
          this.$scope.IsHKID = true;

        }
    }

}

可能有的人一看就蒙了,举个栗子:

香港的身份号像这样:E123456(4)

香港的身份证号组成是这样的:首位是一个字母或者两个字母 + 六个阿拉伯数字 + (字母为A或者0-9中某一个阿拉伯数字);

其实别wei6看上述代码那么长,其实逻辑很简单:

香港身份证号首位为一个字母,那么它的长度就是8位;两个字母,长度就是9位

  1. 将首字母转为字母在A至Z中的次序,A转为1,B转为2,如此类推
  2. 若括弧内为A,转为10
  3. 接下来将所有数字施加比重,比重为:
  • 双字母时,第一个字母的比重为9
  • 第二个字母或只有一个字母时比重为8
  • 第一个数字为7
  • 第二个数字为6
  • 第三个数字为5
  • 第四个数字为4
  • 第五个数字为3
  • 第六个数字为2
  • 括弧内的数字为1

4.   将数字和比重的乘积相加,得到一个和

5.  将上述得到的和➗11,得到一个余数

6. 从余数判断身份证号是否有效

再举个栗子:

比如身份证号为 C123456(9),字母C在字母表的次序为3

计算如下:3*8+1*7+2*6+3*5+4*4+5*3+6*2+9*1=110

110%11 = 0

故括弧内的数字应该为0,所以这个身份证号时无效的

总结完毕!

 

越努力,越幸运!

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值