4
\$\begingroup\$

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)
asked Nov 26, 2018 at 13:51
\$\endgroup\$

2 Answers 2

4
\$\begingroup\$

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
answered Nov 26, 2018 at 14:11
\$\endgroup\$
2
  • 1
    \$\begingroup\$ Why convert to float at all and not keep a fractions.Fraction object all along? \$\endgroup\$ Commented Nov 26, 2018 at 15:59
  • \$\begingroup\$ @MathiasEttinger That's also a good option, just depends on preference. \$\endgroup\$ Commented Nov 26, 2018 at 16:14
1
\$\begingroup\$

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.

answered Nov 27, 2018 at 11:27
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.