Я пытался преобразовать строки, например:
s = '1m'
s = '1.4m'
s = '1k'
s = '1.4k'
Каково их фактическое целое число (например, от '1k'
до 1000
),
И мне нужна функция, которую я могу вызвать:
print(tonum('1m'))
print(tonum('1.4m'))
print(tonum('1.45m'))
print(tonum('1k'))
print(tonum('1.4k'))
print(tonum('1.45k'))
Выход:
1000000
1400000
1450000
1000
1400
1450
Я старался:
def tonum(s):
if '.' in s:
return int(s.replace('.', '').replace('m', '00000').replace('k', '00'))
else:
return int(s.replace('m', '000000').replace('k', '000'))
Но это работает только для 1.4k
1k
1.4m
1m
, но не для 1.45m
.
Вы можете вести словарь и использовать его для поиска правильной степени 10 для умножения.
def convert_numeric_abbr(s):
mapping = {'k': 1000, 'm': 1000000, 'b': 1000000000}
# Do a check first so it doesn't choke on valid floats
if s[-1].isalpha():
return float(s[:-1]) * mapping[s[-1].lower()]
return float(s)
convert_numeric_abbr('1m')
# 1000000.0
convert_numeric_abbr('1.4m')
# 1400000.0
convert_numeric_abbr('1k')
# 1000.0
convert_numeric_abbr('1.4k')
# 1400.0
Хотя eval
это зло, вы можете использовать это как доказательство концепции:
def tonum(s):
return eval(s.replace('k', '*1e3').replace('m', '*1e6'))
В качестве бонуса это также будет правильно вычислять такие выражения, как:
tonum("140k + 1m")
Тоже хороший, но пойду с ответом на простуду, так как его нет eval
:P
Очень хорошо, просто обратите внимание, что в Python3 мы могли бы также написать:
'b': 1_000_000_000
(PEP515)