Problem with a dictionary program....

Larry Bates lbates at syscononline.com
Tue Sep 28 12:55:34 EDT 2004


Ling Lee wrote:
> Hello.
> 
> I'm trying to write a small program that lets you put in a number as an 
> integer and then it tells you the textuel representation of the number.
> 
> Like if your input is 42, it will say four two.
> 
> I found out that I have to make a dictionary like this: List = { 1:"one", 
> 2:"two" and so on )
> 
> and I have to use the raw_input method to get the number:
> 
> indput : raw_input(" Tell me the number you want to transform to textuel 
> representaion")
> 
> The I have to transform the input to a string
> indput = str(indput)
> 
> so that I can count how many decimals the number has, like 23 has 2 decimals 
> and 3000 has 4 decimals.
> 
> After I have gotten the lenght of the string, I will write a loop, that goes 
> through the dictionary as many times as the lengt of the string, and the 
> gives me the corresponding numbers, the numner 21 would go 2 times through 
> the loop and give me the output two one
> 
> Will one of you be so kind and tell me how I count the lengt of the indput 
> number i was thinking on something like input.count[:] but that dosnt 
> work...
> 
>  and how I make the loop.
> 
>  Im trying to understand dictionaries but have gotten a bit stuck...
> 
> Thanks for all replies....
> 
> 
> 
Here's an example of what you want:

""" Just run it, you'll see what it does.

This code is released into the public domain absolutely free by http://journyx.com
as long as you keep this comment on the document and all derivatives of it.

"""

def getfractionwords(num):
         frac = num-int(num)
         numstr = str(int(frac*100+.5))
         if len(numstr) == 1:
                 numstr = '0'+numstr
         fracstr = ' and ' + numstr + '/100'
         return fracstr

def convertDigit(digit):
         digits = ('', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 
'Eight', 'Nine')
         return digits[int(digit+.5)]

def breakintochunks(num):
         (left,right) = breakintwo(num)
         rv = [right]
         while left > 999:
                 (left,right) = breakintwo(left)
                 rv.append(right)
         rv.append(left)
         rv.reverse()
         return rv

def breakintwo(num):
         leftpart = int(num/1000.0)+0.0
         rightpart = 1000.0*(num/1000.0 - leftpart)
         return (int(leftpart+.5),int(rightpart+.5))

def enties(num):
         tens = ('','','Twenty' ,'Thirty', 'Forty', 'Fifty', 'Sixty',
                 'Seventy', 'Eighty', 'Ninety')
         indx = int(num/10.0)
         return tens[indx]

def convert2digit(num):
         teens = ('Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen',
                  'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen')
         if num < 10:
                 return convertDigit(num)
         if num <20:
                 return teens[num-10]
         if num > 19:
                 tens = enties(num)
                 ones = convertDigit(10*(num/10.0-int(num/10.0)))
                 if ones:
                         rv= tens+'-'+ones
                 else:
                         rv=tens
                 return rv

def convert3digit(num):
         threenum = str(num)
         ln = len(threenum)
         if ln==3 :
                 a= convertDigit(int(threenum[0]))
                 b= ' Hundred '
                 c=     convert2digit(int(threenum[1:]))
                 return a+b+c
         if ln<3 :
                 return convert2digit(int(threenum))
         raise 'bad num',num

def num2words(num):
         thousandchunks = breakintochunks(int(num))
         rv = ' '
         if num >= 1000000:
                 rv=rv+ convert3digit(thousandchunks[-3])+ ' Million '
         if num >= 1000:
                 c3d= convert3digit(thousandchunks[-2])
                 if c3d:
                         rv=rv+ c3d+ ' Thousand '
         rv = rv + convert3digit(thousandchunks[-1])+ getfractionwords(num)
         return squishWhiteSpace(rv)

def squishWhiteSpace(strng):
         """ Turn 2 spaces into one, and get rid of leading and trailing
             spaces. """
         import string,re
         return string.strip(re.sub('[ \t\n]+', ' ', strng))

def main():
         for i in range(1,111,7):
                 print i,num2words(i)

         for i in (494.15, 414.90, 499.35, 400.98, 101.65, 110.94, \
                   139.85, 12349133.40, 2309033.75, 390313.41, 99390313.15, \
                   14908.05, 10008.49, 100008.00, 1000008.00, 100000008.00, \
                   14900.05, 10000.49, 100000.00, 1000000.00, 100000000.00, 8.49):
                 print i,num2words(i)

         import whrandom
         for i in range(33):
                 num = whrandom.randint(1,999999999) + whrandom.randint(1,99)/100.0
                 print num,num2words(num)

if __name__ == '__main__':
         main()



More information about the Python-list mailing list