# Converting input containing special character to float

This is the beginning of my program that calculates simple interest. Interest rate will have the following format : 0.97 , 0.67 , 0.17 etc. They won't be bigger than 1. So if the user enter 9 for the interest, program will convert it to 0.09 (by dividing it by 100) . Also user can enter input using '/'. So program will convert input like 97/100 to 0.97.

I wrote the code below. It works but it seems to me that there might be a easier and more elegant solution to this. Maybe using more build-in functions etc. If you help me with that I would be very appreciated.

def toNum(interest):

if '/' not in interest:
if float(interest) > 1:
return float(interest)/100

else:
return float(interest)

else:
l= []
n = 0
count = 1

list_interest=[]
for e in interest:
list_interest.append(e)

for e in list_interest:

if count == 1 or count == 3:
l.append(e)
count = count +1
continue

if e == '/':
n = n + 1
count = count +1
else:
l[n] = l[n] + e

return int(l[0]) / int(l[1])

interest = input("Interest rate: ")
interest = toNum(interest)
print(interest)


For reading a fraction such as "97/100", you can use the fractions library.

For example:

from fractions import Fraction

f = Fraction("97/100")

print(float(f)) # prints 0.97


And because the constructor also takes a float, we can remove the check for /. Therefore, the final code is:

from fractions import Fraction

def toNum(interest):
f = Fraction(interest)
f = float(f)

if f > 1:
f /= 100

return f

print(toNum("97/100")) # prints 0.97
print(toNum(0.97)) # prints 0.97
print(toNum(9)) # prints 0.09

• Why convert to float at all and not keep a fractions.Fraction object all along? – 409_Conflict Nov 26 '18 at 15:59
• @MathiasEttinger That's also a good option, just depends on preference. – esote Nov 26 '18 at 16:14

While the answer by @esote is correct and I would also recommend using the fractions module, you should also work on your text parsing. In this case you could have used a simple str.split and map to parse the string containing a /:

if "/" in interest:
numerator, denominator = map(int, interest.split("/"))
return numerator / denominator


Note that int ignores whitespace, so this works with both "97/100", "97 / 100" and any combination thereof.

Note also that using sensible names makes it immediately obvious what this code does.