You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python校验UPC编码时如何保留前导零参与计算?

问题根因

当前代码的核心问题是输入处理阶段丢失了前导零:

  • 调用侧将输入的字符串直接转成int类型,前导零会被自动截断,比如输入042100005264转int后变成42100005264,长度从12位变成11位,完全不符合UPC编码的位数要求,校验自然失败。
  • 校验函数内部又将int转回字符串做计算,相当于直接丢失了第一位的前导零,奇偶位的计算逻辑完全错位。

代码修改方案

1. 调整UPC校验函数,直接接收字符串入参

把原来的入参从int改成字符串,保留所有前导零,同时调整校验位的对比逻辑:

def UPC_code(num_str):
    sum_digit = 0
    # 取除最后一位校验位之外的所有字符,完整保留前导零
    num_temp = num_str[:-1]
    # 遍历计算校验和
    for index, digit in enumerate(num_temp):
        # UPC规则的奇数位从左到右第一位开始计数
        if (index + 1) % 2 != 0:
            sum_digit += int(digit) * 3
        else:
            sum_digit += int(digit) * 1
    # 计算预期校验位
    res_digit = sum_digit % 10
    if res_digit != 0:
        res_digit = 10 - res_digit
    # 直接取输入字符串最后一位转int对比,保留原始输入的校验位
    return res_digit == int(num_str[-1])

2. 修改调用侧代码

不要将输入转int,直接传入原始输入的字符串,同时修正import的语法错误:

import code_check as cc

num = input().strip()
# 额外增加标准UPC-A编码的前置校验:12位纯数字、不为全0
if len(num) == 12 and num.isdigit() and cc.UPC_code(num) and int(num) != 0:
    print(num, "valid UPC code.")
else:
    print("Not valid")

校验逻辑验证

输入042100005264的前11位是04210000526:

  • 奇数位(第1、3、5、7、9、11位)为0、2、0、0、5、6,乘3求和为(0+2+0+0+5+6)*3=39
  • 偶数位(第2、4、6、8、10位)为4、1、0、0、2,乘1求和为4+1+0+0+2=7
  • 总和为46,模10得6,10-6=4,和输入最后一位的4相等,返回True,输出完全符合预期。

内容的提问来源于stack exchange,提问作者HarryVu176

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:06:02