【发布时间】:2014-01-31 11:59:07
【问题描述】:
我试图在 Python 中实现 Luhn Formula。 这是我的代码:
import sys
def luhn_check(number):
if number.isdigit():
last_digit = int(str(number)[-1])
reverse_sequence = list(int(d) for d in str(int(number[-2::-1])))
for i in range(0, len(reverse_sequence), 2):
reverse_sequence[i] *= 2
for i in range(len(reverse_sequence)):
if reverse_sequence[i] > 9:
reverse_sequence[i] -= 9
sum_of_digits = 0
for i in range(len(reverse_sequence)):
sum_of_digits += reverse_sequence[i]
result = divmod(sum_of_digits, 10)
if result == last_digit:
print("[VALID] %s" % number)
else:
print("[INVALID] %s" % number)
quit()
print("[ERROR] \" %s \" is not a valid sequence." % number)
quit()
def main():
if len(sys.argv) < 2:
print("Usage: python TLF.py <sequence>")
quit()
luhn_check(sys.argv[1])
if __name__ == '__main__':
main()
但它不能正常工作:
[INVALID] 4532015112830366
[INVALID] 6011514433546201
[INVALID] 6771549495586802
等等……
但代码的逻辑对我来说似乎没问题。我遵循了这个工作流程:
卢恩公式
-
删除数字的最后一位。最后一位是我们要检查的 颠倒数字
-
将奇数位(1、3、5 等)的数字乘以 2,然后将所有大于 9 的结果减去 9
-
将所有数字相加
-
校验位(卡的最后一个数字)是您需要相加以获得 10 的倍数(模 10)的金额
【问题讨论】:
-
为了检查奇数位置的数字,您应该使用:
range(1, len(reverse_sequence), 2)而不是range(0, len(reverse_sequence), 2) -
@JChris,问题在于您将步骤 2 的操作应用于所有数字。我添加了一个答案,详细解释了如何计算这个检查器。