Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 17, 2023 10:27:24

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

Не нашел в стандартной библиотеке перевода числа в строковое представление. Пришлось написать самому. Вариант топорный, но если кому пригодится то как-то так:

 def intToString(num: int, option: str = ''):
    """Преобразовывает целое число до 999999 в число прописью"""
    res = ''
    one_nineteen = {'0': '',
                    '00': '',
                    '01': 'один',
                    '02': 'два',
                    '03': 'три',
                    '04': 'четыре',
                    '05': 'пять',
                    '06': 'шесть',
                    '07': 'семь',
                    '08': 'восемь',
                    '09': 'девять',
                    '10': 'десять',
                    '11': 'одиннадцать',
                    '12': 'двенадцать',
                    '13': 'тринадцать',
                    '14': 'четырнадцать',
                    '15': 'пятнадцать',
                    '16': 'шестнадцать',
                    '17': 'семнадцать',
                    '18': 'восемнадцать',
                    '19': 'девятнадцать',
                    }
    twenty_ninety = {'2': 'двадцать',
                     '3': 'тридцать',
                     '4': 'сорок',
                     '5': 'пятьдесят',
                     '6': 'шестьдесят',
                     '7': 'семьдесят',
                     '8': 'восемьдесят',
                     '9': 'девяносто',
                     }
    hundreds = {'0': '',
                '1': 'сто',
                '2': 'двести',
                '3': 'триста',
                '4': 'четыреста',
                '5': 'пятьсот',
                '6': 'шестьсот',
                '7': 'семьсот',
                '8': 'восемьсот',
                '9': 'девятьсот',
                }
    thousands = {'0': '',
                 '00': 'тысяч',
                 '01': 'одна тысяча',
                 '02': 'две тысячи',
                 '03': 'три тысячи',
                 '04': 'четыре тысячи',
                 '05': 'пять тысяч',
                 '06': 'шесть тысяч',
                 '07': 'семь тысяч',
                 '08': 'восемь тысяч',
                 '09': 'девять тысяч',
                 '10': 'десять тысяч',
                 '11': 'одиннадцать тысяч',
                 '12': 'двенадцать тысяч',
                 '13': 'тринадцать тысяч',
                 '14': 'четырнадцать тысяч',
                 '15': 'пятнадцать тысяч',
                 '16': 'шестнадцать тысяч',
                 '17': 'семнадцать тысяч',
                 '18': 'восемнадцать тысяч',
                 '19': 'девятнадцать тысяч',
                 }
    s = str(num)
    r = s[::-1]
    if len(r) > 3:
        t = r[3:6]
        t = t[::-1]
        res = intToString(int(t), 'thousands')
    digit = 0  # разряд
    for i in r:
        digit += 1
        if digit == 1:
            one = i
            if option == 'thousands':
                result = thousands['0'+i]
            else:
                result = one_nineteen['0'+i]
        elif digit == 2:
            if option == 'thousands':
                if int(i) > 1:
                    result = twenty_ninety[i] + ' ' + result
                elif int(i) <= 1:
                    result = thousands[i+one]
            else:
                if int(i) > 1:
                    result = twenty_ninety[i] + ' ' + result
                elif int(i) <= 1:
                    result = one_nineteen[i+one]
        elif digit == 3:
            if int(i) > 0:
                result = hundreds[i] + ' ' + result
    if res:
        res = res.capitalize()
        return(res+' '+result)
    else:
        result = result.capitalize()
        return(result)
if __name__ == '__main__':
    a = intToString(695551)
    print(a)
Если есть варианты получше, то с удовольствием приму в дар. Или может кто поможет привести в божеский вид.

Отредактировано m1r42 (Янв. 17, 2023 10:30:41)

Офлайн

#2 Янв. 17, 2023 21:59:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10020
Репутация: +  857  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

m1r42
Если есть варианты получше, то с удовольствием приму в дар.
Я на C написал больше десяти лет назад.

Она у меня до сих пор установлена, потому что кочует от системы к системе. Но я ни разу ей не пользовался потом.

[guest@localhost ~]$ ntow
Usage: ntow gender [ word0 word1 word2 ]
Try `ntow --help' for more information.
[guest@localhost ~]$ ntow --help
Usage: ntow gender [ word0 word1 word2 ]

Converts numbers to cardinal numbers, including units.
Range of numbers is [0; 10 ^ 36 - 1].

gender -- a letter m | f | n
(masculine, feminine and neuter)
word0 -- a unit for zero
word1 -- a unit for one
word2 -- a unit for two

Words may be empty.

--help -- display this help and exit
--version -- output version information and exit

[guest@localhost ~]$ echo "1112223334445556667778889991" | ntow f куриц курица курицы
один октиллион сто двенадцать септиллионов двести двадцать три секстиллиона триста тридцать четыре квинтиллиона четыреста сорок пять квадриллионов пятьсот пятьдесят шесть триллионов шестьсот шестьдесят семь миллиардов семьсот семьдесят восемь миллионов восемьсот восемьдесят девять тысяч девятьсот девяносто одна курица
[guest@localhost ~]$

Что касается устройства, вот несколько структур данных из двух файлов исходного кода на C
struct grade {
const char *w[3];
enum gender g;
};

struct grade grades[] = {
{ { "тысяч", "тысяча", "тысячи" }, G_F },
{ { "миллионов", "миллион", "миллиона" }, G_M },
{ { "миллиардов", "миллиард", "миллиарда" }, G_M },
{ { "триллионов", "триллион", "триллиона" }, G_M },
{ { "квадриллионов", "квадриллион", "квадриллиона" }, G_M },
{ { "квинтиллионов", "квинтиллион", "квинтиллиона" }, G_M },
{ { "секстиллионов", "секстиллион", "секстиллиона" }, G_M },
{ { "септиллионов", "септиллион", "септиллиона" }, G_M },
{ { "октиллионов", "октиллион", "октиллиона" }, G_M },
{ { "нониллионов", "нониллион", "нониллиона" }, G_M },
{ { "дециллионов", "дециллион", "дециллиона" }, G_M }
};
static const char *hundreds[] = {
"сто", "двести", "триста",
"четыреста", "пятьсот", "шестьсот",
"семьсот", "восемьсот", "девятьсот"
};

static const char *teens[] = {
"одиннадцать", "двенадцать", "тринадцать",
"четырнадцать", "пятнадцать", "шестнадцать",
"семнадцать", "восемнадцать", "девятнадцать"
};

static const char *tens[] = {
"десять", "двадцать", "тридцать",
"сорок", "пятьдесят", "шестьдесят",
"семьдесят", "восемьдесят", "девяносто"
};

static const char *ten[] = {
"три",
"четыре", "пять", "шесть",
"семь", "восемь", "девять"
};

static const char *one_two[][2] = {
{ "один", "два" },
{ "одна", "две" },
{ "одно", "два" }
};
Вот это все структуры данных, которые понадобились. Из них потом всё и собирается.



Отредактировано py.user.next (Янв. 17, 2023 22:06:02)

Офлайн

#3 Янв. 17, 2023 22:10:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10020
Репутация: +  857  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

m1r42
  
                 '01': 'одна тысяча',
                 '02': 'две тысячи',
                 '03': 'три тысячи',
Вяло смотрится, я тебе так скажу. Конечно, хочется по-простому всё сделать, но там надо подумать, чтобы и миллионы были, и триллионы, и всё остальное.

Я даже в своей программе не стал ограничиваться дециллионами. Просто я дальше не знаю, что там, так как просто не нашёл ничего тогда больше дециллионов. Но программа осталась расширяемой, и если там что-то появится, я смогу добавить это легко в неё.

Сейчас, спустя десять лет, я вижу, что я сделал только два падежа - именительный и винительный. А если понадобится в родительном падеже сделать число это, то они не просклоняются этой программой даже при большом желании. То есть она не сможет написать “одного миллиона”. Но это я вижу сейчас, а тогда я этого не видел. Просто это значит, что сейчас я знаю больше, чем я знал тогда.



Отредактировано py.user.next (Янв. 17, 2023 22:15:15)

Офлайн

#4 Янв. 18, 2023 10:10:11

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

py.user.next
Конечно, хочется по-простому всё сделать, но там надо подумать, чтобы и миллионы были, и триллионы, и всё остальное.
По простому потому, что задача стаяла узкая (до тысяч) и максимально быстро надо было выполнить. За структуры и умные мысли благодарю, пригодится в дальнейших проектах. О падежах, честное слово, даже не задумывался. Надо будет какие-нибудь выходные посвятить этой задаче, развлечь моск.

Офлайн

#5 Янв. 18, 2023 18:19:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10020
Репутация: +  857  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

m1r42
О падежах, честное слово, даже не задумывался.
Я помню, что думал тогда о разных языках. Думал, что нужно сделать какой-то быстрый переход с русского на английский, на французский, на испанский. Думал тогда, что надо вывести языки наружу в какие-то файлы, чтобы быстро подключать любой новый язык, не предусмотренный ранее. Но тут я уже вижу, что даже в пределах русского я не доработал тогда, потому что даже если вывести на русском, а потом доделать со стороны рядом отдельный транслятор падежей, то работы будет много и лучше было бы это в самой программе предусмотреть, развив структуры данных ещё больше. Хотя бы на русском сделать её достаточно гибкой, уже была бы польза.

Но тогда и не было множества роботов, которые сейчас названивают по телефону каждый день от всяких разных организаций. Голосовые движки сейчас неплохо изображают живую человеческую речь, но им надо подавать как раз правильные тексты с правильными падежами там и всем прочим. То есть тогда не было наглядных примеров, где падежи могут вылезти боком. Думаю, вот из-за этого я их тогда и не закодил. Это был 2012-й или даже 2010-й год, когда я первую версию этой программы написал. Потом переписывал её, переводил на юнит-тесты.

Так что с тех пор она у меня живёт и при этом ни разу для дела не использовалась. Никогда не знаешь, что понадобится, что выстрелит, а что так и сходнет, ни разу не запустившись. В любом случае опыт остаётся после разработки и ты уже сам не замечаешь, как из одних программ в другие программы какие-нибудь идеи переносишь, куски кода, структуры конфигов. Обычное дело. Одна не используется, зато конфиги, сделанные в ней впервые, из неё пошли в другую программу на каждый день.



Отредактировано py.user.next (Янв. 18, 2023 18:25:25)

Офлайн

#6 Янв. 18, 2023 19:31:13

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

py.user.next
Я помню, что думал тогда о разных языках. Думал, что нужно сделать какой-то быстрый переход с русского на английский, на французский, на испанский…
С вашим талантом бы книги писать, ей-богу.
Я заметил, что после тысяч люди были не очень изобретательны, по сути дела начиная с миллиона можно только окончания менять в зависимости от количества единиц, и то только до пяти, ну и “надцать” (второй десяток) обработать отдельно.

Офлайн

#7 Янв. 19, 2023 09:46:39

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

m1r42
py.user.next
Основываясь на ваших данных, я тут на коленке накатал новую версию, расширяемую хоть до такоговприроденебываетльёнов. Сразу скажу, что версия бета, если кому надо сам допилит до ума:
 def ntow(num: int):
    result = ''
    s = str(num)[::-1]
    ten = 0
    block_name = {0: '',
                  1: 'тысяч',
                  2: 'миллион',
                  3: 'миллиард',
                  4: 'дохренилион',
                  5: 'стольконебыльен',
                  6: 'итакдалеебульён',
                  }
    digit_name = {1: 'единицы',
                  2: 'десятки',
                  3: 'сотни',
                  }
    thousands_endings = {0: '',
                         1: 'а',
                         2: 'и',
                         3: 'и',
                         4: 'и',
                         5: '',
                         }
    other_endings = {0: 'ов',
                     1: '',
                     2: 'а',
                     3: 'а',
                     4: 'а',
                     5: 'ов',
                     }
    one_thousand = 'одна'
    two_thousands = 'две'
    other = ['', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять',
             'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать',
             'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать']
    hundreds = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
                'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
    tens = ['', 'десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
            'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']
    for i in range(0, len(s), 3):
        block = s[i:i+3][::-1]
        block = block.rjust(3, '0')
        res = ''
        for digit in range(len(block), 0, -1):
            if digit_name[digit] == 'сотни':
                res = hundreds[int(block[0:1])]
                res += ' '
            if digit_name[digit] == 'десятки':
                if int(block[2:3]) == 0 and int(block[1:2]) > 0:  # 10 20 30 ...
                    res += tens[int(block[1:2])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) == 0:  # 01 02 03 04 ...
                    if block_name[i/3] == 'тысяч' and int(block[2:3]) == 1:
                        res += one_thousand
                    elif block_name[i/3] == 'тысяч' and int(block[2:3]) == 2:
                        res += two_thousands
                    else:
                        res += other[int(block[2:3])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) > 1:  # 21 ... 32 ... 43 ...
                    res += tens[int(block[1:2])]
                    res += ' '
                    if block_name[i / 3] == 'тысяч' and int(block[2:3]) == 1:
                        res += one_thousand
                    elif block_name[i / 3] == 'тысяч' and int(block[2:3]) == 2:
                        res += two_thousands
                    else:
                        res += other[int(block[2:3])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) == 1:  # 11 12 13 14 ...
                    res += other[int(block[1:3])]
                    res += ' '
                    ten = int(block[1:3])
        if block_name[i/3] != '':
            if int(block[0:3]) != 0:
               res += block_name[i/3]
               if block_name[i/3] == 'тысяч' and ten < 6:
                  res += thousands_endings[ten]
               elif block_name[i/3] == 'тысяч' and 5 < ten < 20:
                  res += thousands_endings[5]
               elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
                  res += thousands_endings[int(str(ten)[1:2])]
               elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
                  res += thousands_endings[5]
               elif block_name[i/3] != 'тысяч' and ten < 6:
                  res += other_endings[ten]
               elif block_name[i/3] != 'тысяч' and 5 < ten < 20:
                  res += other_endings[5]
               elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
                  res += other_endings[int(str(ten)[1:2])]
               elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
                  res += other_endings[5]
        res += ' '
        result = res + result
    result = " ".join(result.split())
    result = result.capitalize()
    print(result)
if __name__ == '__main__':
    ntow(999019225009102611555)

Девятьсот девяносто девять итакдалеебульёнов девятнадцать стольконебыльенов двести двадцать пять дохренилионов девять миллиардов сто два миллиона шестьсот одиннадцать тысяч пятьсот пятьдесят пять

Отредактировано m1r42 (Янв. 19, 2023 10:36:25)

Офлайн

#8 Янв. 19, 2023 11:00:23

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

Короче, дальше мне надоело:

 def ntow(num: int):
    result = ''
    s = str(num)[::-1]
    ten = 0
    block_name = {0: '',
                  1: 'тысяч',
                  2: 'миллион',
                  3: 'миллиард',
                  4: 'триллион',
                  5: 'квадриллион',
                  6: 'квинтиллион',
                  7: 'секстиллион',
                  8: 'септиллион',
                  9: 'октиллион',
                  10: 'нониллион',
                  11: 'дециллион',
                  12: 'ундециллион',
                  13: 'дуодециллион',
                  14: 'тредециллион',
                  15: 'кватуордециллион',
                  16: 'квиндециллион',
                  17: 'сексдециллион',
                  18: 'септендециллион',
                  19: 'октодециллион',
                  20: 'новемдециллион',
                  21: 'вигинтиллион',
                  22: 'унвигинтиллион',
                  23: 'дуовигинтиллион',
                  24: 'тревигинтиллион',
                  25: 'кватуорвигинтиллион',
                  26: 'квинвигинтиллион',
                  27: 'сексвигинтиллион',
                  28: 'септенвигинтиллион',
                  29: 'октовигинтиллион',
                  30: 'новемвигинтиллион',
                  31: 'тригинтиллион',
                  32: 'унтригинтиллион',
                  33: 'дуотригинтиллион',
                  34: 'третригинтиллион',
                  35: 'кватортригинтиллион',
                  36: 'квинтригинтиллион',
                  37: 'секстригинтиллион',
                  }
    digit_name = {1: 'единицы',
                  2: 'десятки',
                  3: 'сотни',
                  }
    thousands_endings = {0: '',
                         1: 'а',
                         2: 'и',
                         3: 'и',
                         4: 'и',
                         5: '',
                         }
    other_endings = {0: 'ов',
                     1: '',
                     2: 'а',
                     3: 'а',
                     4: 'а',
                     5: 'ов',
                     }
    one_thousand = 'одна'
    two_thousands = 'две'
    other = ['', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять',
             'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать',
             'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать']
    hundreds = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
                'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
    tens = ['', 'десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
            'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']
    for i in range(0, len(s), 3):
        block = s[i:i+3][::-1]
        block = block.rjust(3, '0')
        res = ''
        for digit in range(len(block), 0, -1):
            if digit_name[digit] == 'сотни':
                res = hundreds[int(block[0:1])]
                res += ' '
            if digit_name[digit] == 'десятки':
                if int(block[2:3]) == 0 and int(block[1:2]) > 0:  # 10 20 30 ...
                    res += tens[int(block[1:2])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) == 0:  # 01 02 03 04 ...
                    if block_name[i/3] == 'тысяч' and int(block[2:3]) == 1:
                        res += one_thousand
                    elif block_name[i/3] == 'тысяч' and int(block[2:3]) == 2:
                        res += two_thousands
                    else:
                        res += other[int(block[2:3])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) > 1:  # 21 ... 32 ... 43 ...
                    res += tens[int(block[1:2])]
                    res += ' '
                    if block_name[i / 3] == 'тысяч' and int(block[2:3]) == 1:
                        res += one_thousand
                    elif block_name[i / 3] == 'тысяч' and int(block[2:3]) == 2:
                        res += two_thousands
                    else:
                        res += other[int(block[2:3])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) == 1:  # 11 12 13 14 ...
                    res += other[int(block[1:3])]
                    res += ' '
                    ten = int(block[1:3])
        if block_name[i/3] != '':
            if int(block[0:3]) != 0:
               res += block_name[i/3]
               if block_name[i/3] == 'тысяч' and ten < 6:
                  res += thousands_endings[ten]
               elif block_name[i/3] == 'тысяч' and 5 < ten < 20:
                  res += thousands_endings[5]
               elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
                  res += thousands_endings[int(str(ten)[1:2])]
               elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
                  res += thousands_endings[5]
               elif block_name[i/3] != 'тысяч' and ten < 6:
                  res += other_endings[ten]
               elif block_name[i/3] != 'тысяч' and 5 < ten < 20:
                  res += other_endings[5]
               elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
                  res += other_endings[int(str(ten)[1:2])]
               elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
                  res += other_endings[5]
        res += ' '
        result = res + result
    result = " ".join(result.split())
    result = result.capitalize()
    print(result)
if __name__ == '__main__':
    ntow(999019225009135673535463434567773456334345634536456345563546456345634564563456345634563345635635463456354602611555)
Девятьсот девяносто девять секстригинтиллионов девятнадцать квинтригинтиллионов двести двадцать пять кватортригинтиллионов девять третригинтиллионов сто тридцать пять дуотригинтиллионов шестьсот семьдесят три унтригинтиллиона пятьсот тридцать пять тригинтиллионов четыреста шестьдесят три новемвигинтиллиона четыреста тридцать четыре октовигинтиллиона пятьсот шестьдесят семь септенвигинтиллионов семьсот семьдесят три сексвигинтиллиона четыреста пятьдесят шесть квинвигинтиллионов триста тридцать четыре кватуорвигинтиллиона триста сорок пять тревигинтиллионов шестьсот тридцать четыре дуовигинтиллиона пятьсот тридцать шесть унвигинтиллионов четыреста пятьдесят шесть вигинтиллионов триста сорок пять новемдециллионов пятьсот шестьдесят три октодециллиона пятьсот сорок шесть септендециллионов четыреста пятьдесят шесть сексдециллионов триста сорок пять квиндециллионов шестьсот тридцать четыре кватуордециллиона пятьсот шестьдесят четыре тредециллиона пятьсот шестьдесят три дуодециллиона четыреста пятьдесят шесть ундециллионов триста сорок пять дециллионов шестьсот тридцать четыре нониллиона пятьсот шестьдесят три октиллиона триста сорок пять септиллионов шестьсот тридцать пять секстиллионов шестьсот тридцать пять квинтиллионов четыреста шестьдесят три квадриллиона четыреста пятьдесят шесть триллионов триста пятьдесят четыре миллиарда шестьсот два миллиона шестьсот одиннадцать тысяч пятьсот пятьдесят пять
Я раньше даже не задумывался сколько существует названий дохренилионов.

Отредактировано m1r42 (Янв. 19, 2023 11:01:27)

Офлайн

#9 Янв. 19, 2023 11:28:41

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

Программа ломается после новемсептагинтиллионов (80 в списке). Python виновать или мои кривые руки? Хочу центиллион рублей зарплату.

 def ntow(num: int):
    result = ''
    s = str(num)[::-1]
    ten = 0
    block_name = {0: '',
                  1: 'тысяч',
                  2: 'миллион',
                  3: 'миллиард',
                  4: 'триллион',
                  5: 'квадриллион',
                  6: 'квинтиллион',
                  7: 'секстиллион',
                  8: 'септиллион',
                  9: 'октиллион',
                  10: 'нониллион',
                  11: 'дециллион',
                  12: 'ундециллион',
                  13: 'дуодециллион',
                  14: 'тредециллион',
                  15: 'кватуордециллион',
                  16: 'квиндециллион',
                  17: 'сексдециллион',
                  18: 'септендециллион',
                  19: 'октодециллион',
                  20: 'новемдециллион',
                  21: 'вигинтиллион',
                  22: 'унвигинтиллион',
                  23: 'дуовигинтиллион',
                  24: 'тревигинтиллион',
                  25: 'кватуорвигинтиллион',
                  26: 'квинвигинтиллион',
                  27: 'сексвигинтиллион',
                  28: 'септенвигинтиллион',
                  29: 'октовигинтиллион',
                  30: 'новемвигинтиллион',
                  31: 'тригинтиллион',
                  32: 'унтригинтиллион',
                  33: 'дуотригинтиллион',
                  34: 'третригинтиллион',
                  35: 'кватортригинтиллион',
                  36: 'квинтригинтиллион',
                  37: 'секстригинтиллион',
                  38: 'септентригинтиллион',
                  39: 'октотригинтиллион',
                  40: 'новемтригинтиллион',
                  41: 'квадрагинтиллион',
                  42: 'унквадрагинтиллион',
                  43: 'дуоквадрагинтиллион',
                  44: 'треквадрагинтиллион',
                  45: 'кваторквадрагинтиллион',
                  46: 'квинквадрагинтиллион',
                  47: 'сексквадрагинтиллион',
                  48: 'септенквадрагинтиллион',
                  49: 'октоквадрагинтиллион',
                  50: 'новемквадрагинтиллион',
                  51: 'квинквагинтиллион',
                  52: 'унквинкагинтиллион',
                  53: 'дуоквинкагинтиллион',
                  54: 'треквинкагинтиллион',
                  55: 'кваторквинкагинтиллион',
                  56: 'квинквинкагинтиллион',
                  57: 'сексквинкагинтиллион',
                  58: 'септенквинкагинтиллион',
                  59: 'октоквинкагинтиллион',
                  60: 'новемквинкагинтиллион',
                  61: 'сексагинтиллион',
                  62: 'унсексагинтиллион',
                  63: 'дуосексагинтиллион',
                  64: 'тресексагинтиллион',
                  65: 'кваторсексагинтиллион',
                  66: 'квинсексагинтиллион',
                  67: 'секссексагинтиллион',
                  68: 'септенсексагинтиллион',
                  69: 'октосексагинтиллион',
                  70: 'новемсексагинтиллион',
                  71: 'септагинтиллион',
                  72: 'унсептагинтиллион',
                  73: 'дуосептагинтиллион',
                  74: 'тресептагинтиллион',
                  75: 'кваторсептагинтиллион',
                  76: 'квинсептагинтиллион',
                  77: 'секссептагинтиллион',
                  78: 'септенсептагинтиллион',
                  79: 'октосептагинтиллион',
                  80: 'новемсептагинтиллион',
                  90: 'октогинтиллион',
                  91: 'уноктогинтиллион',
                  92: 'дуооктогинтиллион',
                  93: 'треоктогинтиллион',
                  94: 'кватороктогинтиллион',
                  95: 'квиноктогинтиллион',
                  96: 'сексоктогинтиллион',
                  97: 'септоктогинтиллион',
                  98: 'октооктогинтиллион',
                  99: 'новемоктогинтиллион',
                  100: 'нонагинтиллион',
                  101: 'уннонагинтиллион',
                  102: 'дуононагинтиллион',
                  103: 'тренонагинтиллион',
                  104: 'кваторнонагинтиллион',
                  105: 'квиннонагинтиллион',
                  106: 'секснонагинтиллион',
                  107: 'септеннонагинтиллион',
                  108: 'октононагинтиллион',
                  109: 'новемнонагинтиллион',
                  110: 'центиллион',
                  }
    digit_name = {1: 'единицы',
                  2: 'десятки',
                  3: 'сотни',
                  }
    thousands_endings = {0: '',
                         1: 'а',
                         2: 'и',
                         3: 'и',
                         4: 'и',
                         5: '',
                         }
    other_endings = {0: 'ов',
                     1: '',
                     2: 'а',
                     3: 'а',
                     4: 'а',
                     5: 'ов',
                     }
    one_thousand = 'одна'
    two_thousands = 'две'
    other = ['', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять',
             'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать',
             'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать']
    hundreds = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
                'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
    tens = ['', 'десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
            'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']
    for i in range(0, len(s), 3):
        block = s[i:i+3][::-1]
        block = block.rjust(3, '0')
        res = ''
        for digit in range(len(block), 0, -1):
            if digit_name[digit] == 'сотни':
                res = hundreds[int(block[0:1])]
                res += ' '
            if digit_name[digit] == 'десятки':
                if int(block[2:3]) == 0 and int(block[1:2]) > 0:  # 10 20 30 ...
                    res += tens[int(block[1:2])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) == 0:  # 01 02 03 04 ...
                    if block_name[i/3] == 'тысяч' and int(block[2:3]) == 1:
                        res += one_thousand
                    elif block_name[i/3] == 'тысяч' and int(block[2:3]) == 2:
                        res += two_thousands
                    else:
                        res += other[int(block[2:3])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) > 1:  # 21 ... 32 ... 43 ...
                    res += tens[int(block[1:2])]
                    res += ' '
                    if block_name[i / 3] == 'тысяч' and int(block[2:3]) == 1:
                        res += one_thousand
                    elif block_name[i / 3] == 'тысяч' and int(block[2:3]) == 2:
                        res += two_thousands
                    else:
                        res += other[int(block[2:3])]
                    res += ' '
                    ten = int(block[1:3])
                elif int(block[2:3]) > 0 and int(block[1:2]) == 1:  # 11 12 13 14 ...
                    res += other[int(block[1:3])]
                    res += ' '
                    ten = int(block[1:3])
        if block_name[i/3] != '':
            if int(block[0:3]) != 0:
               res += block_name[i/3]
               if block_name[i/3] == 'тысяч' and ten < 6:
                  res += thousands_endings[ten]
               elif block_name[i/3] == 'тысяч' and 5 < ten < 20:
                  res += thousands_endings[5]
               elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
                  res += thousands_endings[int(str(ten)[1:2])]
               elif block_name[i/3] == 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
                  res += thousands_endings[5]
               elif block_name[i/3] != 'тысяч' and ten < 6:
                  res += other_endings[ten]
               elif block_name[i/3] != 'тысяч' and 5 < ten < 20:
                  res += other_endings[5]
               elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) < 6:
                  res += other_endings[int(str(ten)[1:2])]
               elif block_name[i/3] != 'тысяч' and 19 < ten < 100 and int(str(ten)[1:2]) > 5:
                  res += other_endings[5]
        res += ' '
        result = res + result
    result = " ".join(result.split())
    result = result.capitalize()
    print(result)
if __name__ == '__main__':
    ntow(199019225009135673535463434567773456334345634536456345563546456345634564563456345634563345635635463456354602624254523452342893746253445454545445454545454554523465234562983745629834756298347562983475628934756289347562834756283475628934756283475)
Сто девяносто девять новемсептагинтиллионов девятнадцать октосептагинтиллионов двести двадцать пять септенсептагинтиллионов девять секссептагинтиллионов сто тридцать пять квинсептагинтиллионов шестьсот семьдесят три кваторсептагинтиллиона пятьсот тридцать пять тресептагинтиллионов четыреста шестьдесят три дуосептагинтиллиона четыреста тридцать четыре унсептагинтиллиона пятьсот шестьдесят семь септагинтиллионов семьсот семьдесят три новемсексагинтиллиона четыреста пятьдесят шесть октосексагинтиллионов триста тридцать четыре септенсексагинтиллиона триста сорок пять секссексагинтиллионов шестьсот тридцать четыре квинсексагинтиллиона пятьсот тридцать шесть кваторсексагинтиллионов четыреста пятьдесят шесть тресексагинтиллионов триста сорок пять дуосексагинтиллионов пятьсот шестьдесят три унсексагинтиллиона пятьсот сорок шесть сексагинтиллионов четыреста пятьдесят шесть новемквинкагинтиллионов триста сорок пять октоквинкагинтиллионов шестьсот тридцать четыре септенквинкагинтиллиона пятьсот шестьдесят четыре сексквинкагинтиллиона пятьсот шестьдесят три квинквинкагинтиллиона четыреста пятьдесят шесть кваторквинкагинтиллионов триста сорок пять треквинкагинтиллионов шестьсот тридцать четыре дуоквинкагинтиллиона пятьсот шестьдесят три унквинкагинтиллиона триста сорок пять квинквагинтиллионов шестьсот тридцать пять новемквадрагинтиллионов шестьсот тридцать пять октоквадрагинтиллионов четыреста шестьдесят три септенквадрагинтиллиона четыреста пятьдесят шесть сексквадрагинтиллионов триста пятьдесят четыре квинквадрагинтиллиона шестьсот два кваторквадрагинтиллиона шестьсот двадцать четыре треквадрагинтиллиона двести пятьдесят четыре дуоквадрагинтиллиона пятьсот двадцать три унквадрагинтиллиона четыреста пятьдесят два квадрагинтиллиона триста сорок два новемтригинтиллиона восемьсот девяносто три октотригинтиллиона семьсот сорок шесть септентригинтиллионов двести пятьдесят три секстригинтиллиона четыреста сорок пять квинтригинтиллионов четыреста пятьдесят четыре кватортригинтиллиона пятьсот сорок пять третригинтиллионов четыреста сорок пять дуотригинтиллионов четыреста пятьдесят четыре унтригинтиллиона пятьсот сорок пять тригинтиллионов четыреста пятьдесят четыре новемвигинтиллиона пятьсот пятьдесят четыре октовигинтиллиона пятьсот двадцать три септенвигинтиллиона четыреста шестьдесят пять сексвигинтиллионов двести тридцать четыре квинвигинтиллиона пятьсот шестьдесят два кватуорвигинтиллиона девятьсот восемьдесят три тревигинтиллиона семьсот сорок пять дуовигинтиллионов шестьсот двадцать девять унвигинтиллионов восемьсот тридцать четыре вигинтиллиона семьсот пятьдесят шесть новемдециллионов двести девяносто восемь октодециллионов триста сорок семь септендециллионов пятьсот шестьдесят два сексдециллиона девятьсот восемьдесят три квиндециллиона четыреста семьдесят пять кватуордециллионов шестьсот двадцать восемь тредециллионов девятьсот тридцать четыре дуодециллиона семьсот пятьдесят шесть ундециллионов двести восемьдесят девять дециллионов триста сорок семь нониллионов пятьсот шестьдесят два октиллиона восемьсот тридцать четыре септиллиона семьсот пятьдесят шесть секстиллионов двести восемьдесят три квинтиллиона четыреста семьдесят пять квадриллионов шестьсот двадцать восемь триллионов девятьсот тридцать четыре миллиарда семьсот пятьдесят шесть миллионов двести восемьдесят три тысячи четыреста семьдесят пять

Таки кривые руки, после 80 сразу 90
Все, теперь зарплатой доволен
Сто девятнадцать центиллионов девятьсот один новемнонагинтиллион девятьсот двадцать два октононагинтиллиона пятьсот септеннонагинтиллионов девятьсот тринадцать секснонагинтиллионов пятьсот шестьдесят семь квиннонагинтиллионов триста пятьдесят три кваторнонагинтиллиона пятьсот двадцать три тренонагинтиллиона четыреста пятьдесят два дуононагинтиллиона триста сорок пять уннонагинтиллионов двести тридцать четыре нонагинтиллиона пятьсот двадцать три новемоктогинтиллиона четыреста пятьдесят два октооктогинтиллиона триста сорок пять септоктогинтиллионов двести тридцать четыре сексоктогинтиллиона пятьсот двадцать три квиноктогинтиллиона четыреста пятьдесят два кватороктогинтиллиона триста сорок пять треоктогинтиллионов двести тридцать четыре дуооктогинтиллиона пятьсот двадцать три уноктогинтиллиона четыреста пятьдесят два октогинтиллиона триста сорок пять новемсептагинтиллионов двести тридцать четыре октосептагинтиллиона пятьсот двадцать три септенсептагинтиллиона четыреста пятьдесят два секссептагинтиллиона триста сорок пять квинсептагинтиллионов двести тридцать четыре кваторсептагинтиллиона пятьсот двадцать три тресептагинтиллиона четыреста шестьдесят три дуосептагинтиллиона четыреста тридцать четыре унсептагинтиллиона пятьсот шестьдесят семь септагинтиллионов семьсот семьдесят три новемсексагинтиллиона четыреста пятьдесят шесть октосексагинтиллионов триста тридцать четыре септенсексагинтиллиона триста сорок пять секссексагинтиллионов шестьсот тридцать четыре квинсексагинтиллиона пятьсот тридцать шесть кваторсексагинтиллионов четыреста пятьдесят шесть тресексагинтиллионов триста сорок пять дуосексагинтиллионов пятьсот шестьдесят три унсексагинтиллиона пятьсот сорок шесть сексагинтиллионов четыреста пятьдесят шесть новемквинкагинтиллионов триста сорок пять октоквинкагинтиллионов шестьсот тридцать четыре септенквинкагинтиллиона пятьсот шестьдесят четыре сексквинкагинтиллиона пятьсот шестьдесят три квинквинкагинтиллиона четыреста пятьдесят шесть кваторквинкагинтиллионов триста сорок пять треквинкагинтиллионов шестьсот тридцать четыре дуоквинкагинтиллиона пятьсот шестьдесят три унквинкагинтиллиона триста сорок пять квинквагинтиллионов шестьсот тридцать пять новемквадрагинтиллионов шестьсот тридцать пять октоквадрагинтиллионов четыреста шестьдесят три септенквадрагинтиллиона четыреста пятьдесят шесть сексквадрагинтиллионов триста пятьдесят четыре квинквадрагинтиллиона шестьсот два кваторквадрагинтиллиона шестьсот двадцать четыре треквадрагинтиллиона двести пятьдесят четыре дуоквадрагинтиллиона пятьсот двадцать три унквадрагинтиллиона четыреста пятьдесят два квадрагинтиллиона триста сорок два новемтригинтиллиона восемьсот девяносто три октотригинтиллиона семьсот сорок шесть септентригинтиллионов двести пятьдесят три секстригинтиллиона четыреста сорок пять квинтригинтиллионов четыреста пятьдесят четыре кватортригинтиллиона пятьсот сорок пять третригинтиллионов четыреста сорок пять дуотригинтиллионов четыреста пятьдесят четыре унтригинтиллиона пятьсот сорок пять тригинтиллионов четыреста пятьдесят четыре новемвигинтиллиона пятьсот пятьдесят четыре октовигинтиллиона пятьсот двадцать три септенвигинтиллиона четыреста шестьдесят пять сексвигинтиллионов двести тридцать четыре квинвигинтиллиона пятьсот шестьдесят два кватуорвигинтиллиона девятьсот восемьдесят три тревигинтиллиона семьсот сорок пять дуовигинтиллионов шестьсот двадцать девять унвигинтиллионов восемьсот тридцать четыре вигинтиллиона семьсот пятьдесят шесть новемдециллионов двести девяносто восемь октодециллионов триста сорок семь септендециллионов пятьсот шестьдесят два сексдециллиона девятьсот восемьдесят три квиндециллиона четыреста семьдесят пять кватуордециллионов шестьсот двадцать восемь тредециллионов девятьсот тридцать четыре дуодециллиона семьсот пятьдесят шесть ундециллионов двести восемьдесят девять дециллионов триста сорок семь нониллионов пятьсот шестьдесят два октиллиона восемьсот тридцать четыре септиллиона семьсот пятьдесят шесть секстиллионов двести восемьдесят три квинтиллиона четыреста семьдесят пять квадриллионов шестьсот двадцать восемь триллионов девятьсот тридцать четыре миллиарда семьсот пятьдесят шесть миллионов двести восемьдесят три тысячи четыреста семьдесят пять

Отредактировано m1r42 (Янв. 19, 2023 11:34:56)

Офлайн

#10 Янв. 19, 2023 11:43:05

m1r42
Зарегистрирован: 2022-07-26
Сообщения: 133
Репутация: +  7  -
Профиль   Отправить e-mail  

Перевод целого числа в число прописью

Что касается перевода, то тут уже какой-то транслэйтор надо подключать. Вот что Яндекс транслэйтор выдал на английском:

One hundred nineteen centillion nine hundred and one novemnonagintillion nine hundred and twenty-two octononagintillion five hundred septennonagintillion nine hundred and thirteen sexnonagintillion five hundred and sixty-seven quinnonagintillion three hundred and fifty-three quatornonagintillion five hundred and twenty-three trenonagintillion four hundred and fifty-two duononagintillion three hundred and forty-five unnonagintillion two hundred and thirty-four nonagintillion five hundred twenty-three novemoctogintillion four hundred and fifty-two octooctogintillion three hundred and forty-five septoctogintillion two hundred and thirty-four sexoctogintillion five hundred and twenty-three quinoctogintillion four hundred and fifty-two quatoroctogintillion three hundred and forty-five treoctogintillion two hundred and thirty-four duoctogintillion five hundred and twenty-three unoctogintillion four hundred and fifty-two octogintillion three hundred and forty-five novemseptagintillion two hundred and thirty-four octoseptagintillion five hundred and twenty-three septenseptagintillion four hundred and fifty-two sexseptagintillion three hundred and forty-five quinceptagintillion two hundred and thirty-four quatorseptagintillion five hundred and twenty-three treseptagintillion four hundred and sixty-three duoseptagintillion four hundred and thirty-four unseptagintillion five hundred and sixty-seven septagintillion seven hundred and seventy-three novemsexagintillion four hundred and fifty-six octosexagintillion three hundred and thirty-four septensexagintillion three hundred and forty-five sexsexagintillion six hundred and thirty-four quinsexagintillion five hundred and thirty-six quatorsexagintillion four hundred and fifty-six tresexagintillion three hundred and forty-five duosexagintillion five hundred and sixty-three unsexagintillion five hundred and forty-six sexagintillion four hundred and fifty-six novemkvinkagintillion three hundred and forty-five oktokvinkagintillion six hundred and thirty-four septenkvinkagintillion five hundred and sixty-four sexquinkagintillion five hundred and sixty-three quinquinkagintillion four hundred and fifty-six quatorquinkagintillion three hundred and forty-five trequinkagintillion six hundred and thirty-four duokvinkagintillion five hundred and sixty-three unquinkagintillion three hundred and forty-five quinquagintillion six hundred and thirty-five novemquadragintillion six hundred and thirty-five octocquadragintillion four hundred and sixty-three septencquadragintillion four hundred and fifty-six sexquadragintillion three hundred and fifty-four quinquadragintillion six hundred and two quatorquadragintillion six hundred and twenty-four trequadragintillion two hundred and fifty-four duoquadragintillion five hundred and twenty-three unquadragintillion four hundred and fifty-two quadragintillion three hundred and forty-two novemtrigintillion eight hundred and ninety-three octotrigintillion seven hundred and forty-six septentrigintillion two hundred and fifty-three sextrigintillion four hundred and forty-five quintrigintillion four hundred and fifty-four quatortrigintillion five hundred and forty-five tretrigintillion four hundred and forty-five duotrigintillion four hundred and fifty-four untrigintillion five hundred and forty-five trigintillion four hundred and fifty-four novemvigintillion five hundred and fifty-four octovigintillion five hundred and twenty-three septenvigintillion four hundred and sixty-five sexvigintillion two hundred and thirty-four quinvigintillion five hundred and sixty-two quatuorvigintillion nine hundred and eighty-three trevigintillion seven hundred and forty-five duovigintillion six hundred and twenty-nine unimigintillion eight hundred and thirty-four vigintillion seven hundred and fifty-six novemdecillions two hundred and ninety-eight octodecillions three hundred and forty-seven septendecillions five hundred sixty-two sexdecillions nine hundred and eighty-three quindecillions four hundred and seventy-five quatuordecillions six hundred and twenty-eight tredecillions nine hundred and thirty-four duodecillions seven hundred and fifty-six undecillions two hundred and eighty-nine decillions three hundred and forty-seven nonillions five hundred and sixty-two octillions eight hundred and thirty-four septillions seven hundred and fifty-six sextillions two hundred and eighty-three quintillions four hundred and seventy-five quadrillions six hundred and twenty eight trillion nine hundred thirty-four billion seven hundred fifty-six million two hundred eighty-three thousand four hundred and seventy-five

Почему-то Яндекс не везде проставляет окончание s. Хотя вроде бы как надо.

Отредактировано m1r42 (Янв. 19, 2023 11:45:28)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version