-
Notifications
You must be signed in to change notification settings - Fork 3
/
russian.py
88 lines (66 loc) · 3.19 KB
/
russian.py
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
81
82
83
84
85
86
87
88
from num2words import num2words
def number_to_russian(number):
return num2words(number, lang='ru')
def normilize_word(number: int, one, two, five):
if 5 <= number % 100 <= 19:
return five
elif (number % 10) == 1:
return one
elif 2 <= (number % 10) <= 4:
return two
else:
return five
def minute_in_nominative(minute: int, only_number=False):
# Именительный падеж для минут
if minute % 10 == 1:
minute_word = (number_to_russian(minute) + ' ').replace('один ', 'одна')
elif minute % 10 == 2:
minute_word = (number_to_russian(minute) + ' ').replace('два ', 'две')
else:
minute_word = number_to_russian(minute)
return minute_word.strip() + \
(normilize_word(minute, ' минута', ' минуты', ' минут') if not only_number else '')
def minute_in_genitive(minute: int):
# Родительный падеж для минут
assert 1 <= minute <= 30
numbers = [
'одной', 'двух', 'трех', 'четырех', 'пяти',
'шести', 'семи', 'восьми', 'девяти', 'десяти',
'одиннадцати', 'двенадцати', 'тринадцати', 'четырнадцати', 'пятнадцати',
'шестнадцати', 'семнадцати', 'восемнадцати', 'девятнадцати', 'двадцати',
'двадцати одной', 'двадцати двух', 'двадцати трех', 'двадцати четырех', 'двадцати пяти',
'двадцати шести', 'двадцати семи', 'двадцати восьми', 'двадцати девяти', 'тридцати'
]
return numbers[minute - 1]
def hour_in_nominative(hour: int, only_number=False):
# Именительный падеж для часа
number_in_russian = number_to_russian(hour)
if hour == 1:
number_in_russian = 'час'
if hour == 24 or hour == 0:
return 'полночь'
return number_in_russian + \
(normilize_word(hour, ' час', ' часа', ' часов') if not only_number and hour != 1 else '')
def hour_in_genitive(hour: int):
# Родительный падеж для часа
assert 1 <= hour <= 12
numbers = [
'первого', 'второго', 'третьего', 'четвертого', 'пятого',
'шестого', 'седьмого', 'восьмого', 'девятого', 'десятого',
'одиннадцатого', 'двенадцатого',
]
return numbers[hour - 1]
def day_in_nominative(day: int, only_number=False):
days_in_words = number_to_russian(day)
return days_in_words + \
(normilize_word(day, ' день', ' дня', ' дней') if not only_number else '')
def enumerate_items_to_string(items: list, join_word='и'):
"""
Enumerate items to string like 'one, two and three'
"""
str_items = list(map(str, items))
first_part = ', '.join(str_items[:-1])
if first_part:
return f' {join_word} '.join([first_part, str_items[-1]])
else:
return str_items[-1]