Beginner Python: If-else statements, formatting errors
我是python中的初学程序员,我需要一些代码的帮助。附上我一直在研究的代码。目的是获得像305.67这样的美元金额,并将数字转换为"三百五十美元和六十七美分"之类的文本短语。到目前为止,我已经获得了大部分代码将其分解为文本,但我仍然遇到数字11-19的问题,这是一个特例。我需要帮助弄清楚程序如何正确地决定在哪里应用11-19以及何时在不需要时删除"ZERO"字符串。如果你运行该程序,你会看到我的意思。主函数中的下面的循环将根据函数给定您希望的数量来运行循环。此外,还有一个名为"getDollarFormatText"的函数,它将采用货币的数字版本,如305.67或45.13,并为您提供文本格式。我遇到的问题是如何让程序忽略小数,然后将所有内容适当地转换为小数的左右两边。这是一个负载问题,我将彻底欣赏这一点。基本上这个问题很容易解决,但我不知道如何解决它。代码以一个处理两位数字的函数开始(我已经处理了仅用一位数字分隔的函数)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | def getWordForTwoDigits(amount): #This value uses integer division to get the number of tens within a number. tensAmount = int(amount) / 10 #This variable uses the first function above to find the equivalent single number within the number given using modulo. (Zero through 9) singlesWord = getWordForDigit(int(amount)%10) #For this decision structure, the structure is set to figuring out the number of tens within a number and appropriately naming it after its correct name (ten, twenty, etc.) if tensAmount == 1: wordTen ="TEN" else: if tensAmount == 2: wordTen ="TWENTY" else: if tensAmount == 3: wordTen ="THIRTY" else: if tensAmount == 4: wordTen ="FORTY" else: if tensAmount == 5: wordTen ="FIFTY" else: if tensAmount == 6: wordTen ="SIXTY" else: if tensAmount == 7: wordTen ="SEVENTY" else: if tensAmount == 8: wordTen ="EIGHTY" else: if tensAmount == 9: wordTen ="NINETY" return"%s-%s"%(wordTen, singlesWord) ######################################## def getWordForThreeDigits(dolamount): hundredAmount = int(dolamount) / 100 twoDigits = getWordForTwoDigits(int(dolamount) % 100) if hundredAmount == 0: return twoDigits else: if hundredAmount == 1: wordHun ="ONE HUNDRED" else: if hundredAmount == 2: wordHun ="TWO HUNDRED" else: if hundredAmount == 3: wordHun ="THREE HUNDRED" else: if hundredAmount == 4: wordHun ="FOUR HUNDRED" else: if hundredAmount == 5: wordHun ="FIVE HUNDRED" else: if hundredAmount == 6: wordHun ="SIX HUNDRED" else: if hundredAmount == 7: wordHun ="SEVEN HUNDRED" else: if hundredAmount == 8: wordHun ="EIGHT HUNDRED" else: if hundredAmount == 9: wordHun ="NINE HUNDRED" return"%s %s"%(wordHun, twoDigits) #################################### def getDollarFormatText(dollarAndCents): #how would you separate 190.67 (example) to 190 and 67 and and give the text form for eacn |
为了您的练习,我们改编了一个现有的优秀解决方案ref,用于将数字转换为单词,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | def numToWords(num,join=True): '''words = {} convert an integer number into words''' units = ['','one','two','three','four','five','six','seven','eight','nine'] teens = ['','eleven','twelve','thirteen','fourteen','fifteen','sixteen', \ 'seventeen','eighteen','nineteen'] tens = ['','ten','twenty','thirty','forty','fifty','sixty','seventy', \ 'eighty','ninety'] thousands = ['','thousand','million','billion','trillion','quadrillion', \ 'quintillion','sextillion','septillion','octillion', \ 'nonillion','decillion','undecillion','duodecillion', \ 'tredecillion','quattuordecillion','sexdecillion', \ 'septendecillion','octodecillion','novemdecillion', \ 'vigintillion'] words = [] if num==0: words.append('zero') else: numStr = '%d'%num numStrLen = len(numStr) groups = (numStrLen+2)/3 numStr = numStr.zfill(groups*3) for i in range(0,groups*3,3): h,t,u = int(numStr[i]),int(numStr[i+1]),int(numStr[i+2]) g = groups-(i/3+1) if h>=1: words.append(units[h]) words.append('hundred') if t>1: words.append(tens[t]) if u>=1: words.append(units[u]) elif t==1: if u>=1: words.append(teens[u]) else: words.append(tens[t]) else: if u>=1: words.append(units[u]) if (g>=1) and ((h+t+u)>0): words.append(thousands[g]+',') if join: return ' '.join(words) return words #example usages: print numToWords(0) print numToWords(11) print numToWords(110) print numToWords(1001000025) print numToWords(123456789012) |
结果:
1 2 3 4 5 6 | zero eleven one hundred ten one billion, one million, twenty five one hundred twenty three billion, four hundred fifty six million, seven hundred eighty nine thousand, twelve |
请注意,它适用于整数。然而,将浮点数除以两个整数部分是微不足道的。
好的......这里有很多问题。让我们从一些基本的语法开始。
首先,您需要回过头来看看Python中的格式化工作原理。它适用于四个空格,如果您使用的是正确的处理器,则相当于"标签"。在定义函数时,该函数中包含的所有内容应至少为4个空格。在你的函数"getWordForTwoDigits()"中你有这个:
1 2 3 | def getWordForTwoDigits(amount): ... return ... |
那个返回应该是四个空格(你为这两个函数做了这个,BTW)。
其次,你的else-if结构是棘手的,不需要的。而不是你现在拥有的,只需这样做:
1 2 3 4 | if TensAmount == 1: do something elif TensAmount == 2: do something different |
然后只需添加更多'elif'到9。
另外,你说
1 | singlesWord = getWordForDigit(int(amount)%10) |
但你永远不会定义那个功能。
对于你如何分离196和97的实际问题,尝试这样的事情:
1 2 3 | def splitter(num): sep=str(num).rsplit('.', 1) return sep |
'rsplit'基本上根据第一个参数中的char将字符串分成两部分。它返回一个列表["partone","parttwo"],因此您需要提取列表的两个部分并将它们转换回主代码中的int。
希望有所帮助!
用
1 2 | else: if |
这是快速修复。
对于,之前处理11-19的部分
1 | tensAmount = int(amount) / 10 |
使用
1 2 3 4 | if 10<amount<20: #your statements to handle 11-19 else: #your regular statements to divide by 10 again |
但我强烈建议你使用字典,让你这样开始。
1 2 | singleDigitDict={1="one", 2="Two"}#fill up wordSingleDigit=singleDigitDict[singleDigitAmount] |