求助:生成EAN13条码编码的JS代码无法输出目标编码6BSLLAA*dchgej+
问题分析与修复方案
你需要将EAN13条码6181100327649转换为编码6BSLLAA*dchgej+以适配EAN字体制作视觉内容,但现有JavaScript代码存在关键错误导致无法正常工作,以下是问题排查和修正后的方案:
原代码的错误点
- 正则表达式写法错误:
chaine.match("/^\\d{12}$/")用字符串包裹正则字面量,导致无法正确匹配12位纯数字输入,应直接使用正则表达式/^\d{12}$/。 - 静态方法调用错误:
chaine.fromCharCode()是错误调用方式,fromCharCode是String的静态方法,必须通过String.fromCharCode()调用,否则会抛出函数不存在的错误。 - 变量类型冗余:
tableA初始化为数值0,后续赋值为布尔值,虽不影响逻辑,但建议直接初始化为布尔值保证类型一致。
修正后的代码
function EAN(chaine) { let i = 0; let first = 0; let checksum = 0; let CodeBarre = ""; let tableA = false; if (/^\d{12}$/.test(chaine)) { // 计算校验码:偶数位求和乘3,加奇数位求和 for (i = 1; i < 12; i += 2) { checksum += parseInt(chaine.substr(i, 1)); } checksum *= 3; for (i = 0; i < 12; i += 2) { checksum += parseInt(chaine.substr(i, 1)); } const checkDigit = (10 - checksum % 10) % 10; chaine += checkDigit; // 拼接第一位数字与第二位的表A编码 first = parseInt(chaine.substr(0, 1)); CodeBarre = chaine.substr(0, 1) + String.fromCharCode(65 + parseInt(chaine.substr(1, 1))); // 处理第3-7位,根据第一位数字选择表A/表B for (i = 2; i <= 6; i++) { tableA = false; switch (i) { case 2: tableA = first >= 0 && first <= 3; break; case 3: tableA = [0,4,7,8].includes(first); break; case 4: tableA = [0,1,4,5,9].includes(first); break; case 5: tableA = [0,2,5,6,7].includes(first); break; case 6: tableA = [0,3,6,8,9].includes(first); break; } const digit = parseInt(chaine.substr(i, 1)); CodeBarre += tableA ? String.fromCharCode(65 + digit) : String.fromCharCode(75 + digit); } // 添加分隔符与第8-13位的表C编码 CodeBarre += "*"; for (i = 7; i <= 12; i++) { const digit = parseInt(chaine.substr(i, 1)); CodeBarre += String.fromCharCode(97 + digit); } CodeBarre += "+"; } return CodeBarre; } // 测试输入:12位条码,自动计算校验码 document.getElementById("demo").innerHTML = EAN("618110032764");
测试结果
输入618110032764(12位,校验码为9,完整EAN13为6181100327649),运行修正后的代码将输出预期的6BSLLAA*dchgej+。
内容的提问来源于stack exchange,提问作者Ahmad Jaber
相关产品推荐
相关产品推荐

