如何识别一个数字是UPC码还是普通数字?有没有特定的格式来识别UPC码?

5
有没有一种格式可以用来识别UPC码,而不仅仅是检查数字的位数?

UPC码包括校验位,因此您可以确定给定的12位数字是否为有效的UPC码。根据您的应用程序,您可能能够使用该维基百科页面上的其他信息来决定给定的数字是否是您感兴趣的UPC码类型。 - bdesham
1
这个问题并不是针对iOS或Objective-C特定的,但在StackOverflow上没有"upc"标签供我编辑你的问题。这个问题中有一些C#代码,看起来很容易移植到你正在尝试做的事情 - Michael Dautermann
2个回答

9
我有一些Objective-C代码,用于验证用户输入的字符串是否为有效的UPC或EAN条形码。此方法支持UPC、ISBN和EAN(8、13和14)。
如果您有一个数字,请先将其转换为字符串以使用此方法。该方法假定条形码字符串仅包含数字0-9或X(某些ISBN条形码可以有X)。
- (BOOL)validBarcode:(NSString *)code {
    int len = [code length];
    switch (len) {
        case 8: // EAN-8
        {
            int check = [code intForDigitAt:7];
            int val = (10 - 
                       (([code intForDigitAt:1] + [code intForDigitAt:3] + [code intForDigitAt:5] +
                         ([code intForDigitAt:0] + [code intForDigitAt:2] + [code intForDigitAt:4] + [code intForDigitAt:6]) *
                         3) % 10)) % 10;

            return check == val;
        }
        case 10: // ISBN
        {
            int check = [code intForDigitAt:9];
            int sum = 0;
            for (int i = 0; i < 9; i++) {
                sum += [code intForDigitAt:i] * (i + 1);
            }
            int val = sum % 11;

            if (val == 10) {
                return [code characterAtIndex:9] == 'X' || [code characterAtIndex:9] == 'x';
            } else {
                return check == val;
            }
        }
        case 12: // UPC
        {
            int check = [code intForDigitAt:11];
            int val = (10 - 
                       (([code intForDigitAt:1] + [code intForDigitAt:3] + [code intForDigitAt:5] + [code intForDigitAt:7] + [code intForDigitAt:9] + 
                         ([code intForDigitAt:0] + [code intForDigitAt:2] + [code intForDigitAt:4] + [code intForDigitAt:6] + [code intForDigitAt:8] + [code intForDigitAt:10]) *
                         3) % 10)) % 10;

            return check == val;
        }
        case 13: // EAN-13
        {
            int check = [code intForDigitAt:12];
            int val = (10 - 
                       (([code intForDigitAt:0] + [code intForDigitAt:2] + [code intForDigitAt:4] + [code intForDigitAt:6] + [code intForDigitAt:8] + [code intForDigitAt:10] + 
                         ([code intForDigitAt:1] + [code intForDigitAt:3] + [code intForDigitAt:5] + [code intForDigitAt:7] + [code intForDigitAt:9] + [code intForDigitAt:11]) *
                         3) % 10)) % 10;

            return check == val;
        }
        case 14: // EAN-14
        {
            int check = [code intForDigitAt:13];
            int val = (10 - 
                       (([code intForDigitAt:1] + [code intForDigitAt:3] + [code intForDigitAt:5] + [code intForDigitAt:7] + [code intForDigitAt:9] + [code intForDigitAt:11] + 
                         ([code intForDigitAt:0] + [code intForDigitAt:2] + [code intForDigitAt:4] + [code intForDigitAt:6] + [code intForDigitAt:8] + [code intForDigitAt:10] + [code intForDigitAt:12]) *
                         3) % 10)) % 10;

            return check == val;
        }
        default:
            return NO;
    }
}

这里使用了我添加到NSString类的一个类别方法:
- (int)intForDigitAt:(NSUInteger)index {
    unichar ch = [self characterAtIndex:index];
    if (ch >= '0' && ch <= '9') {
        return ch - '0';
    } else
        return 0;
}

1

没有 Objective-C 的格式或方法可以做到这一点,你需要自己实现以下功能:

a)检查数字的数量 b)检查校验和数字


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接