EAN码知识及校验位的计算

887 阅读2分钟

阅读本文大概需要 1 分钟。

EAN码组成及意义

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

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

EAN-13码

  • 国家代码(前3位)
  • 生产商代码(后4位)
  • 货品代码(再5位)
  • 计算机校验码(最后1位)
EAN-13码校验位计算
  • 取前12位码
  • 求奇数位和A
  • 求欧数为和并取3倍值得到B
  • 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
+ (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码

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

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

参考链接