# English Int

smalls = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven",
"Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen",
"Sixteen", "Seventeen", "Eighteen", "Nineteen"]
tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy",
"Eighty", "Ninety"]
bigs = ["", "Thousand", "Million", "Billion"]
hundred = "Hundred"

def resolve_hundreds(value):
return value + " " + hundred + " and "

def resolve_commas_place(comma_pos):
return bigs[comma_pos]

def convert(value, pos):
result = ""
trimmed_value = str(int(value))
is_hundred = False
if len(trimmed_value) == 3:
result += resolve_hundreds(smalls[int(trimmed_value[0])])
is_hundred = True

if len(trimmed_value) == 2 or is_hundred:
removed_hundred = trimmed_value[1:] if is_hundred else trimmed_value
removed_hundred = str(int(removed_hundred))

if int(removed_hundred) <= len(smalls):
result += smalls[int(removed_hundred)] + " "
else:
for idx, i in enumerate(removed_hundred):
if idx == 0:
result += tens[int(i)] + " "
else:
result += smalls[int(i)] + " "

if len(trimmed_value) == 1:
result += smalls[int(trimmed_value)] + " "
return result + resolve_commas_place(pos)

def english_int(num):
split = reversed(num.split(','))
result = []
for idx, value in enumerate(split):
result.append(convert(value, idx))
return ' '.join(reversed(result))

if __name__ == '__main__':
# nineteen million two hundred and 34 thousand one hundred and seventy five
print(english_int("19,234,175"))
print(english_int("69,019,004,175"))
print(english_int("69,009,104,175"))

Updated on 2020-05-26