2012-12-17 74 views
4

我想我可以避免在這裏重新發明輪子。將腳本從數字轉換爲打印檢查的文字

我需要一個Python腳本將數字轉換爲單詞以進行打印檢查。

E.g. 1,10,543應提供輸出爲One lac ten thousand five hundred and forty three

+3

http://www.blog。 pythonlibrary.org/2010/10/21/python-converting-number s-to-words/ – NPE

+0

@NPE:該腳本提供的格式爲「一萬一五百四十三」。不太適合檢查。 – infoadmin12345

+1

看起來你需要它的印度語言環境,它很難得到一個這樣的,但你可以自定義上述腳本,以適應你的目的 – Abhijit

回答

5

寫了一個自定義轉換器與FOLL特點:

  • 數量可用於數字從0到999999999 迎合印度次大陸即LACS和億盧比(Word轉換範圍大 足夠以容納大量的用例)
  • 包括http://www.blog.pythonlibrary.org/2010/10/21/python-converting-numbers-to-words/
  • P派薩支持高達經啓發後2位小數(四捨五入)

  • rofiling信息:對於正好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) 
    
+0

以上不適用於** Python3(has_key在Python3中不可用)**,請使用Python3的以下要點:[Gist for Python 3版本的類](https://gist.github.com/ puneetkaura/f5b7592310511db6047ded4b31c77710) – PKaura

0

可以使用Python庫num2wordspip install num2words):

實施例:

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

輸出:

'one lakh, ten thousand, five hundred and forty-three' 
相關問題