<===
2025-09-25 15:50:07
$ ./num.py 123456789.58
Сто двадцять три мільйони чотириста п’ятдесят шість тисяч сімсот вісімдесят дев’ять гривень п’ятдесят вісім копійок
#!/usr/bin/env python3
import sys
def number_to_words_ua(n):
units = ['', 'один', 'два', 'три', 'чотири', 'п’ять', 'шість', 'сім', 'вісім', 'дев’ять']
units_feminine = ['', 'одна', 'дві', 'три', 'чотири', 'п’ять', 'шість', 'сім', 'вісім', 'дев’ять']
teens = ['десять', 'одинадцять', 'дванадцять', 'тринадцять', 'чотирнадцять', 'п’ятнадцять', 'шістнадцять', 'сімнадцять', 'вісімнадцять', 'дев’ятнадцять']
tens = ['', '', 'двадцять', 'тридцять', 'сорок', 'п’ятдесят', 'шістдесят', 'сімдесят', 'вісімдесят', 'дев’яносто']
hundreds = ['', 'сто', 'двісті', 'триста', 'чотириста', 'п’ятсот', 'шістсот', 'сімсот', 'вісімсот', 'дев’ятсот']
def get_suffix(num, suffixes):
if 10 <= num % 100 <= 20:
return suffixes[2]
elif num % 10 == 1:
return suffixes[0]
elif num % 10 in (2, 3, 4):
return suffixes[1]
else:
return suffixes[2]
def helper(num, gender=False):
if num == 0:
return 'нуль'
elif num < 10:
return units_feminine[num] if gender else units[num]
elif num < 20:
return teens[num - 10]
elif num < 100:
return tens[num // 10] + (' ' + helper(num % 10, gender) if num % 10 != 0 else '')
elif num < 1000:
hundreds_word = hundreds[num // 100]
remainder = num % 100
if remainder == 0:
return hundreds_word
return hundreds_word + ' ' + helper(remainder, gender)
def format_large_number(num, suffix_forms, gender=False):
if num == 0:
return ''
word = helper(num, gender)
suffix = get_suffix(num, suffix_forms)
return f"{word} {suffix}".strip()
def process_large_numbers(num, gender=False):
if num == 0:
return 'нуль'
elif num < 1000:
return helper(num, gender)
elif num < 1_000_000:
thousands = num // 1000
remainder = num % 1000
thousands_str = format_large_number(thousands, ['тисяча', 'тисячі', 'тисяч'], gender=True)
if remainder == 0:
return thousands_str
return f"{thousands_str} {process_large_numbers(remainder, gender)}".strip()
elif num < 1_000_000_000:
millions = num // 1_000_000
remainder = num % 1_000_000
millions_str = format_large_number(millions, ['мільйон', 'мільйони', 'мільйонів'], gender=False)
if remainder == 0:
return millions_str
return f"{millions_str} {process_large_numbers(remainder, gender)}".strip()
else:
billions = num // 1_000_000_000
remainder = num % 1_000_000_000
billions_str = format_large_number(billions, ['мільярд', 'мільярди', 'мільярдів'], gender=False)
if remainder == 0:
return billions_str
return f"{billions_str} {process_large_numbers(remainder, gender)}".strip()
hryvnia = int(n)
kopiyky = int(round((n - hryvnia) * 100))
hryvnia_words = process_large_numbers(hryvnia, gender=True) if hryvnia > 0 else 'нуль'
hryvnia_suffix = get_suffix(hryvnia, ['гривня', 'гривні', 'гривень'])
hryvnia_str = f"{hryvnia_words} {hryvnia_suffix}".strip()
kopiyky_words = process_large_numbers(kopiyky, gender=True) if kopiyky > 0 else 'нуль'
kopiyky_suffix = get_suffix(kopiyky, ['копійка', 'копійки', 'копійок'])
kopiyky_str = f"{kopiyky_words} {kopiyky_suffix}".strip()
return f"{hryvnia_str.capitalize()} {kopiyky_str}"
def main():
if len(sys.argv) != 2:
print("Використання: num.py <число>")
print("Приклад: num.py 1234567890.98")
sys.exit(1)
try:
amount = float(sys.argv[1])
if amount < 0:
print("Помилка: Число не може бути від’ємним.")
sys.exit(1)
print(number_to_words_ua(amount))
except ValueError:
print("Помилка: Будь ласка, введіть коректне число.")
sys.exit(1)
if __name__ == "__main__":
main()