Ios 如何识别一个数字是UPC代码还是简单的数字?是否有任何特定的格式来标识UPC代码?
我们是否可以使用任何格式来识别UPC代码,而不是只检查位数?没有objective-c格式或方法,您必须自己实现以下功能: a) 检查位数Ios 如何识别一个数字是UPC代码还是简单的数字?是否有任何特定的格式来标识UPC代码?,ios,objective-c,barcode,checksum,Ios,Objective C,Barcode,Checksum,我们是否可以使用任何格式来识别UPC代码,而不是只检查位数?没有objective-c格式或方法,您必须自己实现以下功能: a) 检查位数 b) 检查校验和数字我有一些Objective-C代码,用于验证用户输入的字符串,以查看它是否是有效的UPC或EAN条形码。这支持UPC、ISBN和EAN(8、13和14) 如果您有一个数字,请首先将其转换为字符串以使用此方法。此方法假定条形码字符串只有数字0-9或X(某些ISBN条形码可以有X) UPC,因此您可以确定给定的12位数字是否为有效的UPC。根
b) 检查校验和数字我有一些Objective-C代码,用于验证用户输入的字符串,以查看它是否是有效的UPC或EAN条形码。这支持UPC、ISBN和EAN(8、13和14) 如果您有一个数字,请首先将其转换为字符串以使用此方法。此方法假定条形码字符串只有数字0-9或X(某些ISBN条形码可以有X)
UPC,因此您可以确定给定的12位数字是否为有效的UPC。根据您的应用程序,您可能可以使用Wikipedia页面上的一些其他信息来确定给定的数字是否是您感兴趣的UPC类型。这确实不是一个iOS或Objective-C特定的问题,但StackOverflow中没有“UPC”标记,我无法编辑您的问题。
- (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;
}
}
- (int)intForDigitAt:(NSUInteger)index {
unichar ch = [self characterAtIndex:index];
if (ch >= '0' && ch <= '9') {
return ch - '0';
} else
return 0;
}