常用的的身份证校验方法

22 篇文章 0 订阅
5 篇文章 0 订阅

目录

1、前端校验

2、后端代码计算


考虑身份证的位数,身份证包涵的信息,如下所示

省份码(2位)+地级市(2位)+区县码(2位)+出生年月(8位)+顺序码(3位)+校验码(1位)
15位:6位地址码+6位出生年月日(年份取后两位)+3位顺序码
18位:6位地址码+8位出生年月日+3位顺序码+1位校验码
地区码:
1、 第一、二位表示省(自治区、直辖市、特别行政区)
2、 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码,其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟))
3、 第五、六位表示县(市辖区、县级市、旗,其中,01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市)。
顺序码:奇数分给男性,偶数分给女性。
校验码:即身份证的最后一位,是把身份证号码按统一的公式计算出来的(10个数字,0-9正常表示,10=X) 

1、前端校验

具体内容如下:

=====VUE中表单校验方法================================================================
export default {
	name:'',
	components: {
	},
	data() {
	//身份证校验
	const isCnNewID = (rule, value, callback) => {
           var arrExp = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];//加权因子
           var arrValid = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2];//校验码
           if (/^\d{17}\d|x$/i.test(value)) {
               var sum = 0, idx;
               for (var i = 0; i < value.length - 1; i++) {
                   // 对前17位数字与权值乘积求和
                   sum += parseInt(value.substr(i, 1), 10) * arrExp[i];
               }
               // 计算模(固定算法)
               idx = sum % 11;
               // 检验第18为是否与校验码相等
               if (arrValid[idx] == value.substr(17, 1).toUpperCase()) {
                   callback()
               } else {
                   callback("身份证格式有误")
               }
           } else {
               callback("身份证格式有误")
           }
    }
	return {
		title:'',
		open:false,
		form:{},
		//表单校验
		rules: {
			idCardNumber: [
				{ required: true, message: "身份证不能为空", trigger: "blur" },
				{	//调用上面定义的方法校验格式是否正确
                   validator: isCnNewID,trigger: "blur"
                }
			]
		}
	}
}

======获取身份证中的信息=============================================================
//获取身份证中的信息
    //当type=1时获取出生日期,type=2时获取性别,type=3时获取年龄
    IdCardNum(IdCard, type) {
      if (type === 1) {
        //获取出生日期
        let birthday =
          IdCard.substring(6, 10) +
          "年" +
          IdCard.substring(10, 12) +
          "月" +
          IdCard.substring(12, 14) +
          "日";
        return birthday;
      }
      if (type === 2) {
        //获取性别
        if (parseInt(IdCard.substr(16, 1)) % 2 === 1) {
          return "男";
        } else {
          return "女";
        }
      }
      if (type === 3) {
        //获取年龄
        var ageDate = new Date();
        var month = ageDate.getMonth() + 1;
        var day = ageDate.getDate();
        var age = ageDate.getFullYear() - IdCard.substring(6, 10) - 1;
        if (
          IdCard.substring(10, 12) < month ||
          (IdCard.substring(10, 12) === month &&
            IdCard.substring(12, 14) <= day)
        ) {
          age++;
        }
        if (age <= 0) {
          age = 1;
        }
        return age;
      }
    },

2、后端代码计算

具体工具类如下:

public class CalculateUserInfoByIdCardNumUtils {

    /**
     * 根据身份证号计算年龄1
     */
    public static String calculateAge(String idNumber) {
        String age = null;
        if (idNumber != null || idNumber != "") {
            Calendar cal = Calendar.getInstance();
            int yearNow = cal.get(Calendar.YEAR);
            int monthNow = cal.get(Calendar.MONTH) + 1;
            int dayNow = cal.get(Calendar.DATE);
            int year = Integer.valueOf(idNumber.substring(6, 10));
            int month = Integer.valueOf(idNumber.substring(10, 12));
            int day = Integer.valueOf(idNumber.substring(12, 14));
            if ((month < monthNow) || (month == monthNow && day <= dayNow)) {
                age = String.valueOf(yearNow - year);
            } else {
                age = String.valueOf(yearNow - year - 1);
            }
            return age;
        } else {
            age = idNumber;
            return age;
        }
    }
	
	/**
     * 根据身份证号计算年龄2
     */
    public static String calculateAges(String idNumber) {
        String age = "";
        if (idNumber == null || "".equals(idNumber)) {
            return "当前身份证件号为空!请正确填写身份证号!";
        }else if (idNumber.length() != 15 && idNumber.length() != 18) {
            return "当前身份证件号有误!请检查身份证位数是否正确或是否输入空格!";
        }else {
            Calendar cal = Calendar.getInstance();
            int yearNow = cal.get(Calendar.YEAR);
            int monthNow = cal.get(Calendar.MONTH) + 1;
            int dayNow = cal.get(Calendar.DATE);
            int year = Integer.valueOf(idNumber.substring(6, 10));
            int month = Integer.valueOf(idNumber.substring(10, 12));
            int day = Integer.valueOf(idNumber.substring(12, 14));
            if ((month < monthNow) || (month == monthNow && day <= dayNow)) {
                age = String.valueOf(yearNow - year);
            } else {
                age = String.valueOf(yearNow - year - 1);
            }
        }
        return age;
    }


    /**
     * 根据身份证号判断性别
     */
    public static String judgeGender(String idNumber) throws IllegalArgumentException {
        if (idNumber == null || "".equals(idNumber)) {
            return "当前身份证件号为空!请正确填写身份证号!";
        }else if (idNumber.length() != 18 && idNumber.length() != 15) {
            throw new IllegalArgumentException("身份证号长度错误");
        }
        int gender = 0;
        if (idNumber.length() == 18) {
            //如果身份证号18位,取身份证号倒数第二位
            char c = idNumber.charAt(idNumber.length() - 2);
            gender = Integer.parseInt(String.valueOf(c));
        } else {
            //如果身份证号15位,取身份证号最后一位
            char c = idNumber.charAt(idNumber.length() - 1);
            gender = Integer.parseInt(String.valueOf(c));
        }
        //System.out.println("gender = " + gender);
        if (gender % 2 == 1) {
            return "0";
        } else {
            return "1";
        }
    }


    /**
     * 根据身份证的号码算出当前身份证持有者的年龄
     *
     * @return -1(表示异常) 0 (身份证号码为空)
     * @throws Exception
     */
    public static String getAgeForIdcard(String idcard) {
        try {
            String age = String.valueOf(0);
            if (StringUtils.isEmpty(idcard)) {
                return age;
            }
            String birth = "";
            if (idcard.length() == 18) {
                birth = idcard.substring(6, 14);
            } else if (idcard.length() == 15) {
                birth = "19" + idcard.substring(6, 12);
            }
            int year = Integer.valueOf(birth.substring(0, 4));
            int month = Integer.valueOf(birth.substring(4, 6));
            int day = Integer.valueOf(birth.substring(6));
            Calendar cal = Calendar.getInstance();
            age = String.valueOf(cal.get(Calendar.YEAR) - year);
            int ages = Integer.parseInt(age);
            //周岁计算
            if (cal.get(Calendar.MONTH) < (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) < day)) {
                ages--;
            }
            age = String.valueOf(ages);
            return age;
        } catch (Exception e) {
            e.getMessage();
        }
        return "-1";
    }
}

身份证的正则表达式

let IDNum18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
let IDNum15 =  /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值