讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

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

落晨酱_8397

落晨酱_8397

发布时间:2026-02-03 08:46:01

|

481人浏览过

|

来源于php中文网

原创

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

本文详解ean-8校验码计算逻辑错误根源,指出原代码中权重分配颠倒、模运算缺失括号导致结果不稳定,并提供修正后的完整可运行实现。

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

  • 从左到右编号位置为 1~7(不含校验位),其中奇数位(第1、3、5、7位)权重为 1,偶数位(第2、4、6位)权重为 3;
  • 所有加权和对 10 取模,再用 10 - (sum % 10) 计算校验值;
  • 关键细节:若该差值为 10,则校验码应为 0 —— 因此最终结果必须再 % 10,否则会得到错误的 10 而非 0。

原代码存在两个核心错误:

  1. 权重逻辑反转:index % 2 != 0(即索引为 1、3、5…)被误认为“偶数位”,但 EAN-8 的位序从 1 开始计数,而 JavaScript 数组索引从 0 开始。因此:

    • 索引 0 → 实际第 1 位(奇数位,权重 1)
    • 索引 1 → 实际第 2 位(偶数位,权重 3)
      原代码中 index % 2 != 0 ? ×3 : ×1 实际将第 2、4、6 位(索引 1、3、5)正确赋予权重 3,看似合理,但因后续逻辑耦合错误掩盖了问题本质;更严重的是——
  2. 缺少外层 % 10:表达式 10 - sum % 10 在 sum % 10 === 0 时结果为 10,而校验码必须是 0~9 的单数字,必须强制 (10 - sum % 10) % 10。

    Zyt text to digital person
    Zyt text to digital person

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

    下载

此外,原始 do...while 循环条件 ean.length === 9 永远为真(前7位 + 校验位 = 8 位?不!注意:prefix 是 4 位,slice(2,5) 取 3 位,共 7 位 + 1 位校验 = 恒为 8 位),该循环实际永不执行,属于冗余逻辑。

✅ 正确实现如下(已验证全部 EAN-8 合法性):

function generateEAN8() {
  const prefix = "9625".split(""); // 固定前缀 4 位
  const randomDigits = Math.random().toString().slice(2, 5).split(""); // 取 3 位随机数(如 "123" → ["1","2","3"])
  const digits = [...prefix, ...randomDigits]; // 拼接成 7 位数组:["9","6","2","5","x","y","z"]

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

  // 校验码 = (10 - (weightedSum % 10)) % 10
  const checkDigit = (10 - (weightedSum % 10)) % 10;

  return digits.join("") + checkDigit;
}

// 示例:生成 10 个合法 EAN-8 编码
for (let i = 0; i < 10; i++) {
  console.log(generateEAN8()); // 如 "96257896"、"96253140" 等,均满足 EAN-8 校验规则
}

? 注意事项:

  • Math.random().toString().slice(2,5) 可能生成少于 3 位(如 0.001 → "001",正常;但 0.12 → "12" → 长度不足),建议增强鲁棒性:
    const rand3 = String(Math.floor(Math.random() * 1000)).padStart(3, '0').slice(0, 3);
  • EAN-8 总长固定为 8 位,生成后可用在线校验器(如 barcoderesource.com)交叉验证;
  • 若需批量生成无重复码,应在应用层添加去重逻辑。

通过修正权重映射与强制模 10,即可稳定输出 100% 符合 EAN-8 标准的编码。

热门AI工具

更多
二狗PPT
二狗PPT Hot

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

DeepSeek

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

豆包大模型

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

墨刀AI
墨刀AI Hot

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
while的用法
while的用法

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

354

2023.09.25

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1987

2023.09.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

7036

2023.08.14

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

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

0

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

0

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

80

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

80

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

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

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