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
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.
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
.
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
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)