Frage

Ich möchte eine Funktion, dass Konvertiten gemischt Zahlen und Brüche machen (als Strings) zu Schwimmern. Hier einige Beispiele:

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

Ich bin derzeit mit dieser Funktion, aber ich denke, es verbessert werden könnte. Es spielt auch keine Zahlen behandeln, die bereits in Dezimaldarstellung sind

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

Danke!

War es hilfreich?

Lösung

2.6 hat die fractions Modul. Split nur die Zeichenfolge auf Leerzeichen, füttern die Brocken fractions.Fraction(), Call float() gegen das Ergebnis, und fügen Sie sie alle.

Andere Tipps

Ignacio Antwort ist wahrscheinlich der beste Weg, es zu handhaben, aber wenn Sie nicht Python verwenden 2.6, können Sie eine Funktion erstellen, die Dinge tut, ein wenig mehr einfach ohne zu regulären Ausdrücken zu bauen. Hier ist eine einfache und nicht sehr robust Version Ich warf zusammen:

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() )

Das ist offensichtlich nicht perfekt, weil es immer noch Eingang wie '2 1/2 1/2' akzeptieren, die sie als 3 bewerten würde, da es sich im Wesentlichen um einen Raum getrennte Liste von Zahlen summiert, während die jeweils als Fraktion als notwendig zu bewerten.

Wenn Sie Stick mit der regulären Ausdruck basierten Lösung zu tun, sollen Sie wissen, dass Sie eine rohe Zeichenfolge verwenden können, mit dem doppelten Schrägstrich alles zu vermeiden. Im Wesentlichen können Sie schreiben:

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

Die r vor dem String sagt Python nicht auswerten Sonderzeichen innerhalb der Zeichenfolge, so dass Sie wörtliche Schrägstriche schreiben können, und sie werden als solche behandelt werden. Beachten Sie auch, dass Sie nicht den Schrägstrich entkommen müssen, da es kein Sonderzeichen in regulären Ausdrücken in Python ist (weil es nicht verwendet wird, um die Grenzen des wörtlichen regexp wie in vielen Sprachen zu markieren). die re.IGNORECASE Flagge vielen Sinn nicht auch hier machen, da es nur numerische Entitäten in der regexp enthält und re.DOTALL ist auch sinnlos, da man keine Punkte hat, dafür zu gelten.

Ich schrieb die Mixed Klassenfraktionen zu verlängern, genau das zu tun. Quelle ist hier .

>>> 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top