目录
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$/(value)) {
var sum = 0, idx;
for (var i = 0; i < - 1; i++) {
// 对前17位数字与权值乘积求和
sum += parseInt((i, 1), 10) * arrExp[i];
}
// 计算模(固定算法)
idx = sum % 11;
// 检验第18为是否与校验码相等
if (arrValid[idx] == (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 =
(6, 10) +
"年" +
(10, 12) +
"月" +
(12, 14) +
"日";
return birthday;
}
if (type === 2) {
//获取性别
if (parseInt((16, 1)) % 2 === 1) {
return "男";
} else {
return "女";
}
}
if (type === 3) {
//获取年龄
var ageDate = new Date();
var month = () + 1;
var day = ();
var age = () - (6, 10) - 1;
if (
(10, 12) < month ||
((10, 12) === month &&
(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 = ();
int yearNow = ();
int monthNow = () + 1;
int dayNow = ();
int year = ((6, 10));
int month = ((10, 12));
int day = ((12, 14));
if ((month < monthNow) || (month == monthNow && day <= dayNow)) {
age = (yearNow - year);
} else {
age = (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 (() != 15 && () != 18) {
return "当前身份证件号有误!请检查身份证位数是否正确或是否输入空格!";
}else {
Calendar cal = ();
int yearNow = ();
int monthNow = () + 1;
int dayNow = ();
int year = ((6, 10));
int month = ((10, 12));
int day = ((12, 14));
if ((month < monthNow) || (month == monthNow && day <= dayNow)) {
age = (yearNow - year);
} else {
age = (yearNow - year - 1);
}
}
return age;
}
/**
* 根据身份证号判断性别
*/
public static String judgeGender(String idNumber) throws IllegalArgumentException {
if (idNumber == null || "".equals(idNumber)) {
return "当前身份证件号为空!请正确填写身份证号!";
}else if (() != 18 && () != 15) {
throw new IllegalArgumentException("身份证号长度错误");
}
int gender = 0;
if (() == 18) {
//如果身份证号18位,取身份证号倒数第二位
char c = (() - 2);
gender = ((c));
} else {
//如果身份证号15位,取身份证号最后一位
char c = (() - 1);
gender = ((c));
}
//("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 = (0);
if ((idcard)) {
return age;
}
String birth = "";
if (() == 18) {
birth = (6, 14);
} else if (() == 15) {
birth = "19" + (6, 12);
}
int year = ((0, 4));
int month = ((4, 6));
int day = ((6));
Calendar cal = ();
age = (() - year);
int ages = (age);
//周岁计算
if (() < (month - 1) || (() == (month - 1) && () < day)) {
ages--;
}
age = (ages);
return age;
} catch (Exception e) {
();
}
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}$/