如何检测 UPC 代码中的错误?

How do I detect errors in UPC codes?

我知道 UPC 代码有一个校验位以及如何使用这个校验位来查看代码是否有效。

如果代码无效,我的程序需要告诉我错误在哪里。我知道这是可以做到的,但是怎么做呢?我需要检测单个替换错误(例如,在 2 的位置键入 5)和换位错误(例如,键入 12 而不是 21)。

看似简单,但我想不通

当被认为是 String(推荐方式)时,以下代码将检测 UPC-A 代码(12 位)中的错误。

String upc = "074985003004";    // UPC as a string
int sum = 0;
for(int i = 0; i < a.length(); i++) {
    sum += (i%2==0) ? (3*(upc.charAt(i)-48)) : (upc.charAt(i)-48);
}
if (sum % 10 == 0) {
    System.out.println("true");
} else {
    System.out.println("false");
}

或者,可以在以下代码中使用 long:(注意:必须删除前导零。)

long upc = 74985003004L;  // omit leading zeros;
int sum =0;
for(int i=0; i < 12; i++) {
    sum += (i%2 == 0) ? (upc % 10) : (sum += 3*(upc % 10));
    upc /= 10;
}
if (sum % 10 == 0) {
    System.out.println("true");
} else System.out.println("false");

通常最好在测试前验证 UPC 代码。即检查以确保它包含正确的数字位数并且仅包含数字 0-9。如link中所述:https://en.wikipedia.org/wiki/Universal_Product_CodeUPC-A检测100%的个位数错误和90%的2位换位错误.

*UPC不支持纠错。但是,如果您知道哪个数字不正确,您可以尝试该数字的所有 10 个可能值,直到没有检测到错误(有效的 UPC 代码)。