Программный вывод числа прописью: инструментарий Python
Преобразование чисел в прописной формат
Библиотека num2words как основное решение
Как вывести число словами на русском или любом другом языке с минимальными усилиями?
Библиотека num2words предоставляет готовый функционал для перевода чисел в прописную строку. Поддерживаются десятки языков, включая русский, английский, немецкий, французский и другие. Установка выполняется через pip.
pip install num2words
Print max python (нахождение максимума с помощью print и max в python)
Пример базового использования для русского языка:
from num2words import num2words
# Целое число
result = num2words(1234, lang='ru')
print(result) # одна тысяча двести тридцать четыре
# Число с плавающей точкой
result_float = num2words(1234.56, lang='ru')
print(result_float) # одна тысяча двести тридцать четыре запятая пятьдесят шесть
Python определить нечетное число (проверка числа на нечетность в python)
Типичные проблемы и их решение:
- Неверная установка: импорт может завершиться ошибкой, если библиотека не установлена. Решение: выполнить
pip install num2wordsв виртуальном окружении. - Падежные формы: по умолчанию num2words использует именительный падеж. Для других падежей (родительный, дательный) требуется дополнительная настройка через параметр
to='currency'или сторонние обёртки. Встроенного аргумента для падежа нет. - Большие числа: библиотека корректно обрабатывает числа до 10^150, но для сверхбольших значений может потребоваться больше памяти.
- Дробная часть: для вещественных чисел num2words по умолчанию использует слово "запятая". При необходимости можно изменить разделитель, передав параметр
separator, но это не работает для всех языков.
Самописная функция для русского языка
Как написать собственную реализацию без внешних библиотек, когда нужен полный контроль над выводом?
Создание функции, преобразующей число в словесную форму на русском языке, требует учёта склонений для единиц, десятков, сотен и родов. Ниже приведён упрощённый пример, который обрабатывает числа от 0 до 999 999.
# Фрагмент самописной функции (полный код займёт несколько страниц)
def number_to_words_ru(n):
units = ['', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять']
teens = ['десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать']
tens = ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто']
hundreds = ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
def _convert_chunk(n):
result = ''
if n >= 100:
result += hundreds[n // 100] + ' '
n %= 100
if n >= 20:
result += tens[n // 10] + ' '
n %= 10
elif n >= 10:
result += teens[n - 10] + ' '
n = 0
if n > 0:
result += units[n] + ' '
return result.strip()
if n == 0:
return 'ноль'
millions = n // 1000000
thousands = (n % 1000000) // 1000
rest = n % 1000
parts = []
if millions:
parts.append(_convert_chunk(millions) + ' миллион' + ('а' if millions % 10 in [2,3,4] else 'ов' if millions % 10 in [0,5,6,7,8,9] else '') )
if thousands:
parts.append(_convert_chunk(thousands) + ' тысяча' + (' ' if thousands % 10 == 1 else 'и ' if thousands % 10 in [2,3,4] else ' ') )
if rest:
parts.append(_convert_chunk(rest))
return ' '.join(parts)
# Проверка
print(number_to_words_ru(123456)) # сто двадцать три тысяча четыреста пятьдесят шесть
вывести число словами python (преобразование числа в текстовое представление в python)
Проблемы и ограничения самописного подхода:
- Код становится громоздким при необходимости поддержки больших чисел (миллиарды, триллионы) и разных родов (мужской, женский, средний).
- Легко допустить ошибки в склонениях для тысяч (тысяча, тысячи, тысяч) и миллионов (миллион, миллиона, миллионов).
- Требуется ручная обработка дробных чисел и копеек.
- Не поддерживает другие языки без полной переделки.
Библиотека inflect для английского языка
Как получить прописное число на английском, включая порядковые числительные?
Библиотека inflect предназначена в первую очередь для английского языка. Она умеет преобразовывать числа в слова, склонять по числам и образовывать порядковые формы.
pip install inflect
import inflect
p = inflect.engine()
# Количественное числительное
print(p.number_to_words(1234)) # one thousand two hundred and thirty-four
# Порядковое числительное
print(p.number_to_words(21, ordinal=True)) # twenty-first
# Склонение существительных после числа
print(p.number_to_words(5) + ' ' + p.plural('cat', 5)) # five cats
Проблемы при использовании inflect:
- Поддерживается только английский язык. Для других языков библиотека не подходит.
- Возвращает результат с дефисом для составных числительных (twenty-one), что не всегда удобно.
- Некорректно обрабатывает очень большие числа (выше 10^27) – возвращает научную нотацию.
Альтернатива: библиотека pynum2word
Какая ещё библиотека может преобразовывать числа в текст для разных языков?
pynum2word – менее популярная, но рабочая библиотека, которая также поддерживает русский и несколько других языков. Установка проста.
pip install pynum2word
import pynum2word as pnw
# Русский язык
print(pnw.to_word(1234, lang='ru')) # одна тысяча двести тридцать четыре
# Английский язык
print(pnw.to_word(1234)) # one thousand two hundred and thirty-four
Недостатки pynum2word:
- Проект редко обновляется, может не работать с новыми версиями Python.
- Ограниченный набор языков и настраиваемых параметров.
- Нет поддержки дробных чисел и валют.
Расширенные примеры программного кода
Дополнительные сценарии использования и неочевидные приёмы преобразования чисел в текст.
Пример 1: num2words для разных языков и форматов
Вывод числа на русском, английском и немецком с указанием различных параметров.
from num2words import num2words
# Русский: денежный формат
print(num2words(1234.50, lang='ru', to='currency')) # одна тысяча двести тридцать четыре рубля 50 копеек
# Английский: порядковое числительное
print(num2words(21, lang='en', ordinal=True)) # twenty-first
# Немецкий: дательный падеж (используется 'der')
print(num2words(1234, lang='de')) # eintausendzweihundertvierunddreißig
одна тысяча двести тридцать четыре рубля 50 копеек twenty-first eintausendzweihundertvierunddreißig
Пример 2: Самописная функция с поддержкой дробной части
Доработка самописной функции для обработки чисел с копейками.
def number_to_words_currency(n):
# Используем ранее определённую функцию number_to_words_ru для целой части
rubles = int(n)
kopecks = int(round((n - rubles) * 100))
rubles_word = number_to_words_ru(rubles)
# Склонение слова 'рубль'
if rubles % 10 == 1 and rubles % 100 != 11:
rubles_word += ' рубль'
elif rubles % 10 in [2,3,4] and rubles % 100 not in [12,13,14]:
rubles_word += ' рубля'
else:
rubles_word += ' рублей'
kopecks_word = f'{kopecks:02d} копеек'
return f'{rubles_word} {kopecks_word}'
print(number_to_words_currency(1234.56))
одна тысяча двести тридцать четыре рубля 56 копеек
Пример 3: inflect для порядковых числительных и множественного числа
Генерация корректных фраз с количеством и существительным.
import inflect
p = inflect.engine()
# Число 1000 в словах
print(p.number_to_words(1000)) # one thousand
# 101-й элемент
print(p.number_to_words(101, ordinal=True)) # one hundred and first
# Количество и существительное с учётом числа
print(p.number_to_words(3) + ' ' + p.plural('child', 3)) # three children
one thousand one hundred and first three children
Пример 4: num2words для научных и очень больших чисел
Обработка чисел до 10^24 (септиллион) и использование параметра to='year'.
from num2words import num2words
# Огромное число
big_num = 123456789012345678901234
print(num2words(big_num, lang='en'))
# Год (особое произношение)
print(num2words(2025, lang='en', to='year')) # twenty twenty-five
one hundred twenty-three septillion four hundred fifty-six sextillion seven hundred eighty-nine quintillion twelve quadrillion three hundred forty-five trillion six hundred seventy-eight billion nine hundred one million two hundred thirty-four thousand one hundred twenty-three twenty twenty-five
Пример 5: Обработка нуля и отрицательных чисел
Разные библиотеки по-разному реагируют на ноль и отрицательные значения.
from num2words import num2words
import inflect
# num2words: ноль
print(num2words(0, lang='ru')) # ноль
# num2words: отрицательное число (выдаёт ошибку, нужно предварительно обработать)
try:
print(num2words(-5, lang='ru'))
except OverflowError as e:
print('Отрицательные числа не поддерживаются:', e)
# inflect: ноль
p = inflect.engine()
print(p.number_to_words(0)) # zero
# inflect: отрицательное – также ошибка
try:
print(p.number_to_words(-5))
except Exception as e:
print('Inflect не принимает отрицательные:', e)
ноль Отрицательные числа не поддерживаются: cannot convert negative number zero Inflect не принимает отрицательные: number_to_words() requires a non-negative number
Для работы с отрицательными числами можно взять модуль числа и добавить слово "минус" вручную.