本文介绍如何使用JavaScript验证汽车识别代码(VIN)的第9位检验位。VIN码共17位,第9位为校验位,通过前16位字符按特定加权系数计算得出。文章提供了完整的JS代码示例,包括字母数字映射表、加权系数数组及校验逻辑,用于判断输入的VIN码是否合法。
VIN码第9位校验位算法原理
车辆识别代码(VIN)的第9位是检验位,该位置可以使用0到9之间的任意数字或字母“X”来表示。VIN码中其他位置的字符含义因制造商而异,但在确定其余16位字符后,需通过特定算法计算出第9位的检验位。
首先将其它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。
VIN码的每一位都对应一个固定的加权系数。
位置索引从1到17: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 0 9 8 7 6 5 4 3 2。注意第9位(检验位本身)的权数为0。
计算方法是:将前16位中每一位的字符值乘以其对应的权数,将所有乘积相加得到总和。将该总和除以11,所得余数即为第9位检验位的数值。若余数为10,则检验位为字母“X”。
JavaScript验证代码实现
以下是使用JavaScript实现该验证逻辑的代码示例。
代码如下:
<script type="text/javascript">
var Arr = new Array();
var Brr = new Array();
Arr['A'] = 1;
Arr['B'] = 2;
Arr['C'] = 3;
Arr['D'] = 4;
Arr['E'] = 5;
Arr['F'] = 6;
Arr['G'] = 7;
Arr['H'] = 8;
Arr['J'] = 1;
Arr['K'] = 2;
Arr['L'] = 3;
Arr['M'] = 4;
Arr['N'] = 5;
Arr['P'] = 7;
Arr['R'] = 9;
Arr['S'] = 2;
Arr['T'] = 3;
Arr['U'] = 4;
Arr['V'] = 5;
Arr['W'] = 6;
Arr['X'] = 7;
Arr['Y'] = 8;
Arr['Z'] = 9;
Arr['1'] = 1;
Arr['2'] = 2;
Arr['3'] = 3;
Arr['4'] = 4;
Arr['5'] = 5;
Arr['6'] = 6;
Arr['7'] = 7;
Arr['8'] = 8;
Arr['9'] = 9;
Arr['0'] = 0;
Brr[1]=8;
Brr[2]=7;
Brr[3]=6;
Brr[4]=5;
Brr[5]=4;
Brr[6]=3;
Brr[7]=2;
Brr[8]=10;
Brr[9]=0;
Brr[10]=9;
Brr[11]=8;
Brr[12]=7;
Brr[13]=6;
Brr[14]=5;
Brr[15]=4;
Brr[16]=3;
Brr[17]=2;
function getCheckCode(sVIN)
{
var sKYZF="ABCDEFGHJKLMNPRSTUVWXYZ1234567890";
var sJYW ='';
var bl = false;
var blKYZF = false;
if (sVIN.length == 17)
{
var iJQS=0,intTemp=0;
ht = Arr;
htZM = Brr;
try
{
for (var i = 0; i <sVIN.length; i++)
{
if (sKYZF.indexOf(sVIN.substr(i, 1)) != -1)
{
blKYZF = true;
iJQS = iJQS + parseInt(ht[sVIN.substr(i, 1)]) * parseInt(htZM[(i + 1)]);
}
else
{
blKYZF = false;
break;
}
}
if (blKYZF)
{
intTemp = iJQS%11;
if (intTemp == 10)
{
sJYW = "X";
}
else
{
sJYW = intTemp.toString();
}
if (sJYW == sVIN.substr(8, 1)) bl = true;
}
else
{
bl = false;
}
}
catch(err)
{
bl = false;
}
}
return bl;
}
alert(getCheckCode("WVGAB97PXCD010692"));
</script>