How to accept the input of both int and float types?

后端 未结 4 1481
广开言路
广开言路 2021-01-21 09:18

I am making a currency converter. How do I get python to accept both integer and float?

This is how I did it:

def aud_brl(amount,From,to):
    ER = 0.421         


        
相关标签:
4条回答
  • 2021-01-21 10:02

    amount==int doesn't make sense. input gives us a string. int (and float) is a function. A string never equals a function.

    In [42]: x=input('test')
    test12.23
    In [43]: x
    Out[43]: '12.23'
    In [44]: int(x)
    ....
    ValueError: invalid literal for int() with base 10: '12.23'
    In [45]: float(x)
    Out[45]: 12.23
    

    float('12.23') returns a float object. int('12.23') produces an error, because it isn't a valid integer string format.

    If the user might give either '12' or '12.23', it is safer to use float(x) to convert it to a number. The result will be a float. For many calculations you don't need to worry whether it is a float or integer. The math is the same.

    You can convert between int and floats if needed:

    In [45]: float(x)
    Out[45]: 12.23
    In [46]: float(12)
    Out[46]: 12.0
    In [47]: int(12.23)
    Out[47]: 12
    In [48]: round(12.23)
    Out[48]: 12
    

    You can also do instance tests

    In [51]: isinstance(12,float)
    Out[51]: False
    In [52]: isinstance(12.23,float)
    Out[52]: True
    In [53]: isinstance(12.23,int)
    Out[53]: False
    In [54]: isinstance(12,int)
    Out[54]: True
    

    But you probably don't need to do any those.

    0 讨论(0)
  • 2021-01-21 10:15

    this is how you could check the given string and accept int or float (and also cast to it; nb will be an int or a float):

    number = input("Enter a number: ")
    
    nb = None
    for cast in (int, float):
        try:
            nb = cast(number)
            print(cast)
            break
        except ValueError:
            pass
    

    but in your case just using float might do the trick (as also string representations of integers can be converted to floats: float('3') -> 3.0):

    number = input("Enter a number: ")
    
    nb = None
    try:
        nb = float(number)
    except ValueError:
        pass
    

    if nb is None you got something that could not be converted to a float.

    0 讨论(0)
  • 2021-01-21 10:16

    Use the isinstance function, which is built in

    if isinstance(num, (int, float)):
        #do stuff
    

    Also, you should refrain from using reserved keywords for variable names. The keyword from is a reserved keyword in Python

    Finally, there is one other error I noticed:

    if From == 'aud' or 'brl'
    

    Should be

    if From == 'aud' or From == 'brl'
    

    Lastly, to clean up the if statements you could theoretically use the list (if you have more currencies in the future, this might be better.

    currencies = ['aud', 'brl']     #other currencies possible
    if From in currencies and to in currencies:
        #do conversion
    
    0 讨论(0)
  • 2021-01-21 10:18

    I'm really hoping I'm not completely misunderstanding the question but here I go.

    It looks like you just want to make sure the value passed in can be operated upon like a float, regardless of whether the input is 3 or 4.79 for example, correct? If that's the case, then just cast the input as a float before operating on it. Here's your modified code:

    def aud_brl(amount, From, to):
        ER = 0.42108 
        if From.strip() == 'aud' and to.strip() == 'brl': 
            result = amount/ER 
        elif From.strip() == 'brl' and to.strip() == 'aud': 
            result = amount*ER 
    
        print(result)
    
    def question(): 
        amount = float(input("Amount: "))
        From = input("From: ") 
        to = input("To: ")
    
        if (From == 'aud' or From == 'brl') and (to == 'aud' or to == 'brl'): 
            aud_brl(amount, From, to)
    
    question()
    

    (I made a few changes as well for the sake of neatness, I hope you don't mind <3)

    0 讨论(0)
提交回复
热议问题