Сокращённый вывод чисел
Не так давно имею функцию, которая выводит большие и маленькие значения в сокращённом формате, (тыс,млн и тд) то как это реализовано сейчас, хочется повеситься :D, можно ли это как-то улучшить? Или может есть уже готовые модули для этого?
def textify_value(value):
avalue = abs(value)
if avalue >= 1000000000000000000000000000000000000000000000000000000000000000:
return str(round(value / 1000000000000000000000000000000000000000000000000000000000000000)) + " эндек."
if avalue >= 1000000000000000000000000000000000:
return str(round(value / 1000000000000000000000000000000000)) + " дек."
if avalue >= 1000000000000000000000000000000:
return str(round(value / 1000000000000000000000000000000)) + " нон."
if avalue >= 1000000000000000000000000000:
return str(round(value / 1000000000000000000000000000)) + " окт."
if avalue >= 1000000000000000000000000:
return str(round(value / 1000000000000000000000000)) + " сптл."
if avalue >= 1000000000000000000000:
return str(round(value / 1000000000000000000000)) + " скст."
if avalue >= 1000000000000000000:
return str(round(value / 1000000000000000000)) + " квнт."
if avalue >= 1000000000000000:
return str(round(value / 1000000000000000)) + " квдр."
if avalue >= 1000000000000:
return str(round(value / 1000000000000)) + " трлн."
if avalue >= 1000000000:
return str(round(value / 1000000000)) + " млрд."
if avalue >= 1000000:
return str(round(value / 1000000)) + " млн."
if avalue >= 100000:
return str(round(value / 100000)) + "00 тыс."
if avalue >= 1000:
return str(round(value / 1000)) + " тыс."
return str(value)
Ответы (4 шт):
Автор решения: Эникейщик
→ Ссылка
1_000_000 = 1e+6
Остальное по аналогии. Называется экспоненциальная запись числа. Это для того, что бы ifы выглядели нормально.
Для слов можно использовать словарь или список, например.
Автор решения: Danis
→ Ссылка
def f(value):
arr = [(0, ''), (3, ' тыс.'), (6, ' млн.'), (9, ' млрд.'), (12, ' трлн.'), (15, ' квдр.'), (18, ' квнт.'), (21, ' скст.'), (24, ' сптл.'), (27, ' окт.'), (30, ' нон.'), (33, ' дек.'), (63, ' эндек.')]
for n, s in arr[::-1]:
n = 10**n
if abs(value) >= n:
return str(round(value / n)) + s
return str(value)
Автор решения: ganz
→ Ссылка
Да, исспользуя модуль humanize
import humanize
humanize.i18n.activate("ru_RU")
humanize.clamp(200000000000000000000000000000000, format=humanize.intword) #other param , ceil=3000, floor=1000, floor_token='lower', ceil_token='more'
#200.0 нониллиона
но он вроде только до дедоцелиона считает
Автор решения: Clyoukcer
→ Ссылка
Не идеал, но как по мне, это лучший способ без использования модулей.
def converter(value:int=160_432_520) -> str:
arr = {3: "K", 6: "M", 9: "B", 12: "T"}
lenght = len(str(value)) - 1
if lenght >= 3:
for key,val in arr.items():
if key <= lenght < key + 3:
return f"{round(value / (10 ** key),2)} {val}"
return str(value)