- 业务需求,需要用到非常严格的身份证号格式校验
- 这里校验方法经过测试真实身份证号码日期改一位都不行,必须完全真实号码
- 以下内容是项目中用到的校验方法,记录下来防止以后再用到
import check from "../../utils/CheckIdCardUtil";
<Col span={8}>
<Form.Item label="身份证号">
{getFieldDecorator('sfzmhm', {
initialValue: applicantInfo.sfzmhm,
rules: [
{required: true, message: "手机号码不能为空"},
{
validator: (_, value) =>
!value || check(value) ? Promise.resolve() : Promise.reject(new Error('请输入正确的身份证号'))
},
{}
],
normalize:vin =>{
if(vin && vin !== undefined){
return vin.toUpperCase()
}
}
})(
<Input
size={this.CONSTANT.SIZE}
placeholder="请输入"
allowClear={true}
/>
)}
</Form.Item>
</Col>
import moment from "moment";
const BIRTH_DATE_FORMAT = "YYYYMMDD";
const MINIMAL_BIRTH_DATE = new Date(-2209017600000);
const NEW_CARD_NUMBER_LENGTH = 18;
const OLD_CARD_NUMBER_LENGTH = 15;
const VERIFY_CODE = [ '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' ];
const VERIFY_CODE_WEIGHT = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
export default function check(cardNumber){
if (null != cardNumber){
if (OLD_CARD_NUMBER_LENGTH == cardNumber.length){
cardNumber = contertToNewCardNumber(cardNumber);
}
return validate(cardNumber);
}
return false;
}
function validate(cardNumber){
let result = true;
result = result && (null != cardNumber);
result = result && NEW_CARD_NUMBER_LENGTH == cardNumber.length;
for (let i = 0; result && i < NEW_CARD_NUMBER_LENGTH - 1; i++){
let ch = cardNumber.charAt(i);
result = result && ch >= '0' && ch <= '9';
}
result = result
&& (calculateVerifyCode(cardNumber) == cardNumber
.charAt(NEW_CARD_NUMBER_LENGTH - 1));
let birthDate = moment(getBirthDayPart(cardNumber));
result = result && null != birthDate;
result = result && birthDate.isBefore(new Date());
result = result && birthDate.isAfter(MINIMAL_BIRTH_DATE);
let birthdayPart = getBirthDayPart(cardNumber);
let realBirthdayPart = moment(birthDate).format(BIRTH_DATE_FORMAT);
result = result && (birthdayPart == realBirthdayPart);
return result;
}
function getBirthDayPart(cardNumber){
return cardNumber.substring(6, 14);
}
function calculateVerifyCode(cardNumber){
let sum = 0;
for (let i = 0; i < NEW_CARD_NUMBER_LENGTH - 1; i++){
let ch = cardNumber.substr(i,1);
sum += (parseInt(ch - '0')) * VERIFY_CODE_WEIGHT[i];
}
return VERIFY_CODE[sum % 11];
}
function contertToNewCardNumber(oldCardNumber){
const pre = oldCardNumber.substring(0, 6)+"19"+oldCardNumber.substring(6);
return pre+calculateVerifyCode(pre);
}