将包含特殊字符的输入转换为浮点型

时间:2018-11-26 13:01:33

标签: python python-3.x

这是我的程序计算单利的开始。利率将具有以下格式:0.97,0.67,0.17等。它们将不会大于1。因此,如果用户输入9作为利息,程序会将其转换为0.09(除以100)。用户也可以使用“ /”输入输入。因此程序会将97/100的输入转换为0.97。

我写了下面的代码。它有效,但在我看来,可能有一个更简单,更优雅的解决方案。也许使用更多的内置函数等。如果您对此有所帮助,我将不胜感激。

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: ")






print(toNum(interest))

3 个答案:

答案 0 :(得分:0)

我想以下方法可能会起作用:

import re
interest = re.sub('[^0-9.0-9]+', '', interest)
print(toNum(interest))

答案 1 :(得分:0)

这似乎可以完成您的工作,并且相当紧凑。

在递归函数调用中添加了

EDIT ,因为我意识到if / else并不是真正必要的,因为您可以仅将分子反馈回来。当然,这假定分子/分母始终使用100作为分母。

它确定是否可以float输入。如果可以,则除以100还是返回,具体取决于值是否为> 1。如果引发异常(在您的情况下,这意味着用户已经输入"97/100"或类似的异常),它将对此进行解析并返回计算出的费率。

在很多情况下,这会失败,但这是需要继续考虑的事情。

def toNum(interest):

    try:
        floated = float(interest)
        if floated > 1:
            rate = floated / 100
        elif floated < 1:
            rate = floated
        return rate
    except ValueError:
        return toNum(interest.split("/")[0])

答案 2 :(得分:0)

您有两种情况,输入是纯数字的,或者是分数表示法。因此,请检查您是否有分数:

def toNum(user_input):
    if '/' in user_input:
        return abs(eval(user_input))

    if user_input.isnumeric():
        return int(user_input)/100

    raise AttributeError('`user_input` must be an integer 0-100 or fraction')

由于isnumeric()如果输入-1或类似您认为安全的垃圾,将返回false。