[Tutor] Text numerals?

Don Arnold darnold02 at sprynet.com
Sun May 16 01:42:15 EDT 2004



> Is there a function that will return 'one' for 1, 'two' for two, etc.?
>

  I assume you mean 'two' for 2 ;).  But no, AFAIK there is no stdlib
implementation.

<snip dictionary suggestions>

  The problem of converting full-blown numbers of any length into letters is
much harder.  Some years ago I remember this being coded in python; if the
author has a website, then Google is probably your best bet.

  But make sure you need that kind of complexity; better to have a solution
you understand than one which is too powerful that you don't.  It helps when
things go wrong ;).

-- 
Glen


my reply:

Good advice, but this problem turned out not to be as complex as it first
appeared. Really, all you need to do is pad the number to a length that's
divisible by 3 and then start processing digits from the left, three at a
time. Here's my take on it:


littleNumbers = {'1': 'one', '2': 'two', '3': 'three',
                 '4': 'four', '5': 'five', '6': 'six', '7': 'seven',
                 '8': 'eight', '9': 'nine', '10': 'ten', '11': 'eleven',
                 '12': 'twelve', '13': 'thirteen', '14': 'fourteen',
                 '15': 'fifteen', '16': 'sixteen', '17': 'seventeen',
                 '18': 'eighteen', '19': 'nineteen'
                 }

tens = {'2': 'twenty', '3': 'thirty', '4': 'forty', '5': 'fifty',
        '6': 'sixty', '7': 'seventy', '8': 'eighty', '9': 'ninety'
        }

groupings = ['decillion', 'nonillion', 'octillion',
             'septillion', 'sextillion', 'quintillion',
             'quadrillion', 'trillion', 'billion', 'million',
             'thousand', ''
             ]

def process(num):
    maxDigits = 36
    result = []
    group = 0

    if num < 0:
        result.append('negative')
        num = abs(num)

    num = str(num).zfill(maxDigits)

    if len(num) > maxDigits:
        raise 'Number too large'
   
    for i in range(0, maxDigits - 1, 3):
        chunk = num[i:i+3]
        if chunk != '000':
            if chunk[0] != '0':
                result.append(littleNumbers[chunk[0]])
                result.append('hundred')

            if chunk[1] == '1':
                result.append(littleNumbers[chunk[1:3]])
            else:
                tensString = ''
                if chunk[1] != '0':
                    if chunk[2] != '0':
                        tensString += tens[chunk[1]] + '-'
                    else:
                        tensString += tens[chunk[1]]

                if chunk[2] != '0':
                    tensString += littleNumbers[chunk[2]]

                if tensString:
                    result.append(tensString)
                    
            if groupings[group]:
                result.append(groupings[group] + ',')
        group += 1

    if not result:
        return 'zero'
    else:
        result = ' '.join(result)
        
        if result.endswith(','):
            result = result[:-1]
            
        return result

def main():
    while 1:
        print
        num = int(raw_input('Enter an integer (0 to quit): '))
        print process(num)
        if num == 0:
            break
    
if __name__ == '__main__':
    main()
    


This should handle any integer up to 36 digits long. Here's a sample run:


Enter an integer (0 to quit): 10
ten

Enter an integer (0 to quit): 243000
two hundred forty-three thousand

Enter an integer (0 to quit): 17
seventeen

Enter an integer (0 to quit): 232893
two hundred thirty-two thousand, eight hundred ninety-three

Enter an integer (0 to quit): -12
negative twelve

Enter an integer (0 to quit): -1456
negative one thousand, four hundred fifty-six

Enter an integer (0 to quit): 123456789012345678901234567890123456
one hundred twenty-three decillion, four hundred fifty-six nonillion, seven
hundred eighty-nine octillion, twelve septillion, three hundred forty-five
sextillion, six hundred seventy-eight quintillion, nine hundred one
quadrillion, two hundred thirty-four trillion, five hundred sixty-seven
billion, eight hundred ninety million, one hundred twenty-three thousand,
four hundred fifty-six

Enter an integer (0 to quit): 0
zero

HTH,
Don





More information about the Tutor mailing list