java-关于商品条码正确性校验的分析与实践
本方法仅适用于13位数字条码、8位数字条码(缩短码是由7位商品代码和1位校验码构成的8位数字的条码)
/* 代码位置序号是指包括校验码在内的,由右至左的顺序号(校验码的代码位置序号为1)
* a. 从代码位置序号2开始,所有偶数位的数字代码求和。
* b. 将步骤a的和乘以3。
* c. 从代码位置序号3开始,所有奇数位的数字代码求和。
* d. 将步骤b与步骤c的结果相加。
* e. 用大于或等于步骤d所得结果且为10最小整数倍的数减去步骤d所得结果,其差即为所求校验码的值。
* 概括:从右到左,偶数位之和乘以3加上奇数位之和(校验码位不算),再求总和的10的余数,用10减去余数,即获得校验码,对比即可判断是否正确
*/
protected static boolean isBarCode(String barCode) {
if (barcode == null || !barcode.matches("\\d+") || (barcode.length() != 8 && barcode.length() != 13)) {
return false; //条码为空--或--含有非数字字符--或--长度不对,不等于8也不等于13
}
barcode = new StringBuilder(barcode).reverse().toString();//将条码字符串倒序转换
int check_num = 0;//校验码
int sum = 0;//求和结果
for (int i = 0; i < barcode.length(); i++) {
if (i==0) {//转换后,第一个数就是校验码
check_num = Integer.parseInt(barcode.substring(i, i + 1));
}else {
int num = Integer.parseInt(barcode.substring(i, i + 1));
sum += (i % 2 == 0) ? num : num * 3; // 转换后,变成了-->偶数位数字求和--加上--奇数位数字求和乘以3
}
}
int check_num_result = 10 - sum % 10; // 计算出的校验码
if (check_num_result == 10) {
check_num_result = 0; // 如果校验码是10,则用0表示
}
return check_num==check_num_result;
}
链接: 中国物品编码中心