今天正好遇到了统一社会信用代码校验方面的问题,找了下以前的代码,发现写的很啰嗦,所以想着重新实现一下。
这里是统一社会信息代码的编码守则: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
}