如何在不使用 num2word 库的情况下将数字转换为单词?

新手上路,请多包涵

我需要将 1 - 99 的数字转换为单词。这是我到目前为止得到的:

 num2words1 = {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'}
num2words2 = ['Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety']

def number(Number):

    if (Number > 1) or (Number < 19):
        return (num2words1[Number])
    elif (Number > 20) or (Number < 99):
        return (num2words2[Number])
    else:
        print("Number Out Of Range")
        main()

def main():
    num = eval(input("Please enter a number between 0 and 99: "))
    number(num)
main()

现在,我目前遇到的最大问题是 if、elif 和 else 语句似乎不起作用。只有第一个 if 语句运行。

第二个问题是创建数字的字符串版本 20-99….

PS 是的,我知道 num2word 库,但不允许我使用它。

原文由 user1919840 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
2 个回答

你的第一个语句逻辑不正确。除非 Number 为 1 或更小,否则该语句 始终 为真; 200 也大于 1。

使用 and 代替,并在可接受的值中包括 1

 if (Number >= 1) and (Number <= 19):

您也可以使用链接:

 if 1 <= Number <= 19:

对于 20 或更大的数字,使用 divmod() 得到十位和余数:

 tens, remainder = divmod(Number, 10)

演示:

 >>> divmod(42, 10)
(4, 2)

然后使用这些值从零件中构建您的数字:

 return num2words2[tens - 2] + '-' + num2words1[below_ten]

不要忘记考虑数字高于 20 且 divmod 操作没有余数的情况:

 return num2words2[tens - 2] + '-' + num2words1[remainder] if remainder else num2words2[tens - 2]

全部放在一起:

 def number(Number):
    if 0 <= Number <= 19:
        return num2words1[Number]
    elif 20 <= Number <= 99:
        tens, remainder = divmod(Number, 10)
        return num2words2[tens - 2] + '-' + num2words1[remainder] if remainder else num2words2[tens - 2]
    else:
        print('Number out of implemented range of numbers.')

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以通过使用一个字典和一个 try/except 子句来简化这个过程,如下所示:

 num2words = {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: 'Ninety', 0: 'Zero'}

>>> def n2w(n):
        try:
            print num2words[n]
        except KeyError:
            try:
                print num2words[n-n%10] + num2words[n%10].lower()
            except KeyError:
                print 'Number out of range'

>>> n2w(0)
Zero
>>> n2w(13)
Thirteen
>>> n2w(91)
Ninetyone
>>> n2w(21)
Twentyone
>>> n2w(33)
Thirtythree

原文由 dansalmo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题