Python - анализ строки с пользовательскими ценовыми единицами - PullRequest
1 голос
/ 28 марта 2011

Какой самый быстрый способ разобрать строку в int в Python? Строка может включать пользовательские единицы, такие как «k» (килограмм), «m» (миллион) или «b» (миллиард).

Например:

100  -> 100
100k -> 100000
100m -> 100000000
100b -> 100000000000

Спасибо.

Ответы [ 4 ]

6 голосов
/ 28 марта 2011
def convert(val):
    lookup = {'k': 1000, 'm': 1000000, 'b': 1000000000}
    unit = val[-1]
    try:
        number = int(val[:-1])
    except ValueError:
        # do something
    if unit in lookup:
        return lookup[unit] * number
    return int(val)

>>> print convert("100m")
>>> 100000000

Создайте таблицу поиска, а затем разделите число на числовую часть и единицу измерения.Если часть единицы существует, посмотрите на нашу таблицу и используйте ее для создания окончательного числа.В противном случае верните номер.

2 голосов
/ 28 марта 2011
def numerize(s):
    multipliers = {'k': 10**3, 'm': 10**6, 'b': 10**9}

    if s[-1] in multipliers:
        return int(s[:-1]) * multipliers[s[-1]]
    else:
        return int(s)
1 голос
/ 28 марта 2011

РЕДАКТИРОВАТЬ: лучшие примеры, исправление возможных ошибок

>>> def get_unit(ustr):
...     if ustr == '': return 'u'
...     return ustr.lower()
... 
>>> import re
>>> r=re.compile('([1-9][0-9]*)([kKmMbBgG]?)')

>>> units={'k':1000,'m':1000000,'g':1000000000,'b':1000000000,'u':1}
>>> result=r.match('120k')
>>> int(result.group(1))*units[get_unit(result.group(2))]
120000
>>> result=r.match('44')
>>> int(result.group(1))*units[get_unit(result.group(2))]
44
>>> result=r.match('44M')
>>> int(result.group(1))*units[get_unit(result.group(2))]
44000000
>>> 
0 голосов
/ 28 марта 2011

Вы можете определить словарь, который отображает числа в себя и единицы в нули:

units = {"0":"0", "1":"1", #etc.
         "k":"000",
         "m":"000000"} # etc.

Затем вы конвертируете строку в int, как это

int_value = int("".join(map(units.get, string_value)))
...