车辆识别码VIN校验位计算方法及实现-Java

校验规则:

校验码一共17位
校验码不包含 I(字母) Q O(字母)
第九位为校验位,只会出现0-9与X“”
第十位表示年份,不包括 0 I(字母) O(字母) Q U Z
12-17为顺序位,只会出现数字

错误:LUA U2A UB3 GE3 834 67
正确:
LSV RJ4 1T5 922 900 89
LFV 2A2 1K6 A30 923 99

计算方法:

 代码实现:

public class VinUtil {
    /**
     * 字符权重表
     */
    private static final Map CHAR_WEIGHTS = new HashMap<>();
    /**
     * 位置权重表
     */
    private static final int[] POS_WEIGHTS = new int[]{8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2};
//提前加载
    static {
        for (int i = 0; i < 10; i++) {
            CHAR_WEIGHTS.put(String.valueOf(i).charAt(0), i);
        }
        CHAR_WEIGHTS.put('A', 1);

        CHAR_WEIGHTS.put('B', 2);

        CHAR_WEIGHTS.put('C', 3);

        CHAR_WEIGHTS.put('D', 4);

        CHAR_WEIGHTS.put('E', 5);

        CHAR_WEIGHTS.put('F', 6);

        CHAR_WEIGHTS.put('G', 7);

        CHAR_WEIGHTS.put('H', 8);

        CHAR_WEIGHTS.put('J', 1);

        CHAR_WEIGHTS.put('K', 2);

        CHAR_WEIGHTS.put('L', 3);

        CHAR_WEIGHTS.put('M', 4);

        CHAR_WEIGHTS.put('N', 5);

        CHAR_WEIGHTS.put('P', 7);

        CHAR_WEIGHTS.put('R', 9);

        CHAR_WEIGHTS.put('S', 2);

        CHAR_WEIGHTS.put('T', 3);

        CHAR_WEIGHTS.put('U', 4);

        CHAR_WEIGHTS.put('V', 5);

        CHAR_WEIGHTS.put('W', 6);

        CHAR_WEIGHTS.put('X', 7);

        CHAR_WEIGHTS.put('Y', 8);

        CHAR_WEIGHTS.put('Z', 9);

    }


    public static boolean checkVin(String vin) {
        vin = vin.toUpperCase();
        if (!vin.substring(11,vin.length()).matches("^[0-9]{6}$")) {
            return false;
        }
        if(vin == null|| vin.indexOf("O") >= 0|| vin.indexOf("I") >= 0 || vin.indexOf("Q") >= 0){
            return false;
        }else if(vin.length() == 17){
            int sum = 0;
            int checkSum = 0;
            for (int i = 0; i < vin.length(); i++) {
                char code = vin.charAt(i);
                Integer cw = (Integer) CHAR_WEIGHTS.get(code);
                if (cw == null) {
                    return false;
                }
                int pw = POS_WEIGHTS[i];
                sum += cw * pw;
                if (i == 8) {
                    // 获取校验位的值
                    if (code == 'X') {
                        checkSum = 10;
                    } else if (code >= '0' && code <= '9') {
                        checkSum = Integer.parseInt(String.valueOf(code));
                    } else {
                        return false;
                    }
                }
                //判断第10位
                if(i==9){
                    if(code == 'O'||code == 'I'||code=='Q'||code=='U'||code=='Z'||code=='0'){
                        return false;
                    }
                }
            }
            return checkSum == sum % 11;
        }else {
            return false;
        }

    }

}

Integer和int的区别

  • Integer是int的包装类, int是基本数据类型

最主要的区别就是这句 一个是基本数据类型, 一个是类,

但其实其中隐含的细节很多,比如:

  • Integer的默认初始值是null,而int的默认初试值是0
  • Integer变量必须先实例,int变量则可以直接使用

字符串中的数转Int型: 

        char code = vin.charAt(i);

        int checkSum = 0;

        checkSum = Integer.parseInt(String.valueOf(code));

 Java substring() 方法:

 正则表达式:

正则表达式 – 语法_w3cschool

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值