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

Python 编写一个将数字转换为英语单词的函数,python,python-3.4,Python,Python 3.4,这是我把数字转换成英语单词的代码。这里有一个问题我无法解决。如果我输入0,这应该给我零。然而,如果我输入10的任意倍数,它将给我“百零”而不是“百” 如果我删除If x==0:返回'zero',如果我输入'0',这将给我'zero'。因此,我应该如何解决这个“零”问题 你能用kwarg吗?e、 g def spelltowords(x,inner=False): digits_to_nineteen = ['', 'one', 'two', 'three', 'four', 'five'

这是我把数字转换成英语单词的代码。这里有一个问题我无法解决。如果我输入0,这应该给我零。然而,如果我输入10的任意倍数,它将给我“百零”而不是“百”

如果我删除If x==0:返回'zero',如果我输入'0',这将给我'zero'。因此,我应该如何解决这个“零”问题


你能用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))
当x为200时,递归调用spelltowordsx%100使用0调用spelltowords。使用0调用SpellToWord将返回“零”。如果您确实希望保留当前实现,可以将当前函数转换为帮助函数,并使用如下方式调用它:

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

最里面的代码永远无法访问,x不能同时为0和小于0。

这可能是一个重复的问题-是否回答了您的请求?催眠源代码!这是一个常见的编程难题。在你完成你的版本后,寻找一个通用的算法并尝试在Python中实现它。我尝试了你的方法,但是如果我输入200或者任何一个数字的末尾有两个零,它仍然在最后给我零。你有更好的方法吗?我编辑了我写的东西,以包含整个代码,而不是一个修剪过的部分。我的产量是200。我还尝试了其他一些以零结尾的数字,它们都是干净的。如果你的问题已经解决了,别忘了。我理解你的意思,但我应该如何以代码易于理解的方式解决这个问题。我是否可以轻松地编写此代码?您的想法是正确的,它只是以一种困难的方式实现的。我的建议是使用一个单独的函数,只返回数字0-999的单词表示形式。对于每千个位置,使用x%1000得到3位数。递增一个整数以跟踪您所处的千位位置,因此0为空,1为“千位”,2为“百万位”,等等,并在每个循环中打印出来。您可以使用整数除法移动到下一个千位:number=number/1000。剩下的工作是找出如何将字符串按正确的顺序连接起来。你介意用代码给我看一下你的解释吗?对不起,如果你能做到这一点,我觉得会有帮助的。
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))
def spelltowords(x):
    if x == 0: return 'Zero'
    if x < 0: return 'Negative ' + spelltowards_helper(-1*x)
    return spelltowards_helper(x)
if x is 0:
    if x < 0:
        return 'negative' + ' ' + spelltowords(-1*x)
    return 'zero'