Python- 将带分数转换为浮点数

3 投票
3 回答
1900 浏览
提问于 2025-04-15 22:57

我想写一个函数,把混合数和分数(以字符串形式)转换成浮点数。这里有一些例子:

'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 个回答

1

我写了一个叫 Mixed 的类,用来扩展分数的功能,正是为了这个目的。源代码可以在 这里 找到。

>>> 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
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也没有什么用,因为你没有点号可以应用这个标志。

8

在2.6版本中,有一个叫做fractions的模块。你只需要把字符串按照空格分开,然后把每一部分传给fractions.Fraction(),接着对结果使用float(),最后把所有的结果加起来就可以了。

撰写回答