3

混合数と分数(文字列として)を浮動小数点数に変換する関数を作成したいと思います。次にいくつかの例を示します。

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

現在この機能を使用していますが、改善できると思います。また、すでに10進表現になっている数値も処理しません。

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

ありがとう!

4

3 に答える 3

8

2.6にはfractionsモジュールがあります。空白で文字列を分割し、チャンクをにフィードし、結果に対してfractions.Fraction()呼び出しfloat()て、それらをすべて合計するだけです。

于 2010-05-21T00:06:12.547 に答える
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意味がありません。また、適用するドットがないため、意味がありません。

于 2010-05-21T02:53:23.010 に答える
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
于 2013-11-13T18:52:39.650 に答える