Python- конвертировать смешанное число на поплавок

StackOverflow https://stackoverflow.com/questions/2878727

  •  04-10-2019
  •  | 
  •  

Вопрос

Я хочу сделать функцию, которая преобразует смешанные числа и фракции (как строки), чтобы поплавки. Вот несколько примеров:

'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

Спасибо!

Это было полезно?

Решение

2.6 имеет то fractions модуль. Просто разделить строку на пробеле, кормируйте куски fractions.Fraction(), вызов float() против результата, и добавьте их все вверх.

Другие советы

Ответ 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 (потому что он не используется для отмены границ буквального регулятора Regexp, как на многих языках). то re.IGNORECASE Флаг также не имеет большого смысла здесь, так как он включает в себя только числовые объекты в регеэксп, а также re.DOTALL Также бессмысленно, так как у вас нет точек для него, чтобы применить.

Я написал 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top