编写一个将数字转换为英文单词的函数

时间:2015-01-28 21:23:10

标签: python python-3.4

这是我将数字转换成英文单词的代码。我有一个问题,我无法解决它。如果我输入0,这应该会给我"zero"。但是,如果我输入10的任意倍数,它会给我'hundred zero'而不是'hundred'

如果我删除if x == 0: return 'zero',如果我输入'zero',这将会给我'0'。因此,我应该如何解决此'zero'问题?

# Create a function that can spell out in English while inputting a whole number

def spelltowords(x):
    digits_to_nineteen = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
    decades = ['', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']

    if x < 1000000000:
        if x < 100000000:
            if x < 20000000:
                if x < 1000000:
                    if x < 100000:
                        if x < 20000:
                            if x < 1000:
                                if x < 100:
                                    if x < 20:
                                        if x is 0:
                                            if x < 0:
                                                return 'negative' + ' ' + spelltowords(-1*x)
                                            return 'zero'
                                        return digits_to_nineteen[x]
                                    else:
                                        return decades[x // 10] + ' ' + digits_to_nineteen[x % 10]
                                else:
                                    return digits_to_nineteen[x // 100] + ' ' + 'hundred' + ' ' + spelltowords(x % 100)
                            else:
                                return digits_to_nineteen[x // 1000] + ' ' + 'thousand' + ' ' + spelltowords(x % 1000)
                        else:
                            return decades[(x // 1000) // 10] + ' ' + digits_to_nineteen[(x // 1000) % 10] + ' ' + 'thousand' + ' ' + spelltowords(x % 1000)
                    else:
                        return digits_to_nineteen[(x // 1000) // 100] + ' ' + 'hundred' + ' ' + spelltowords((x // 1000) % 100) + ' ' + 'thousand' + ' ' + spelltowords(x % 1000)
                else:
                    return digits_to_nineteen[x // 1000000] + ' ' + 'million' + ' ' + spelltowords(x % 1000000)
            else:
                return decades[(x // 1000000) // 10] + ' ' + digits_to_nineteen[(x // 1000000) % 10] + ' ' + 'million' + ' ' + spelltowords(x % 1000000)
        else:
            return digits_to_nineteen[(x // 1000000) // 100] + ' ' + 'hundred' + ' ' + spelltowords((x // 1000000) % 100)+ ' ' + 'million' + ' ' + spelltowords(x % 1000000)
    else:
        return 'over the limit!'




print(spelltowords(200))

上述代码的输出

>>> ================================ RESTART ================================
>>> 
two hundred zero
>>> 

2 个答案:

答案 0 :(得分:0)

递归调用spelltowords(x % 100)在x为200时调用带有0的拼写。使用0调用拼写将返回'zero'。如果你真的想保留当前的实现,你可以将当前函数变成一个辅助函数并用这样的方法调用它:

def spelltowords(x):
    if x == 0: return 'Zero'
    if x < 0: return 'Negative ' + spelltowards_helper(-1*x)
    return spelltowards_helper(x)

然后摆脱x is 0x < 0个案。但是,我建议尝试找出更强大的解决方案。此外,无论如何,这两个案例都有错误:

if x is 0:
    if x < 0:
        return 'negative' + ' ' + spelltowords(-1*x)
    return 'zero'

永远不会到达最里面的代码,x不能同时为0且小于0。

答案 1 :(得分:-1)

你能用kwarg吗? e.g。

def spelltowords(x,inner=False):
    digits_to_nineteen = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
    decades = ['', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']

    if x < 1000000000:
        if x < 100000000:
            if x < 20000000:
                if x < 1000000:
                    if x < 100000:
                        if x < 20000:
                            if x < 1000:
                                if x < 100:
                                    if x < 20:
                                        if x is 0:
                                            if inner:
                                                return ''
                                            else:
                                                return 'zero'
                                        elif x < 0:
                                            return 'negative' + ' ' + spelltowords(-1*x)
                                        else:
                                            return digits_to_nineteen[x]
                                    else:
                                        return decades[x // 10] + ' ' + digits_to_nineteen[x % 10]
                                else:
                                    return digits_to_nineteen[x // 100] + ' ' + 'hundred' + ' ' + spelltowords(x % 100,inner=True)
                            else:
                                return digits_to_nineteen[x // 1000] + ' ' + 'thousand' + ' ' + spelltowords(x % 1000,inner=True)
                        else:
                            return decades[(x // 1000) // 10] + ' ' + digits_to_nineteen[(x // 1000) % 10] + ' ' + 'thousand' + ' ' + spelltowords(x % 1000,inner=True)
                    else:
                        return digits_to_nineteen[(x // 1000) // 100] + ' ' + 'hundred' + ' ' + spelltowords((x // 1000) % 100) + ' ' + 'thousand' + ' ' + spelltowords(x % 1000,inner=True)
                else:
                    return digits_to_nineteen[x // 1000000] + ' ' + 'million' + ' ' + spelltowords(x % 1000000,inner=True)
            else:
                return decades[(x // 1000000) // 10] + ' ' + digits_to_nineteen[(x // 1000000) % 10] + ' ' + 'million' + ' ' + spelltowords(x % 1000000,inner=True)
        else:
            return digits_to_nineteen[(x // 1000000) // 100] + ' ' + 'hundred' + ' ' + spelltowords((x // 1000000) % 100,inner=True)+ ' ' + 'million' + ' ' + spelltowords(x % 1000000,inner=True)
    else:
        return 'over the limit!'




print(spelltowords(200))