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
相关产品推荐
相关产品推荐

