算法说明:
车辆识别代码的第9位是检验位,检验位可用0至9中任一数字或字母“X”表示。其它位置的数字和字母代表的意义个厂家含义可能不同,但在VIN码的其他16位字码确定后,按以下办法计算得出第九位的检验位。
首先将其它16位中的字母按下列关系转换成数字:
A=1 B=2 C=3 D=4 E=5 F=6 G=7 H=8 J=1 K=2 L=3 M=4 N=5 P=7 R=9 S=2 T=3 U=4 V=5 W=6 X=7 Y=8 Z=9
每个位置都有个加权数:
位置:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
权数:8 7 6 5 4 3 2 10 * 9 8 7 6 5 4 3 2
终于将检验位之外的16位每一位的加权系数乘以此位的对应值,再将各乘积相加,求得的和除以11,所得的余数就是检验位的数值。如果余数为10,则检验位为字母“X”。

js代码如下:

// 校验车架号
function isValidVIN (vin) {
if (!vin) {
return true
}
if (vin.length !== 17) {
return false
}
if (!/^[A-Z0-9]+$/.test(vin)) {
return false
}
let charToNum = {'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'J':1,'K':2,'L':3,'M':4,'N':5,'P':7,'R':9,'S':2,'T':3,'U':4,'V':5,'W':6,'X':7,'Y':8,'Z':9};
let obj = 0;
let arr = new Array();
for (let i = 0; i < vin.length; i++) {
let temp = vin.charAt(i);
if (charToNum[temp]) {
arr[i] = charToNum[temp];
} else {
arr[i] = Number(temp);
}
if (i == 8) {
arr[i] = vin.charAt(i);
}
}
let a1 = 8;
for (let i = 0; i < 7; i++) {
obj += Number(arr[i]) * a1;
a1--;
}
obj += Number(arr[7]) * 10;
let a2 = 9;
for (let i = 9; i < 17; i++) {
obj += Number(arr[i]) * a2;
a2--;
}
let result = Number(obj) % 11;
if (parseInt(result) === 10) {
result = 'X';
}
return result == arr[8]
}

posted on 2025-09-18 20:45  ycfenxi  阅读(7)  评论(0)    收藏  举报