<===

ProNotes

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()
← Previous Next →
Back to list