When creating a script that converts digits to words I've come across some unexplainable python. The script works fine until I use a 5 digit number and get a 'IndexError: string index out of range'. After looking into it and adding some print calls, it looks like a variable changes for no reason. The example beneath is using the digits 34567, the _5digit function slices 34 off and passes it to the _2digit function, which works with 2 digit strings but the IndexError is raised. Please accept my apologies for the explanation, I'm finding it hard to put into words. Has anyone any idea why it's acting the way it is?
enter number: 34567 _5digit function used 34 before sent to _2digit 34 slice when at _2digit function 34 before sent to plus_ten function 7 slice when at _2digit function 7 before sent to plus_ten function from __future__ import print_function import sys class number(object): def __init__(self, number): #remove any preceding zero's num = int(number) self.num = str(num) self.num = number self.single = {'0':'zero','1':'one','2':'two','3':'three','4':'four', '5':'five','6':'six','7':'seven','8':'eight','9':'nine'} self.teen = {'11':'eleven','12':'twelve','13':'thirteen', '14':'fourteen','15':'fifteen','16':'sixteen', '17':'seventeen','18':'eighteen','19':'nineteen'} self.plus_ten = {'10':'ten','20':'twenty','30':'thirty','40':'forty', '50':'fifty','60':'sixty','70':'seventy', '80':'eighty','90':'ninety'} self._translate() def _translate(self): fns = [ i for i in number.__dict__ if 'digit' in i ] fns.sort() fn_name = fns[len(self.num)-1] print(fn_name,'function used') fn = number.__dict__[fn_name] print(fn(self, self.num)) def _1digit(self, n): return self.single[n] def _2digit(self, n): print(n, 'slice when at _2digit function') if '0' in self.num: return self.plus_ten[n] elif self.num[0] == '1': return self.teen[n] else: print(n,'before sent to plus_ten function') var = self.plus_ten[n[0]+'0'] + ' ' + self._1digit(n[1]) return var def _3digit(self, n): var = self._1digit(n[0]) + ' hundred and ' + self._2digit(n [1:]) return var def _4digit(self, n): var = self._1digit(n[0]) + ' thousand ' + self._3digit(n[1:]) return var def _5digit(self, n): print(n[:2],'before sent to _2digit') var = self._2digit(n[:2]) + ' thousand ' + self._4digit(n[2:]) return var class control(object): def __init__(self): pass def data_input(self): while True: i = raw_input('enter number: ') if i == 's': break #try: n = number(i) #except: # print('not a number') if __name__ in '__main__': c = control() c.data_input() -- http://mail.python.org/mailman/listinfo/python-list