身份证校验规则

2019/3/15 Javascript

把身份证校验规则整理一下,以后万一能用的到呢。。。

const powers = [
  '7',
  '9',
  '10',
  '5',
  '8',
  '4',
  '2',
  '1',
  '6',
  '3',
  '7',
  '9',
  '10',
  '5',
  '8',
  '4',
  '2'
];

const parityBit = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
// 校验身份证号码的主调用

const validId18 = _id => {
  let id = _id;
  id += '';
  const num = id.substr(0, 17);
  const IparityBit = id.substr(17);
  // let IparityBit = id.substr(17); // 如果允许小写x
  let power = 0;
  for (let i = 0; i < 17; i += 1) {
    // 校验每一位的合法性
    if (num.charAt(i) < '0' || num.charAt(i) > '9') {
      return false;
    }
    // 加权
    power += parseInt(num.charAt(i), 10) * parseInt(powers[i], 10);
  }
  // 取模
  const mod = parseInt(power, 10) % 11;
  //如果小写x也支持
  // if(IparityBit==='x'){ IparityBit = 'X'; }
  if (parityBit[mod] === IparityBit) {
    return true;
  }
  return false;
};

function validId15(_id) {
  let id = _id;
  id += '';
  for (let i = 0; i < id.length; i += 1) {
    // 校验每一位的合法性

    if (id.charAt(i) < '0' || id.charAt(i) > '9') {
      return false;
    }
  }
  const year = id.substr(6, 2);
  const month = id.substr(8, 2);
  const day = id.substr(10, 2);
  // 校验年份位

  if (year < '01' || year > '90') return false;
  // 校验月份

  if (month < '01' || month > '12') return false;
  // 校验日

  if (day < '01' || day > '31') return false;

  return true;
}

/* eslint consistent-return: 0 */
function validId(_id) {
  const id = _id;
  if (id === '') return;
  let valid = false;
  if (id.length === 15) {
    valid = validId15(id);
  } else if (id.length === 18) {
    valid = validId18(id);
  }
  return valid;
}

export default validId;