Python- 将带分数转换为浮点数
我想写一个函数,把混合数和分数(以字符串形式)转换成浮点数。这里有一些例子:
'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()
,最后把所有的结果加起来就可以了。