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)
2 Answers 2
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
-
1\$\begingroup\$ Why convert to
float
at all and not keep afractions.Fraction
object all along? \$\endgroup\$301_Moved_Permanently– 301_Moved_Permanently2018年11月26日 15:59:12 +00:00Commented Nov 26, 2018 at 15:59 -
\$\begingroup\$ @MathiasEttinger That's also a good option, just depends on preference. \$\endgroup\$esote– esote2018年11月26日 16:14:56 +00:00Commented Nov 26, 2018 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.