gpt4 book ai didi

将数字转换为文字以打印支票的 Python 脚本

转载 作者:太空狗 更新时间:2023-10-30 00:45:54 24 4
gpt4 key购买 nike

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

我需要一个 Python 脚本来将数字转换为单词以打印支票。

例如1,10,543 应提供输出为 One lac 10543

最佳答案

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

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

    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)

关于将数字转换为文字以打印支票的 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com