С клавиатуры вводится любое количество гривен. Вывести результат в числовом и текстовом виде
Например, вводим 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))