Python脚本,用于将数字转换为单词以进行打印检查

时间:2012-12-17 11:22:36

标签: python

我想我可以避免在这里重新发明轮子。

我需要一个Python脚本来将数字转换为单词以进行打印检查。

E.g。 1,10,543应提供One lac ten thousand five hundred and forty three输出。

2 个答案:

答案 0 :(得分:7)

编写了具有foll功能的自定义转换器:

  • 可用于0到999999999之间数字的数字到字转换器 迎合印度次大陆,即lacs和crore(范围很大 足以容纳大量用例)
  • 包括最多2位小数(圆形)的paisa支持
  • http://www.blog.pythonlibrary.org/2010/10/21/python-converting-numbers-to-words/
  • 帖子的启发
  • 性能分析信息:对于正好10000次运行,此脚本的执行时间为0.458秒,相对于上述脚本的0.237秒,性能较低。

    class Number2Words(object):
    
            def __init__(self):
                '''Initialise the class with useful data'''
    
                self.wordsDict = {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', 20: 'twenty', 30: 'thirty', 40: 'forty',
                                  50: 'fifty', 60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninty' }
    
                self.powerNameList = ['thousand', 'lac', 'crore']
    
    
            def convertNumberToWords(self, number):
    
                # Check if there is decimal in the number. If Yes process them as paisa part.
                formString = str(number)
                if formString.find('.') != -1:
                    withoutDecimal, decimalPart = formString.split('.')
    
                    paisaPart =  str(round(float(formString), 2)).split('.')[1]
                    inPaisa = self._formulateDoubleDigitWords(paisaPart)
    
                    formString, formNumber = str(withoutDecimal), int(withoutDecimal)
                else:
                    # Process the number part without decimal separately
                    formNumber = int(number)
                    inPaisa = None
    
                if not formNumber:
                    return 'zero'
    
                self._validateNumber(formString, formNumber)
    
                inRupees = self._convertNumberToWords(formString)
    
                if inPaisa:
                    return 'Rs. %s and %s paisa' % (inRupees.title(), inPaisa.title())
                else:
                    return 'Rs. %s' % inRupees.title()
    
    
            def _validateNumber(self, formString, formNumber):
    
                assert formString.isdigit()
    
                # Developed to provide words upto 999999999
                if formNumber > 999999999 or formNumber < 0:
                    raise AssertionError('Out Of range')
    
    
            def _convertNumberToWords(self, formString):
    
                MSBs, hundredthPlace, teens = self._getGroupOfNumbers(formString)
    
                wordsList = self._convertGroupsToWords(MSBs, hundredthPlace, teens)
    
                return ' '.join(wordsList)
    
    
            def _getGroupOfNumbers(self, formString):
    
                hundredthPlace, teens = formString[-3:-2], formString[-2:]
    
                msbUnformattedList = list(formString[:-3])
    
                #---------------------------------------------------------------------#
    
                MSBs = []
                tempstr = ''
                for num in msbUnformattedList[::-1]:
                    tempstr = '%s%s' % (num, tempstr)
                    if len(tempstr) == 2:
                        MSBs.insert(0, tempstr)
                        tempstr = ''
                if tempstr:
                    MSBs.insert(0, tempstr)
    
                #---------------------------------------------------------------------#
    
                return MSBs, hundredthPlace, teens
    
    
            def _convertGroupsToWords(self, MSBs, hundredthPlace, teens):
    
                wordList = []
    
                #---------------------------------------------------------------------#
                if teens:
                    teens = int(teens)
                    tensUnitsInWords = self._formulateDoubleDigitWords(teens)
                    if tensUnitsInWords:
                        wordList.insert(0, tensUnitsInWords)
    
                #---------------------------------------------------------------------#
                if hundredthPlace:
                    hundredthPlace = int(hundredthPlace)
                    if not hundredthPlace:
                        # Might be zero. Ignore.
                        pass
                    else:
                        hundredsInWords = '%s hundred' % self.wordsDict[hundredthPlace]
                        wordList.insert(0, hundredsInWords)
    
                #---------------------------------------------------------------------#
                if MSBs:
                    MSBs.reverse()
    
                    for idx, item in enumerate(MSBs):
                        inWords = self._formulateDoubleDigitWords(int(item))
                        if inWords:
                            inWordsWithDenomination = '%s %s' % (inWords, self.powerNameList[idx])
                            wordList.insert(0, inWordsWithDenomination)
    
                #---------------------------------------------------------------------#
                return wordList
    
    
            def _formulateDoubleDigitWords(self, doubleDigit):
    
                if not int(doubleDigit):
                    # Might be zero. Ignore.
                    return None
                elif self.wordsDict.has_key(int(doubleDigit)):
                    # Global dict has the key for this number
                    tensInWords = self.wordsDict[int(doubleDigit)]
                    return tensInWords
                else:
                    doubleDigitStr = str(doubleDigit)
                    tens, units = int(doubleDigitStr[0])*10, int(doubleDigitStr[1])
                    tensUnitsInWords = '%s %s' % (self.wordsDict[tens], self.wordsDict[units])
                    return tensUnitsInWords
    
    
    if __name__ == '__main__':
    
        wGenerator = Number2Words()
        print wGenerator.convertNumberToWords(100000)
    

答案 1 :(得分:2)

您可以使用python库num2wordspip install num2words):

示例:

from num2words import num2words
num2words(110543, to='cardinal', lang='en_IN')

输出:

'one lakh, ten thousand, five hundred and forty-three'