我想创建一个将混合数字和分数(作为字符串)转换为浮点数的函数。以下是一些例子:
'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
谢谢!
答案 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