Try regular expressions in the re module. This should make this code below much much simpler. Downside is you have to learn a slightly different syntax. Upside is - regular expressions are very powerful.
> Last week someone had an issue with raw_input() and how to get input for > a number. So I remembered my CP/M times and got to think of a little > function I had there. The function is lost and my time is scarce but I > made a little effort and here you have the results. It has loads of room > for improvement and probably a few bugs but it's a starting point, and > it should guarantee that you get the input you need. > You just define your mask and the functions checks the input > accordingly, it returns a string. > You might improve it by displaying the mask, e.g. for mask = '9999.99' > you might see in the screen ____.__ or for mask = '999-AAA::9999' you'd > see ___-___::___ so the user will know the format of what's expected of > him, also a beep on incorrect entry might prove nice. > > HTH > > ----------------------------------------------------------------------- > import msvcrt > > _validChars = { > 'X' : > 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' > , '9' : '1234567890' > , '-' : '-1234567890' > , 'A' : > 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' > , '!' : 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'} > _validKeys = _validChars.keys() > > def maskInput(mask, separators = True) : > lmask = list(mask) > lmask.reverse() > usedMask = [] > retInput = '' > c = '' > maskChar = lmask.pop() > try : > while maskChar not in _validKeys : > if separators : > retInput += maskChar > msvcrt.putch(maskChar) > maskChar = lmask.pop() > except IndexError : pass > > c = msvcrt.getch() > while c != chr(13) : > if maskChar and maskChar not in _validKeys and c in > _validChars[lmask[-1]] : > if separators : > retInput += maskChar > msvcrt.putch(maskChar) > usedMask.append(maskChar) > maskChar = lmask.pop() > if usedMask and c == '\b' : > try : > if maskChar : > lmask.append(maskChar) > maskChar = usedMask.pop() > retInput = retInput[:-1] > msvcrt.putch(c) > msvcrt.putch(' ') > msvcrt.putch(c) > while usedMask[-1] not in _validKeys : > if maskChar : > lmask.append(maskChar) > maskChar = usedMask.pop() > if separators : > retInput = retInput[:-1] > msvcrt.putch(c) > msvcrt.putch(' ') > msvcrt.putch(c) > except IndexError : pass > elif maskChar and c in _validChars[maskChar] : > retInput += c > msvcrt.putch(c) > try : > usedMask.append(maskChar) > maskChar = lmask.pop() > # while maskChar not in _validKeys : > except IndexError : > maskChar = '' > c = msvcrt.getch() > return retInput > > if __name__ == '__main__' : > invar = maskInput('-9999.99') > print > print invar > > ------------------------------------------------------------------------ > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor