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

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.