EAN码知识及校验位的计算

国际商品编码(International Article Number),即欧洲商品编码(European Article Number, EAN),原来只是欧洲范围内商品,而现在已是全球范围内产品交易的商品代码。为了适应读码器辨认的需要,这些代码又被做成大家熟知的条形码。EAN码又分EAN-13码和EAN-8码,EAN-13码是为普通商品设置,而EAN-8是专门为小商品设置的。

EAN码组成及意义

国家代码和生产商代码由EAN各国总部具体发放和管理,货品代码由由厂商自行设定。

EAN-13码
  • 国家代码(前3位)
  • 生产商代码(后4位)
  • 货品代码(再5位)
  • 计算机校验码(最后1位)
EAN-8码
  • 国家代码(前3位)
  • 生产商代码(后2位)
  • 货品代码(再2位)
  • 计算机校验码(最后1位)

EAN-13码校验位计算

  1. 取前12位码
  2. 求奇数位和A
  3. 求欧数为和并取3倍值得到B
  4. AB的和取个位数C,用10C得到的值D就是校验位
实例
  1. 假设某国际商品编码的前 12 位是:490-8569-21968
  2. A = (4+0+5+9+1+6)=25
  3. B = (9+8+6+2+9+8)*3 = 126
  4. C = (25+126) % 10 = 1; D = 10 - 1 = 9;
  5. 完整的国际商品编码为 490-8569-21968-9
OC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
+ (int)getStandardUPCEANCheckNum:(NSString *)s {
int length = (int)[s length];
int sum = 0;

for (int i = length - 1; i >= 0; i -= 2) {
int digit = (int)[s characterAtIndex:i] - (int)'0';
if (digit < 0 || digit > 9) {
@throw [NSException exceptionWithName:@"error" reason:@"字符应该为数字" userInfo:nil];
}
sum += digit;
}

sum *= 3;

for (int i = length - 2; i >= 0; i -= 2) {
int digit = (int)[s characterAtIndex:i] - (int)'0';
if (digit < 0 || digit > 9) {
@throw [NSException exceptionWithName:@"error" reason:@"字符应该为数字" userInfo:nil];
}
sum += digit;
}

return (1000 - sum) % 10;
}

EAN-8码校验位计算

在前面补00000,按照EAN-13码方式计算

参考链接