#!/usr/bin/env python
"""

Conversion from integer numbers to English words.
Author: Tommaso Soru <tom@tommaso-soru.it>

Example:
$ python numbers_words.py 3213213000312
threetrillionstwohundredsthirteenbillionstwohundredsthirteenmillionsthreehundredstwelve

License: https://creativecommons.org/licenses/by/4.0/

Version 0.0.1

"""
import sys

groups = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion']
HUN = 'hundred'
ZERO = 'zero'
MINUS = 'minus'
single = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
excep = { 10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty', 50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety' }

def prepend(a, b):
    return a + b

def numbers_words(num):
    if num == 0:
        return ZERO
    if num > 0:
        n = str(num)
    else:
        n = str(-num)
    words = ""
    for i in range(len(n) / 3 + 1):
        b = len(n)-(3*i)
        if b == 0:
            continue
        a = b - 3
        if a < 0:
            a = 0
        p = n[a:b]
        if len(p) == 1:
            p = "00" + p
        if len(p) == 2:
            p = "0" + p
        if p == "000":
            continue # skip
        out = ""
        # exceptions
        k = int(p[1:])
        if k in excep:
            out = prepend(excep[k], out)
        else:
            # units
            k2 = int(p[2])
            if k2 > 0:
                out = prepend(single[k2], out)
            # decs
            if k-k2 > 0:
                out = prepend(excep[k-k2], out)
        # hundreds
        h = int(p[0])
        s = ''
        if h > 1:
            s = 's' # plural
        if h > 0:
            out = prepend(single[h] + HUN + s, out)
        gr = groups[i]
        if int(p) > 1 and i > 0:
            gr += 's' # plural
        out = prepend(out, gr)
        words = prepend(out, words)
    if num < 0:
        words = prepend(MINUS, words) # negative
    return words
    
print numbers_words(int(sys.argv[1]))