美文网首页
判断身份证号码

判断身份证号码

作者: An_0313 | 来源:发表于2018-11-28 16:45 被阅读0次
    let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]    // 加权因子
    let letideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]            // 身份证验证位值.10代表X
    function IdCardletidate (idCard) {
      idCard = trim(idCard.replace(/ /g, ''))               // 去掉字符串头尾空格
      if (idCard.length === 15) {
        return isletidityBrithBy15IdCard(idCard)       // 进行15位身份证的验证
      } else if (idCard.length === 18) {
        let aIdCard = idCard.split('')                // 得到身份证数组
        if (isletidityBrithBy18IdCard(idCard) && isTrueletidateCodeBy18IdCard(aIdCard)) {   // 进行18位身份证的基本验证和第18位的验证
          return true
        } else {
          return false
        }
      } else {
        return false
      }
    }
    /**
     * 判断身份证号码为18位时最后的验证位是否正确
     * @param aIdCard 身份证号码数组
     * @return
     */
    function isTrueletidateCodeBy18IdCard (aIdCard) {
      let sum = 0                             // 声明加权求和变量
      if (aIdCard[17].toLowerCase() === 'x') {
        aIdCard[17] = 10                    // 将最后位为x的验证码替换为10方便后续操作
      }
      for (let i = 0; i < 17; i++) {
        sum += Wi[i] * aIdCard[i]            // 加权求和
      }
      let CodePosition = sum % 11                // 得到验证码所位置
      if (aIdCard[17] === letideCode[CodePosition]) {
        return true
      } else {
        return false
      }
    }
    /**
     * 验证18位数身份证号码中的生日是否是有效生日
     * @param idCard 18位书身份证字符串
     * @return
     */
    function isletidityBrithBy18IdCard (idCard18) {
      let year = idCard18.substring(6, 10)
      let month = idCard18.substring(10, 12)
      let day = idCard18.substring(12, 14)
      let tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day))
      // 这里用getFullYear()获取年份,避免千年虫问题
      if (tempDate.getFullYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
        return false
      } else {
        return true
      }
    }
    /**
     * 验证15位数身份证号码中的生日是否是有效生日
     * @param idCard15 15位书身份证字符串
     * @return
     */
    function isletidityBrithBy15IdCard (idCard15) {
      let year = idCard15.substring(6, 8)
      let month = idCard15.substring(8, 10)
      let day = idCard15.substring(10, 12)
      let tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day))
      // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
      if (tempDate.getYear() !== parseFloat(year) || tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day)) {
        return false
      } else {
        return true
      }
    }
    // 去掉字符串头尾空格
    function trim (str) {
      return str.replace(/(^\s*)|(\s*$)/g, '')
    }
    
    export default IdCardletidate
    

    相关文章

      网友评论

          本文标题:判断身份证号码

          本文链接:https://www.haomeiwen.com/subject/mcrzqqtx.html