说明: 函数入口必须有值,可以是Number类型,也可以是String类型 。(其他类型报错)
flag参数选填:默认是false,返回的是一个布尔值,当验证成功的时候,返回的是true。验证失败,抛出异常。
当flag的参数是true的时候,返回的是IDCard的值,String类型。相当于将数据过滤验证了一遍,当有大量数据是,可以走这一个API。
/**
* 校验身份证是否合格的方法
* @param Card
* @returns {boolean}
*/
export default function isCard(Card,flag = false) {
// 查询输入日期是否有效
// 1.查看isCard是不是数字类型的。如果是数字类型,就转为字符串。
let newVar = typeof Card;
// console.log(newVar);
if(newVar == "number"){
// 是数字,就转
Card = Card.toString();
}
//判断身份证的位数
if(Card.length!== 18){
throw '请检查身份证的位数,本函数只支持18位身份证'
return false;
}
// 1.把年月日剥离出来
const year = Card.slice(6,10);
// console.log(year);
const month = Card.slice(10,12);
// console.log(month);
const day = Card.slice(12,14);
const s = Card.slice(17);
// console.log(s);
// console.log(day);
//2.定义月份的字典;
const set = new Set().add('01').add('02').add('03').add('04').add('05').add('06').add('07').add('08').add('09').add('10').add('11').add('12');;
// console.log(set);
//3.判断月份是否不在0-12的范围内
if(!set.has(month)){
//说明没有这个月份
throw '月份不在范围内';
}else {
// 4.说明月份输入是正确的,那么按照1,3,5,7,8,10,12的口诀,判断他们的天数
if(month=='01'||month=='03'||month=='05'||month=='07'||month=='08'||month=='10'||month=='12'){
if(day>31){
throw '该月份只有31天!!';
return false;
}
}else if(month=='04'||month=='06'||month=='09'|| month=='11'){
if(day>30){
throw '该月份只有30天'
return false;
}
}else {
// 5.特殊的2月,要判断他是闰年还是平年;
if (year % 400 !== 0 && year %4 == 0){
//说明是平年
if(day>28){
throw '该年是平年,只有28天'
return false;
}else {
if (day>29){
throw '该年是润年,只有29天'
return false;
}
}
}
}
}
if(!flag){
return true;
}else {
//统一为大写
return Card.toUpperCase();
}
}