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

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