Сокращённый вывод чисел

Не так давно имею функцию, которая выводит большие и маленькие значения в сокращённом формате, (тыс,млн и тд) то как это реализовано сейчас, хочется повеситься :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)
→ Ссылка