Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Validating credit card
#1
Hello,
I have been trying to make a credit card validator but i keep getting an error. I have created a special fuction that removes the empty spaces and "-"s from the string.
def checker(string):
  for i in range (len(string)):
    if " " in string:
      string = string.replace(' ','')   
    elif "-" in string:
      string = string.replace('-','')  
This is my total code
def digit_sum(LIST):
    for i in range(len(LIST)):
      value = str(LIST[i])
      digits = [int(x) for x in value]
      credit_card.append(sum(digits))

def checker(string):
  for i in range (len(string)):
    if " " in string:
      string = string.replace(' ','')   
    elif "-" in string:
      string = string.replace('-','')  
      

credit_card=[]
credit_card_sum=[]
credit_card_sum_digit=[]
credit_digits_sum=0    



user_input=input()
checker(user_input)
while user_input!="end" and user_input!="END":  
   
   credit_card_str=str(user_input)
  
   credit_card_int=[int(x) for x in credit_card_str]
   if credit_card_int[0]<4 or credit_card_int[0]>7:
     
     print ("False")
   else:
    for i in range(len(credit_card_int)):
      if not (i% 2):
        credit_card_int[i] = credit_card_int[i]*2
    digit_sum(credit_card_int)
    for i in range(len(credit_card)):
      credit_digits_sum=credit_digits_sum+credit_card[i]
    if credit_digits_sum % 2 ==0:
     print ("True")
    else:
     print ("False")
   user_input=input()  
If you try to run in with the input 5497-3571-7063-2130 or 54 97357 170632 130 You will get an error like this. Should i reconvert the string to STR?
Reply
#2
You have to return the new (modified) string.

def checker(string):
  for i in range (len(string)):
    if " " in string:
      string = string.replace(' ','')   
    elif "-" in string:
      string = string.replace('-','')
  return string
A better way to write this function:

def checker(s):
  return s.replace(' ','').replace('-','')
The replace() already search in every char of the string.
Reply
#3
When running the program python breaks on line
credit_card_int=[int(x) for x in user_input] 
error code
Traceback (most recent call last):
  File "python", line 22, in <module>
  File "python", line 22, in <listcomp>
ValueError: invalid literal for int() with base 10: ' '
Reply
#4
This is happening because your not actually removing the ' ' and/or '-' from input.
Try this:

def digit_sum(LIST):
    for i in range(len(LIST)):
      value = str(LIST[i])
      digits = [int(x) for x in value]
      credit_card.append(sum(digits))
 
def checker(s):
  return s.replace(' ','').replace('-','')
       

credit_card=[]
credit_card_sum=[]
credit_card_sum_digit=[]
credit_digits_sum=0    

user_input=input()
user_input = checker(user_input) # <===== HERE
while user_input!="end" and user_input!="END":  
    
   credit_card_str=str(user_input)
   
   credit_card_int=[int(x) for x in credit_card_str]
   if credit_card_int[0]<4 or credit_card_int[0]>7:
      
     print ("False")
   else:
    for i in range(len(credit_card_int)):
      if not (i% 2):
        credit_card_int[i] = credit_card_int[i]*2
    digit_sum(credit_card_int)
    for i in range(len(credit_card)):
      credit_digits_sum=credit_digits_sum+credit_card[i]
    if credit_digits_sum % 2 ==0:
     print ("True")
    else:
     print ("False")
   user_input=input()
   user_input = checker(user_input) # <===== HERE
Reply
#5
Thank you for your reply. I am getting the same error.
[b]Traceback (most recent call last):
  File "python", line 18, in <module>
  File "python", line 18, in <listcomp>
ValueError: invalid literal for int() with base 10: '-'[/b]
After this my goal is to make the program print "False" when it detects other user inputs like these "5497.3571,7063*2130".So i must exclude dots,commas and asterisks,and weird inputs like these "54 97357 170632 130"
Reply
#6
Could you please post your current code?
Because line 18 in my code is while user_input!="end" and user_input!="END":.
And in yours seems to be credit_card_int=[int(x) for x in credit_card_str].
Reply
#7
Yea,sorry for this. I keep on making many versions of the code so i keep experimenting. Take my code

def digit_sum(LIST):
    for i in range(len(LIST)):
      value = str(LIST[i])
      digits = [int(x) for x in value]
      credit_card.append(sum(digits))
  
def checker(s):
  return s.replace(' ','').replace('-','')
        
 
credit_card=[]
credit_card_sum=[]
credit_card_sum_digit=[]
credit_digits_sum=0    
 
user_input=input()
user_input = checker(user_input) # <===== HERE
while user_input!="end" and user_input!="END":  
     
   credit_card_str=str(user_input)
    
   credit_card_int=[int(x) for x in credit_card_str]
   if credit_card_int[0]<4 or credit_card_int[0]>=7:
       
     print ("False")
   else:
    for i in range(len(credit_card_int)):
      if not (i% 2):
        credit_card_int[i] = credit_card_int[i]*2
    digit_sum(credit_card_int)
    for i in range(len(credit_card)):
      credit_digits_sum=credit_digits_sum+credit_card[i]
    if credit_digits_sum % 2 ==0:
     print ("True")
    else:
     print ("False")
   user_input=input()
   user_input = checker(user_input) # <===== HERE
Reply
#8
Changed code to

def digit_sum(LIST):
    for i in range(len(LIST)):
      value = str(LIST[i])
      digits = [int(x) for x in value]
      credit_card.append(sum(digits))

def checker(s):
    list_of_numbers=[]
    string_to_use=""
    if("-" in s):
        list_of_numbers=s.split("-")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    if(" " in s):
        list_of_numbers=s.split(" ")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    if("," in s):
        list_of_numbers=s.split(",")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    if("*" in s):
        list_of_numbers=s.split("*")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return

    if("." in s):
        list_of_numbers=s.split(".")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    else:return s

credit_card=[]
credit_card_sum=[]
credit_card_sum_digit=[]
credit_digits_sum=0

user1_input=input()
user_input=checker(user1_input)
while user1_input!="end" and user1_input!="END":
    user_input=checker(user1_input)
    if( not user_input.isdigit()):
        print("False")
    elif(user_input.isdigit() and len(user_input)>16):
        print("False")
    else:
        credit_card_int=[int(x) for x in user_input]
        if credit_card_int[0]<4 or credit_card_int[0]>=7:
          print ("False")
        else:
          for i in range(0,len(credit_card_int),2):
              credit_card_int[i] = credit_card_int[i]*2
          digit_sum(credit_card_int)
          for i in range(len(credit_card)):
            credit_digits_sum=credit_digits_sum+credit_card[i]
          if credit_digits_sum %10 ==0:
             print ("True")
          else:
            print ("False")
    user1_input=input()
but outputs wrong bool with input 54 97357 170632 130
Reply
#9
done

def checker(s):
    list_of_numbers=[]
    string_to_use=""
    if("-" in s):
        list_of_numbers=s.split("-")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    if(" " in s):
        list_of_numbers=s.split(" ")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    if("," in s):
        list_of_numbers=s.split(",")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    if("*" in s):
        list_of_numbers=s.split("*")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return

    if("." in s):
        list_of_numbers=s.split(".")
        for character in list_of_numbers:
            string_to_use+=character
        string_return=string_to_use
        string_to_use=""
        return string_return
    else:
        return s

credit_card=[]
credit_card_sum=[]
credit_card_sum_digit=[]
credit_digits_sum=0

user1_input=input()
user_input=checker(user1_input)
check=False
while user1_input!="end" and user1_input!="END":
    user_input=checker(user1_input)
    if(len(user1_input)>16):
        if(len(user1_input)!=19):
            print("False")
            user1_input=input()
            continue
        elif(user1_input[4].isdigit() or user1_input[9].isdigit() or user1_input[14].isdigit()):
                print("False")
                user1_input=input()
                continue
    if( not user_input.isdigit()):
        print("False")
    elif(user_input.isdigit() and len(user_input)!=16):
        print("False")
    else:
        credit_card_int=[int(x) for x in user_input]
        if credit_card_int[0]<4 or credit_card_int[0]>7:
            print ("False")
        else:
            for i in range(0,len(credit_card_int),2):
                credit_card_int[i] = credit_card_int[i]*2
                if credit_card_int[i]>=10:credit_card_int[i]= (int(str(credit_card_int[i])[0])+int(str(credit_card_int[i])[1]))
            if (sum(credit_card_int) % 10 ==0):
                print ("True")
            else:
                print ("False")
    user1_input=input()
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [split] formula for validating monetary values? kakos_k9 1 725 Dec-17-2022, 09:28 PM
Last Post: woooee
  Having strange results from an RFID HID card reader - I'm stuck orbisnz 1 1,431 Mar-28-2022, 08:20 AM
Last Post: Larz60+
  SQL wild card use hammer 3 1,220 Jan-07-2022, 02:17 PM
Last Post: hammer
  Validating user input WJSwan 2 2,079 Jul-06-2020, 07:21 AM
Last Post: menator01
  Validating the functionality of the application rpalakodety 1 1,744 Dec-30-2019, 07:58 PM
Last Post: ndc85430
  Validating information from .csv file before executemany mzmingle 7 4,354 Apr-15-2019, 01:40 PM
Last Post: mzmingle
  need help with making a validating function drasil 8 3,653 Mar-28-2019, 10:38 AM
Last Post: perfringo
  Credit card number redacting script Drone4four 6 5,122 Jan-18-2019, 02:07 PM
Last Post: Drone4four
  Validating Input (basic check for int etc) gruntfutuk 1 2,470 Aug-06-2018, 07:43 AM
Last Post: gruntfutuk
  individual's ID card number in python danpek 2 3,729 Jun-14-2018, 04:07 PM
Last Post: DeaD_EyE

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020