python:将数字转换为单词

2024-10-03 02:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试写一个代码,可以将数字转换成单词,最多可达999万亿。这是我目前为止的代码。它可以工作到119,但之后事情变得一团糟。我不能使用append或enumerate。我被困在如何打印更大的数字上;如何格式化像978674237105这样的数字?在

NUMBERS = ["zero", "one", "two","three","four","five","six","seven","eight","nine",
               "ten","eleven","twelve","thirteen","fourteen","fiveteen","sixteen",
               "seventeen","eightteen","nineteen"]

TENS = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty",
            "ninety"]

HUNNITS = ["","hundred","thousand","million","billion","trillion"]

n = eval(input("What is the number the you want to convert? "))

def convert():
    if n >= 20:
        tens = n // 10
        units = n % 10

        if units != 0:
            result = TENS[tens] + "-" + NUMBERS[units]
        else:
            result = TENS[tens]
    else:
        result = NUMBERS[n]

    print (result)

def convert2():
    if n >=100:
        tens2 = n//100
        units2 = n%100

        if units2 != 0:
            result2 = HUNNITS[tens2] + "-" + TENS[tens2] + "and" + NUMBERS[units2]
        else:
            result2 = HUNNITS[tens2]
    else:
        result2 = HUNNITS[n]

    print(result2)

def main():
    if n >=20 and n< 100:
        x = convert()
    if n >=100:
        y = convert2()

main()

Tags: 代码convertifdef数字resultelseunits
3条回答

这可以很容易地递归完成:

def as_words(n):
    """Convert an integer n (+ve or -ve) to English words."""
    # lookups
    ones = ['zero', 'one', 'two', 'three', 'four',
            'five', 'six', 'seven', 'eight', 'nine', 
            'ten', 'eleven', 'twelve', 'thirteen', 'fourteen',
            'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
    tens = ['zero', 'ten', 'twenty', 'thirty', 'forty',
            'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
    # negative case
    if n < 0:
        return "minus {0}".format(as_words(abs(n)))
    # 1000+
    for order, word in [(10**12, "trillion"), (10**9, "billion"),
                        (10**6, "million"), (10**3, "thousand")]:
        if n >= order:
            return "{0} {1}{2}".format(as_words(n // order), word,
                                       " {0}".format(as_words(n % order))
                                       if n % order else "")
    # 100-999
    if n >= 100:
        if n % 100:
            return "{0} hundred and {1}".format(as_words(n // 100), 
                                                as_words(n % 100))
        else:
            return "{0} hundred".format(as_words(n // 100))
    # 0-99
    if n < 20:
        return ones[n]
    else:
        return "{0}{1}".format(tens[n // 10],
                               "-{0}".format(as_words(n % 10)) 
                               if n % 10 else "")   

我不想让你泄气,但这个问题已经解决了。有一个简洁的Python模块来完成这项工作,称为num2words

这是link to the GitHub repository

here is the actual script表示英语(它支持多种语言)。在那里你可以得到一些灵感来修改你的脚本,如果仍然需要的话。在

我最初是使用列表和python2为projecteuler编写的。很可能有bug我没有测试太多,但希望它能帮助你

nums = ["", "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"]
def num_to_words():
    n= int(input("Enter number to convert: "))
    words = ""
    if n == 0:
        words += "zero"
    else:
        numStr = "%d" % n
        groups = (len(numStr) + 2) // 3
        numStr = numStr.zfill(groups * 3)
        for i in range(0, groups*3, 3):
            h = int(numStr[i])
            t = int(numStr[i+1])
            u = int(numStr[i+2])
            g = groups - (i // 3 + 1)
            if h >= 1:
                words += nums[h]
                words +=  " hundred "
                words+=" "
                if int(numStr) % 100:   # if number  modulo 100 has remainder  add "and" i.e one hundred and ten
                    words+=" and "
            if t > 1:
                words+= tens[t]
                if u >= 1:
                    words+= nums[u]
                    words+=" "
            elif t == 1:
                if u >= 1:
                    words+= teens[(u)]
                else:
                    words+= tens[t]
                    words+=" "
            else:
                if u >= 1:
                    words+= nums[u]
                    words+=" "

            if g >= 1 and (h + t + u) > 0:
                words+= thousands[g]
                words+=" "
    return words
In [7]: num_to_words()
Enter number to convert: 12399990
Out[7]: 'twelvemillion three hundred   and ninetynine  thousand nine  hundred   and ninety'

相关问题 更多 >