2016-11-19 8 views
-3

Я начинающий ученик Python, и сейчас я работаю над алгоритмом Луна, чтобы проверить валидацию кредитной карты. Я написал большую часть кода, но я застрял с двумя ошибками, которые я получил, когда 1-й номер равен num, перед ссылкой. Второй я получаю объект типа '_io.TextIOWrapper' не имеет len(). Дальнейшая помощь/руководство будут высоко оценены.Проверка кредитной карты Python

Эти шаги для Лун алгоритма (mod10 Check)

  1. Двойной каждой второй цифры справа налево. Если это «удвоение» приводит к двузначному числу, добавьте двузначный номер , чтобы получить цифру.
  2. Теперь добавьте все однозначные цифры из шага 1.
  3. Добавить все цифры в нечетных местах справа налево в номере кредитной карты.
  4. Подведите итоги к шагам 2 & 3.
  5. Если результат шага 4 делится на 10, номер карты действителен; в противном случае это неверно.

Вот что мой выход должен быть

Card Number   Valid/Invalid 
-------------------------------------- 
3710293    Invalid 
5190990281925290 Invalid 
3716820019271998 Valid 
37168200192719989 Invalid 
8102966371298364 Invalid 
6823119834248189 Valid 

А вот код.

def checkSecondDigits(num): 
    length = len(num) 
    sum = 0 
    for i in range(length-2,-1,-2): 
     number = eval(num[i]) 
     number = number * 2 
     if number > 9: 
      strNumber = str(number) 
      number = eval(strNumber[0]) + eval(strNumber[1]) 
      sum += number 
     return sum 

def odd_digits(num): 
    length = len(num) 
    sumOdd = 0 
    for i in range(length-1,-1,-2): 
     num += eval(num[i]) 
    return sumOdd 

def c_length(num): 
    length = len(num) 
    if num >= 13 and num <= 16: 
    if num [0] == "4" or num [0] == "5" or num [0] == "6" or (num [0] == "3" and num [1] == "7"): 
     return True 
    else: 
     return False 


def main(): 
    filename = input("What is the name of your input file? ") 
    infile= open(filename,"r") 
    cc = (infile.readline().strip()) 
    print(format("Card Number", "20s"), ("Valid/Invalid")) 
    print("------------------------------------") 
    while cc!= "EXIT": 
     even = checkSecondDigits(num) 
     odd = odd_digits(num) 
     c_len = c_length(num) 
     tot = even + odd 

     if c_len == True and tot % 10 == 0: 
      print(format(cc, "20s"), format("Valid", "20s")) 
     else: 
      print(format(cc, "20s"), format("Invalid", "20s")) 
     num = (infile.readline().strip()) 

main() 
+1

Вы должны предоставить отслеживающий, а не только сообщение об ошибке –

+0

'даже = checkSecondDigits (NUM)' ... Проверить эту строку. Что такое num? Это ваша первая ошибка –

+0

Traceback (самый последний вызов последнего): строка 58, в основной() линии 48, в основных даже = checkSecondDigits (Num) UnboundLocalError: локальная переменная 'Num' обращаться до присвоения –

ответ

1

Вы просто забыли инициализировать NUM

def main(): 
    filename = input("What is the name of your input file? ") 
    infile= open(filename,"r") 
    # initialize num here 
    num = cc = (infile.readline().strip()) 
    print(format("Card Number", "20s"), ("Valid/Invalid")) 
    print("------------------------------------") 
    while cc!= "EXIT": 
     even = checkSecondDigits(num) 
     odd = odd_digits(num) 
     c_len = c_length(num) 
     tot = even + odd 

     if c_len == True and tot % 10 == 0: 
      print(format(cc, "20s"), format("Valid", "20s")) 
     else: 
      print(format(cc, "20s"), format("Invalid", "20s")) 
     num = cc = (infile.readline().strip()) 
+0

Он фактически инициализировал его ниже остальных. – Onilol

+0

Ты спасатель жизни. Большое спасибо –

+0

Может просто переименовать cc в num –

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