Python-将混合数转换为浮点数

时间:2010-05-21 00:02:29

标签: python numbers mixed

我想创建一个将混合数字和分数(作为字符串)转换为浮点数的函数。以下是一些例子:

'1 1/2' -> 1.5
'11/2' -> 5.5
'7/8' -> 0.875
'3' -> 3
'7.7' -> 7.7

我目前正在使用此功能,但我认为可以改进。它也不处理已经是十进制表示的数字

def mixedtofloat(txt):

    mixednum = re.compile("(\\d+) (\\d+)\\/(\\d+)",re.IGNORECASE|re.DOTALL)
    fraction = re.compile("(\\d+)\\/(\\d+)",re.IGNORECASE|re.DOTALL)
    integer = re.compile("(\\d+)",re.IGNORECASE|re.DOTALL)

    m = mixednum.search(txt)
    n = fraction.search(txt)
    o = integer.search(txt)

    if m:
        return float(m.group(1))+(float(m.group(2))/float(m.group(3)))
    elif n:
        return float(n.group(1))/float(n.group(2))
    elif o:
        return float(o.group(1))
    else:
        return txt

谢谢!

3 个答案:

答案 0 :(得分:8)

2.6具有fractions模块。只需将字符串拆分为空格,将块提供给fractions.Fraction(),针对结果调用float(),然后将它们全部添加。

答案 1 :(得分:2)

Ignacio的答案可能是处理它的最好方法,但是如果你不使用Python 2.6,你可以构建一个功能,可以更简单地完成工作,而不必依赖正则表达式。这是一个简单而不是非常强大的版本,我把它放在一起:

def parse_fraction(fraction):

    def parse_part(part):
        sections = part.split('/')
        if len(sections) == 1:
            return float(sections[0])
        return float(sections[0]) / float(sections[1])

    return sum( parse_part(part) for part in fraction.split() )

这显然并不完美,因为它仍会接受像'2 1/2 1/2'这样的输入,它将评估为3,因为它基本上总结了一个以空格分隔的数字列表,同时将每个数字作为必要时分数。

如果你坚持使用基于正则表达式的解决方案,你应该知道你可以使用原始字符串来避免必须加倍反斜杠。基本上,你可以写:

mixednum = re.compile(r"(\d+) (\d+)/(\d+)")

字符串前面的r告诉Python不要评估字符串中的特殊字符,因此您可以编写文字反斜杠,它们将被视为这样。另请注意,您不需要转义斜杠,因为它不是Python正则表达式中的特殊字符(因为它不像许多语言那样用于标记文字正则表达式的边框)。 re.IGNORECASE标志在这里也没有多大意义,因为它只包含正则表达式中的数字实体,re.DOTALL也没有意义,因为它没有要应用的点。 / p>

答案 2 :(得分:1)

我编写了Mixed类来扩展分数来做到这一点。来源是here

>>> float(Mixed('6 7/8'))
6.875
>>> float(Mixed(1,1,2)) # 1 1/2
1.5
>>> float(Mixed('11/2')) # 11/2
5.5