讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

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

落晨酱_8397

落晨酱_8397

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

|

589人浏览过

|

来源于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 位数字:

Zyt text to digital person
Zyt text to digital person

使用禅境文字转数字人API,创建AI人像图片,将其转换为说话视频,可选运行LoRA训练,轮询异步任务等。

下载
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工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

6364

2023.10.24

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

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

3484

2024.02.23

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

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

1932

2025.10.17

while的用法
while的用法

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

354

2023.09.25

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

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

1918

2023.08.03

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

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

3164

2023.09.04

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

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

6364

2023.10.24

字符串介绍
字符串介绍

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

6509

2023.11.24

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Postman Native Git工作流指南
Postman Native Git工作流指南

共0课时 | 0人学习

vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 8.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn