2013-06-21 17 views
4

我們可以使用任何格式來識別UPC代碼,而不是隻檢查數字位數嗎?如何識別一個數字是一個UPC代碼還是簡單數字?有沒有特定的格式來識別UPC代碼?

+0

的UPC [包括的校驗碼(http://en.wikipedia.org/wiki/Universal_Product_Code#Check_digits),所以您可以確定給定的12位數字是否是有效的UPC。根據您的應用程序,您可能可以使用Wikipedia頁面上的其他信息來決定給定的數字是否是您感興趣的UPC。 – bdesham

+1

這實際上不是iOS或Objective-C特定問題但在StackOverflow中沒有「upc」標記,因此我無法編輯您的問題。 [在這個問題中有一些C#代碼,看起來很容易移植到你正在嘗試做的事情](http://stackoverflow.com/questions/10143547/how-do-i-validate-a-upc-or-ean -碼)。 –

回答

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; 
} 
+0

Thanks.It工作正常:) –

1

有沒有Objective-C的格式或這樣的方式,你必須自己實現,將功能:

一)檢查的位數 b)檢查校驗位