С клавиатуры вводится любое количество гривен. Вывести результат в числовом и текстовом виде

Например, вводим 69, а выводится 69 (Шестьдесят Девять гривен).



Ответы (1 шт):

Автор решения: KABAN PUNK

Установка num2words (в командную строку)

pip install num2words 

Используй функцию conv(), передавая в неё переменную типа int

from num2words import num2words  

#функция перевода числа в словосочетание
def conv_to_word(x): 
    w = num2words(x, lang='ru')
    t = w.split()
    dct = {'один':'одна','два':'две'}
    if t[-1] in dct:
        return ' '.join(t[:-1]+[dct[t[-1]]]) 
    return w

#функция выбора нужного типа "гривен" ¯\_(ツ)_/¯
def chooce_type(w):
    w = w.split()
    dct = {'одна':'гривна','две':'гривны','три':'гривны','четыре':'гривны'}
    if w[-1] in dct:
        return dct[w[-1]]
    return 'гривен'

#функция, возвращающая нужный результат, склеивая результаты двух предыдущих
def conv(x):
    w = conv_to_word(i)
    return '{} {}'.format(w, chooce_type(w))


for i in range(1,150): 
    print(conv(i)) 

Без подключения сторонних модулей.

ZERO = ('ноль',)

ONES = {
    1: ('одна',),
    2: ('две',),
    3: ('три',),
    4: ('четыре',),
    5: ('пять',),
    6: ('шесть',),
    7: ('семь',),
    8: ('восемь',),
    9: ('девять',),
}

TENS = {
    0: ('десять',),
    1: ('одиннадцать',),
    2: ('двенадцать',),
    3: ('тринадцать',),
    4: ('четырнадцать',),
    5: ('пятнадцать',),
    6: ('шестнадцать',),
    7: ('семнадцать',),
    8: ('восемнадцать',),
    9: ('девятнадцать',),
}

TWENTIES = {
    2: ('двадцать',),
    3: ('тридцать',),
    4: ('сорок',),
    5: ('пятьдесят',),
    6: ('шестьдесят',),
    7: ('семьдесят',),
    8: ('восемьдесят',),
    9: ('девяносто',),
}

HUNDREDS = {
    1: ('сто',),
    2: ('двести',),
    3: ('триста',),
    4: ('четыреста',),
    5: ('пятьсот',),
    6: ('шестьсот',),
    7: ('семьсот',),
    8: ('восемьсот',),
    9: ('девятьсот',),
}

THOUSANDS = {
    1: ('тысяча', 'тысячи', 'тысяч'),  # 10^3
    2: ('миллион', 'миллиона', 'миллионов'),  # 10^6
    3: ('миллиард', 'миллиарда', 'миллиардов'),  # 10^9
    4: ('триллион', 'триллиона', 'триллионов'),  # 10^12
    5: ('квадриллион', 'квадриллиона', 'квадриллионов'),  # 10^15
    6: ('квинтиллион', 'квинтиллиона', 'квинтиллионов'),  # 10^18
    7: ('секстиллион', 'секстиллиона', 'секстиллионов'),  # 10^21
    8: ('септиллион', 'септиллиона', 'септиллионов'),  # 10^24
    9: ('октиллион', 'октиллиона', 'октиллионов'),  # 10^27
    10: ('нониллион', 'нониллиона', 'нониллионов'),  # 10^30
}

def splitbyx(n, x, format_int=True):
    length = len(n)
    if length > x:
        start = length % x
        if start > 0:
            result = n[:start]
            yield int(result) if format_int else result
        for i in range(start, length, x):
            result = n[i:i+x]
            yield int(result) if format_int else result
    else:
        yield int(n) if format_int else n 

def get_digits(n):
    a = [int(x) for x in reversed(list(('%03d' % n)[-3:]))]
    return a

def pluralize(n, forms):
    if n % 100 < 10 or n % 100 > 20:
        if n % 10 == 1:
            form = 0
        elif 5 > n % 10 > 1:
            form = 1
        else:
            form = 2
    else:
        form = 2
    return forms[form] 

def int2word(n):
    if n < 0:
        return ' '.join(["минус", int2word(abs(n))])

    if n == 0:
        return ZERO[0]

    words = []
    chunks = list(splitbyx(str(n), 3))
    i = len(chunks)
    for x in chunks:
        i -= 1

        if x == 0:
            continue

        n1, n2, n3 = get_digits(x)

        if n3 > 0:
            words.append(HUNDREDS[n3][0])

        if n2 > 1:
            words.append(TWENTIES[n2][0])

        if n2 == 1:
            words.append(TENS[n1][0])
        elif n1 > 0: 
            words.append(ONES[n1][0])

        if i > 0:
            words.append(pluralize(x, THOUSANDS[i]))

    return ' '.join(words)

def chooce_type(w):
    w = w.split()
    dct = {'одна':'гривна','две':'гривны','три':'гривны','четыре':'гривны'}
    if w[-1] in dct:
        return dct[w[-1]]
    return 'гривен'

def conv(x):
    w = int2word(i)
    return '{} {}'.format(w, chooce_type(w)) 

for i in range(1,150): 
    print(conv(i)) 
→ Ссылка