js校验车架号VIN算法
算法说明:
车辆识别代码的第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]}