2014-01-11 4 views
-5

У меня есть своя с моим кодом. Он работает довольно хорошо, но в некоторых случаях (например, input = 8913266562747895) он дает неправильные ответы. Вот мой код:Python: Код подтверждения кредитной карты

def ccv(s): 
    k=list(s) 
    if len(k)==19: 
     for i in(0,1,2,3,5,6,7,8,10,11,12,13,15,16,17,18): 
      if not k[i].isdigit(): 
       return False 
     for i in(4,9,14):    
      if k[i]!=" " and k[i]!="-": 
       return False 
     l=[int(c) for c in s if c.isdigit()] 
     if not 4<=l[0]and l[0]<=7: 
      return False 
     s=0 
     for i in range(0,16, 2): 
      l[i]=2*l[i] 
      if l[i]/10!=0: 
       l[i]= l[i]/10+(l[i]%10)  
     for i in range(16): 
      s=s+l[i] 
     return s%10==0 
    elif len(k)==16: 
     for i in range(16): 
      if not k[i].isdigit(): 
       return False 
     l=[int(c) for c in s if c.isdigit()] 
     if not 4<=l[0]and l[0]<=7: 
      return False 
     else:   
      s=0 
      for i in range(0,16, 2): 
        l[i]=2*l[i] 
        if l[i]/10!=0: 
         l[i]= l[i]/10+(l[i]%10)  
      for i in range(16): 
        s=s+l[i] 
     return s%10==0 
    else: 
     return False 
n=raw_input() 
while n!="END" and n!="end": 
    print ccv(n) 
    n=raw_input() 

Можете ли вы сказать мне, где проблема?

+0

Это тот код, в котором он мог бы помочь либо разбить его на более мелкие функции, которые каждый проверьте одно состояние или (еще лучше) используйте библиотеку, которая помогает с проверкой CC. –

+1

Почему бы не использовать [регулярное выражение для таких вопросов] (http://www.regular-expressions.info/creditcard.html)? – damienfrancois

+0

Необходимо использовать python. – GeorgeDavidKing

ответ

7

Я думаю, что вы ищете Luhn algorithm. Он может быть реализован весьма сжато так:

def luhn(input): 
    digits = [int(c) for c in input if c.isdigit()] 
    checksum = digits.pop() 
    digits.reverse() 
    doubled = [2*d for d in digits[0::2]] 
    total = sum(d-9 if d > 9 else d for d in doubled) + sum(digits[1::2]) 
    return (total * 9) % 10 == checksum 

Rosetta Code - Luhn Algorithm имеет еще более короткую версию, которая может быть менее читаемым, хотя.

PayPal опубликовал хороший list of fake credit card numbers для тестирования.

Также проверьте pycard, библиотеку без внешних зависимостей.

+0

Я попробовал. Он не работает – GeorgeDavidKing

+0

С вашим кодом он говорит: long 'object is not itable – GeorgeDavidKing

+2

@GeorgeDavidKing: «* Принимает номер кредитной карты в виде строки *» – Blender

0

Одна из проблем, эта линия (и дубликат строки в else блоке):

if not 4<=l[0]and l[0]<=7: 
    return False 

Вы должны использовать круглые скобки, чтобы сделать его разобрать на правильном пути:

if not (4<=l[0]and l[0]<=7): 
    return False 

еще лучше :

if not 4 <= l[0] <= 7: 
    return False 
+0

Все еще неправильно. Попробуй сам. input = 8913266562747895 output = True – GeorgeDavidKing

+0

@GeorgeDavidKing: Вы не установили оба оператора 'if'. – Blender

+0

Hahahahahahaha !!! Ницца! Большое спасибо. Вы действительно заставка! – GeorgeDavidKing

Смежные вопросы