Как это для простого конвертированного вручную рекурсивного числа в текстовый конвертер:
from math import log
DIGITS = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
TEENS = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
TENS = ['error', 'error', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
POWERS = ['error', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintrillion', 'sextillion', 'septillion', 'octillion', 'nonillion']
def three_digits_to_list(number):
places = []
while number:
places.insert(0, number % 10)
number //= 10
result = []
if len(places) == 3:
result.extend([DIGITS[places.pop(0)], "hundred"])
if len(places) == 2:
if places[0] > 1:
result.append(TENS[places.pop(0)])
elif places[0] == 1:
places.pop(0)
result.append(TEENS[places.pop(0)])
if len(places) == 1:
result.append(DIGITS[places.pop(0)])
return result
def number_to_list(number, flag=False):
try:
power = int(log(number, 1000))
except ValueError:
return [0] if flag else [] # special case for 0
if power == 0:
return three_digits_to_list(number)
magnitude = 1000 ** power
hundreds = number // magnitude
return three_digits_to_list(hundreds) + [POWERS[power]] + number_to_list(number - hundreds * magnitude)
def number_to_text(number):
return " ".join(number_to_list(number, True))
print(repr(number_to_text(659556009)))
ВЫХОД:
> python3 test.py
'six hundred fifty nine million five hundred fifty six thousand nine'
>
Я уверен, что есть некоторые особые случаи, которые все еще нужноиметь дело с, но это упражнение для ОП.