js实现统一社会信用代码校验

612 阅读1分钟

今天正好遇到了统一社会信用代码校验方面的问题,找了下以前的代码,发现写的很啰嗦,所以想着重新实现一下。

这里是统一社会信息代码的编码守则:c.gb688.cn/bzgk/gb/sho…

// 18位统一社会信用代码校验
export function socialCreditCodeCheck(code) {
  if (code.length !== 18) {
    return '位数不正确'
  }
  if (!/^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/g.test(code)) {
    return '格式不正确'
  }
  // 代码字符集 不含I、O、S、V、Z
  const charts = '0123456789ABCDEFGHJKLMNPQRTUWXY'
  const totalCode = code
    .split('')
    .slice(0, 17)
    .reduce((total, value, index) => {
      // 权重与加权因子相乘之和
      return total + charts.indexOf(value) * (Math.pow(3, index) % 31)
    }, 0)
  
  if (code.substr(-1) !== charts[31 - (totalCode % 31)]) {
    console.log('输入的校验位:', code.substr(-1))
    console.log('校验位应为:', charts[31 - (totalCode % 31)])
    return '校验位不正确'
  }
  return true
}