Charlie Webb Charlie Webb - 1 month ago 5
Python Question

Recognising an input() as either a str, float, or int and acting accordingly

Python beginner here. I'm writing a program that uses an infinite loop and allows the user to enter key terms to access different 'tools' or 'modules'.

Within one of these 'modules', the user can enter a value and convert it to binary. I want to:


  1. Allow the program to recognize if the value is either an int or a
    float and then run code that converts the value to binary

  2. Allow the program to recognize if the value entered is a str and the str says 'back', in which the current loop will be exited.



As far as I know this issue is occurring as input() converts whatever is entered to a str automatically (due to: http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/io.html "First it prints the string you give as a parameter").

How can I make the code below recognize if the input is a str, float, or int and then execute the relevant if statements? Currently, this part of my code can accept 'back' to exit out of the loop but will take any int or float value as a str, making the program prompt the user to enter a decimal value once more.

#decimal to binary
while search == "d2b":
dec2bin = input("\nDecimal Value: ")
if type(dec2bin) == int:
print("Binary Value: " + "{0:b}".format(dec2bin))
elif type (dec2bin) == str:
if dec2bin == "back":
search = 0
elif type (dec2bin) == float:
#code for float to binary goes here


Edit: not the same as this thread (Python: Analyzing input to see if its an integer, float, or string), as a list is used there over input()
E2: cannot seem to use suggested duplicate as a solution to issue. However, a comment in this thread by Francisco has the solution

Answer

Use exceptions! The int and float functions throw a ValueError exception when they can't convert the value passed.

while search == "d2b":
    dec2bin = input("\nDecimal Value: ")
    try:
        dec2bin = int(dec2bin)
    except ValueError:
        pass
    else:
        print("Binary Value: " + "{0:b}".format(dec2bin))
        continue

    try:
        dec2bin = float(dec2bin)
    except ValueError:
        pass
    else:
        #code for float to binary goes here
        continue

    if dec2bin == "back":
        search = 0

The order in which you try the conversions is important, since every value passed to int is valid with float, and every value passed to float is a valid to be passed to str