最近整理了项目中的身份证号的校验插件,在此记录一下,共勉:
1.身份证号是否合法校验:
//弹窗
import { Toast } from "mint-ui";
let instance = null;
const showToast = tip => {
if(instance) {
instance.close();
}
instance = Toast({
message: tip,
duration: 2000
});
}
//开始校验,调取showVerifyIDTip 时传递的tip为提示语,value为身份证号
const showVerifyIDTip = function(value, tip) {
if(value.length == "15" || value.length > 18) {
showToast(tip)
return false;
}
//是否为空
if(value === "") {
showToast(tip)
return false;
}
//校验长度,类型
if(isCardNo(value) === false) {
showToast(tip)
return false;
}
//检查省份
if(checkProvince(value) === false) {
showToast(tip)
return false;
}
//校验生日
if(checkBirthday(value) === false) {
showToast(tip)
return false;
}
//检验位的检测
if(checkParity(value) === false) {
showToast(tip)
return false;
}
return true;
};
//检查号码是否符合规范,包括长度,类型
const isCardNo = function(card) {
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
if(reg.test(card) === false) {
return false;
}
return true;
};
var vcity = {
11: "北京",
12: "天津",
13: "河北",
14: "山西",
15: "内蒙古",
21: "辽宁",
22: "吉林",
23: "黑龙江",
31: "上海",
32: "江苏",
33: "浙江",
34: "安徽",
35: "福建",
36: "江西",
37: "山东",
41: "河南",
42: "湖北",
43: "湖南",
44: "广东",
45: "广西",
46: "海南",
50: "重庆",
51: "四川",
52: "贵州",
53: "云南",
54: "西藏",
61: "陕西",
62: "甘肃",
63: "青海",
64: "宁夏",
65: "新疆",
71: "台湾",
81: "香港",
82: "澳门",
91: "国外"
};
//取身份证前两位,校验省份
const checkProvince = function(card) {
var province = card.substr(0, 2);
if(vcity[province] == undefined) {
return false;
}
return true;
};
const checkBirthday = function(card) {
var len = card.length;
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if(len == "15") {
var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
var arr_data = card.match(re_fifteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date("19" + year + "/" + month + "/" + day);
return verifyBirthday("19" + year, month, day, birthday);
}
//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
if(len == "18") {
var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
var arr_data = card.match(re_eighteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date(year + "/" + month + "/" + day);
return verifyBirthday(year, month, day, birthday);
}
return false;
};
//校验日期
const verifyBirthday = function(year, month, day, birthday) {
var now = new Date();
var now_year = now.getFullYear();
//年月日是否合理
if(
birthday.getFullYear() == year &&
birthday.getMonth() + 1 == month &&
birthday.getDate() == day
) {
//判断年份的范围(3岁到100岁之间)
var time = now_year - year;
if(time >= 0 && time <= 100) {
return true;
}
return false;
}
return false;
};
//校验位的检测
const checkParity = function(card) {
//15位转18位
card = changeFivteenToEighteen(card);
var len = card.length;
if(len == "18") {
var arrInt = new Array(
7,
9,
10,
5,
8,
4,
2,
1,
6,
3,
7,
9,
10,
5,
8,
4,
2
);
var arrCh = new Array(
"1",
"0",
"X",
"9",
"8",
"7",
"6",
"5",
"4",
"3",
"2"
);
var cardTemp = 0,
i,
valnum;
for(i = 0; i < 17; i++) {
cardTemp += card.substr(i, 1) * arrInt[i];
}
valnum = arrCh[cardTemp % 11];
if(valnum == card.substr(17, 1)) {
return true;
}
return false;
}
return false;
};
//15位转18位身份证号
const changeFivteenToEighteen = function(card) {
if(card.length == "15") {
var arrInt = new Array(
7,
9,
10,
5,
8,
4,
2,
1,
6,
3,
7,
9,
10,
5,
8,
4,
2
);
var arrCh = new Array(
"1",
"0",
"X",
"9",
"8",
"7",
"6",
"5",
"4",
"3",
"2"
);
var cardTemp = 0,
i;
card = card.substr(0, 6) + "19" + card.substr(6, card.length - 6);
for(i = 0; i < 17; i++) {
cardTemp += card.substr(i, 1) * arrInt[i];
}
card += arrCh[cardTemp % 11];
return card;
}
return card;
};
2. 身份证号获取性别:
const analyzeIDSex = function(IDCard) {
var sex = "";
//获取用户身份证号码
var userCard = IDCard;
//如果身份证号码为undefind则返回空
if(!userCard) {
return sex;
}
//获取性别
if(parseInt(userCard.substr(16, 1)) % 2 == 1) {
sex = '男'
} else {
sex = '女'
}
return sex;
}
3.根据身份证号计算年龄:
const analyzeIDCard = function(IDCard) {
var sexAndAge = {};
//获取用户身份证号码
var userCard = IDCard;
//如果身份证号码为undefind则返回空
if(!userCard) {
return sexAndAge;
}
if(IDCard.length < 11) {
tipToast("请输入有效的身份证号!");
return sexAndAge;
}
//获取出生年月日
var yearBirth = Number(userCard.substring(6, 10));
var monthBirth = Number(userCard.substring(10, 12));
var dayBirth = Number(userCard.substring(12, 14));
//获取当前年月日并计算年龄
var myDate = new Date();
var monthNow = myDate.getMonth() + 1;
var dayNow = myDate.getDate();
var age = myDate.getFullYear() - yearBirth;
if(monthNow < monthBirth || (monthNow == monthBirth && dayNow < dayBirth)) {
age--;
}
//得到年龄
sexAndAge.age = age;
if(sexAndAge.age < 1) {
let birthDate = new Date(yearBirth + '/' + monthBirth + '/' + dayBirth);
let nowDate = new Date();
let days = ((nowDate.getTime() - birthDate.getTime()) / (1000 * 60 * 60 * 24));
return(days.toFixed(2)) / 365;
} else {
//返回年龄
return sexAndAge.age;
}
};
4.根据出生日期计算出年龄(1993-06-23):
const jsGetAge = function(strBirthday){
var returnAge;
if(!strBirthday){return}
var strBirthdayArr=strBirthday.split("-");
var birthYear = strBirthdayArr[0];
var birthMonth = strBirthdayArr[1];
var birthDay = strBirthdayArr[2];
let d = new Date();
var nowYear = d.getFullYear();
var nowMonth = d.getMonth() + 1;
var nowDay = d.getDate();
if(nowYear == birthYear){
returnAge = 0;//同年 则为0岁
}else{
var ageDiff = nowYear - birthYear ; //年之差
if(ageDiff > 0){
if(nowMonth == birthMonth) {
var dayDiff = nowDay - birthDay;//日之差
if(dayDiff < 0){
returnAge = ageDiff - 1;
}else{
returnAge = ageDiff ;
}
}else{
var monthDiff = nowMonth - birthMonth;//月之差
if(monthDiff < 0){
returnAge = ageDiff - 1;
}else{
returnAge = ageDiff ;
}
}
}else{
returnAge = -1;//返回-1 表示出生日期输入错误 晚于今天
}
}
return returnAge;//返回周岁年龄
};