VIN 车架号 模11校验

2020-08-08  本文已影响0人  戈壁堂

Vehicle identification number

第9位为校验码,只能是数字0-9或X(罗马数字10),

每个字母代表的值(数字则为数字本身的值)——


每个位置的权重数——例如,第一位权重为8,第17位权重为2。第9位是校验位,所以权重为0。0乘任何数还是0。

假设VIN号码为1M8GDM9A_KP042788 (第9位为校验位,忽略),那么检查规则为——

最终将第四行都加起来结果为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)
}
上一篇 下一篇

猜你喜欢

热点阅读