0

0

如何正确生成符合标准的EAN-8条码校验码?

心靈之曲

心靈之曲

发布时间:2026-02-03 08:58:11

|

409人浏览过

|

来源于php中文网

原创

如何正确生成符合标准的EAN-8条码校验码?

本文详解ean-8校验码计算原理与常见实现错误,指出原代码中因运算符优先级缺失和奇偶位逻辑混淆导致校验失败的根本原因,并提供可直接使用的健壮生成函数。

EAN-8 是一种 8 位数字的国际商品编码标准,其最后一位为校验码(Check Digit),必须严格遵循 ISO/IEC 15420 规定的加权模 10 算法:
正确公式:checksum = (10 - (加权和 % 10)) % 10
其中——

  • 左到右数,第 1、3、5、7 位(即索引 0、2、4、6)为奇数位,权重为 1
  • 第 2、4、6、8 位(即索引 1、3、5、7)为偶数位,权重为 3
  • 加权和 = Σ(奇数位数字 × 1) + Σ(偶数位数字 × 3);
  • 最终校验码取 (10 − sum % 10) % 10,确保结果恒为 0–9 的单数字。

原代码存在两个关键缺陷:

  1. 奇偶位逻辑颠倒
    index % 2 != 0 判定的是偶数索引位(如索引 1、3、5…),但 EAN-8 要求第 2、4、6、8 位(索引 1、3、5、7)乘 3 —— 这部分逻辑本身正确;然而后续加权逻辑未对齐「位置权重」本质,且易引发理解偏差。更清晰的方式是显式区分「位序」而非依赖 index % 2 的直觉映射。

  2. 缺少外层 % 10 导致校验码越界
    当加权和能被 10 整除时(如 sum = 30),10 - (30 % 10) 得 10 - 0 = 10,但校验码必须是 0–9 的一位数字。遗漏外层 % 10 会导致结果为 10,破坏 EAN-8 格式(长度变为 9 位),这也是 do...while (ean.length === 9) 循环无法终止的根源。

此外,原始代码使用 Math.random().toString().slice(2, 5) 生成三位随机数存在严重隐患:

  • Math.random() 可能生成类似 0.000123 → .slice(2,5) 得 "000"(合法),但也可能生成 0.999999 → "999",或更糟:0.07 → "07"(仅两位),导致 randoms 数组长度不稳定(如 ["9","6","2","5","0","7"] 仅 6 位),使后续索引错位、校验彻底失效。

✅ 正确做法是强制补零生成严格 3 位数字

Glarity
Glarity

Glarity是一款免费开源的AI浏览器扩展,提供YouTube视频总结、网页摘要、写作工具等功能,支持免费的镜像翻译,电子邮件写作辅助,AI问答等功能。

下载
function getEAN8() {
  const prefix = "9625".split("");
  // 安全生成 3 位随机数字(000–999)
  const rand3 = String(Math.floor(Math.random() * 1000)).padStart(3, "0");
  const digits = [...prefix, ...rand3.split("")]; // 长度恒为 7

  // 计算加权和:索引 0,2,4,6(第1/3/5/7位)×1;索引 1,3,5(第2/4/6位)×3;注意:共7位,第8位待计算
  const weightedSum = digits.reduce((sum, digit, i) => {
    const num = parseInt(digit, 10);
    return sum + (i % 2 === 0 ? num : num * 3); // ✅ 索引0开始:0,2,4,6 → 奇数位(权重1)
  }, 0);

  const checksum = (10 - (weightedSum % 10)) % 10;
  return digits.join("") + checksum;
}

// 示例输出(每次调用均生成合法8位EAN-8)
console.log(getEAN8()); // e.g., "96251378"
console.log(getEAN8()); // e.g., "96258024"

? 验证小技巧:将生成的 EAN-8 字符串输入任意在线 EAN 校验工具(如 GS1 Check Digit Calculator),或手动复核加权和 —— 例如 "96251378":
(9+2+5+3)×1 + (6+5+1+7)×3 = 19 + 57 = 76 → 76 % 10 = 6 → 10−6 = 4 → 4 % 10 = 4 ≠ 最后位 8?等等——注意:此处 digits 是前 7 位,8 是校验位,因此应验算前 7 位 "9625137":
9+2+5+7 = 23(索引 0,2,4,6),6+5+1 = 12(索引 1,3,5)→ 23 + 12×3 = 23 + 36 = 59 → 10−(59%10)=10−9=1 → 校验码应为 1,故 "96251371" 才合法。这印证了函数逻辑的严谨性。

? 总结注意事项

  • EAN-8 总长 8 位,前 7 位含固定前缀 + 随机段,第 8 位为校验码;
  • 权重分配以位置序号(从 1 开始)为准:奇数位 ×1,偶数位 ×3;对应代码中索引 0、2、4、6 为权重 1
  • 必须使用 (10 - sum % 10) % 10,双重取模杜绝 10 的出现;
  • 随机数生成务必保证位数稳定(推荐 padStart(3, "0"));
  • 避免依赖 Math.random().toString().slice() —— 浮点字符串精度与截断行为不可控。

遵循以上原则,即可 100% 生成合规 EAN-8 编码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

233

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

107

2025.10.17

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3.3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号