- 1 ~ 3 位为世界制造商标识码(简称“WMI”)
- 4 ~ 9 位为车辆说明部分(简称“VDS”)
- 10 ~ 17位为车辆指示码(简称“VIS”)
第9位为校验码,只能是数字0-9或X(罗马数字10),
- 其他16位字码对应数值乘以其所位置权重数
- 上一步中的每一个位置的和除以11得到余数
- 当余数为0-9时候,余数就是检验数字;当余数为10时,X为检验代码
每个字母代表的值(数字则为数字本身的值)——
每个位置的权重数——例如,第一位权重为8,第17位权重为2。第9位是校验位,所以权重为0。0乘任何数还是0。
假设VIN号码为1M8GDM9A_KP042788
(第9位为校验位,忽略),那么检查规则为——
- 第一行为VIN的号码
- 第二行为每个VIN号码的(数字)值
- 第三行为每个位置的权重值
- 第四行我每个位置最终的计算值
最终将第四行都加起来结果为351
, 除以11,余数为10
。根据规则,校验码为X
。
所以最终的VIN号码为1M8GDM9AXKP042788
func checkVinDigit(vin string) string {
transKeys := map[string]int{"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}
positionWeight := map[int]int{1: 8, 2: 7, 3: 6, 4: 5, 5: 4, 6: 3, 7: 2, 8: 10, 9: 0, 10: 9, 11: 8, 12: 7, 13: 6, 14: 5, 15: 4, 16: 3, 17: 2}
var sum int
for i, c := range vin {
var s = string(c)
if i != 8 {
var val int
if v, value := transKeys[s]; value {
val = v
} else {
in, _ := strconv.Atoi(s)
val = in
}
sum += val * positionWeight[i+1]
}
}
r := sum % 11
if r == 10 {
return "X"
}
return strconv.Itoa(r)
}
网友评论