表单校验 身份证

表单校验

//表单中的某一项,校验身份证

            <Form.Item
                          name="idNumber"
                          label="身份证号码"
                          rules={[
                            {
                              required: true,
                            },
                            ({ getFieldValue }) => ({
                              validator(_, value) {
                                if (isChineseIDCardNumber(value)) {   //调用isChineseIDCardNumber
                                  return Promise.resolve();
                                }
                                return Promise.reject(
                                  new Error('您输入的身份证有误'),
                                );
                              },
                            }),
                          ]}
                        >
                          <Input
                            placeholder="请输入身份证号码"
                            style={{ width: '90%' }}
                          />
                        </Form.Item>
const testRegExp = /^[1-9]([0-9]{14}|[0-9]{16}[0-9Xx])$/;
const areaMap = [
  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,
];
const weightMap = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const codeMap = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

const isValidDate = (year, month, day) => {
  const date = new Date(year, month - 1, day);
  return (
    date.getFullYear() === year &&
    date.getMonth() + 1 === month &&
    date.getDate() === day &&
    date.getTime() < new Date().getTime()
  );
};

/**
 * 检测 `value` 是否是中国大陆身份证号码。
 *
 * @param value 要检测的值
 * @returns 是(true)或否(false)
 * @see https://my.oschina.net/labrusca/blog/306116
 */
export default function isChineseIDCardNumber(value) {
  const len = value.length;

  // 长度错误
  if (len !== 15 && len !== 18) {
    return false;
  }

  // 模式校验
  if (!testRegExp.test(value)) {
    return false;
  }

  // 地区校验
  if (areaMap.indexOf(+value.substr(0, 2)) === -1) {
    return false;
  }

  // 15 位
  if (len === 15) {
    return isValidDate(
      +`19${value.substr(6, 2)}`,
      +value.substr(8, 2),
      +value.substr(10, 2),
    );
  }

  // 18 位
  if (
    !isValidDate(
      +value.substr(6, 4),
      +value.substr(10, 2),
      +value.substr(12, 2),
    )
  ) {
    return false;
  }

  // 校验码
  const sum = value
    .split('')
    .slice(0, 17)
    .reduce((s, num, index) => {
      return (s += +num * weightMap[index]);
    }, 0);
  return codeMap[sum % 11] === value[17].toUpperCase();
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值