我试图在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的结果均为9
将所有数字相加
校验位(卡的最后一个号码)是您需要添加的金额,才能得到10的倍数(模10)
我认为算法不正确。
第二步您需要对产品的数字求和,而不是减去9。引用:Wikipedia。
在Wikipedia中有一个例子:
结果:
代码中有一些错误:
返回一个元组,只需要模,即
第二,为了检查有效性,不省略最后一个数字(即校验和),而是将其包含在计算中。使用
并检查结果是否为零:
或者如果您坚持保持这种不需要的复杂性,请检查最后一个数字是否为校验和模10的逆数:keep
但是使用
对于更简单和更短的代码,我可以给您一个对my older answer的引用。
看这个Python recipe
相关问题 更多 >
编程相关推荐