Python单词转数字程序Bug排查:输入特定短语输出错误值
英文单词转数字逻辑错误分析与修复
输入"three hundred fifty thousand four hundred twelve"时,程序输出35,000,412,与预期结果350412不符,问题核心在于大单位(thousand、million)的处理逻辑错误。
错误原因
原代码未区分hundred和高阶单位(thousand/million)的本质差异:
hundred是当前数值段内的乘数(比如three hundred是3×100),仅作用于当前累计的小数值;thousand/million是量级分隔节点,需要将当前累计的数值作为整体乘以量级后加到最终结果,同时重置当前累计值,否则后续的低量级数值会被错误叠加到已放大的数值上。
原代码处理thousand后未重置current,导致后续的"four hundred twelve"被叠加到350000上,最终错误放大了100倍。
修复后的代码
word = input("What is the number DON'T TYPE IN AND,-,_,or . ").lower().split() wordnum = { "zero":0, "one":1, "two":2, "three":3, "four":4, "five":5, "six":6, "seven":7, "eight":8, "nine":9, "ten":10, "eleven":11, "twelve":12, "thirteen":13, "fourteen":14, "fifteen":15, "sixteen":16, "seventeen":17, "eighteen":18, "nineteen":19, "twenty":20, "thirty":30, "forty":40, "fifty":50, "sixty":60, "seventy":70, "eighty":80, "ninety":90, "hundred":100, "thousand":1000, "million":1000000 } current = 0 final = 0 for number in word: if number not in wordnum: continue value = wordnum[number] if value < 100: current += value elif value == 100: current *= value else: # 处理thousand/million:将当前累计值乘量级后加入最终结果,重置current final += current * value current = 0 # 循环结束后,加入最后一段未遇到大单位的数值 final += current formatted_result = f"{final:,}" print(formatted_result)
关键修改说明
- 拆分单位处理逻辑:单独处理
hundred和高阶单位,避免混淆量级计算; - 遇到
thousand/million时,将当前累计值乘量级后加入最终结果,并重置current,确保后续数值重新累计; - 循环结束后补充加入最后一段未被大单位触发的数值(比如示例中的"four hundred twelve");
- 移除无用的
mult变量,简化逻辑结构。
测试输入"three hundred fifty thousand four hundred twelve",最终输出350,412,符合预期。
内容的提问来源于stack exchange,提问作者Aleksander Godfrey
相关产品推荐
相关产品推荐

