【问题标题】:Numbers To Words in Python [duplicate]Python中的数字到单词[重复]
【发布时间】:2016-05-26 19:01:17
【问题描述】:

我想编写一个程序,它接受 1 到 9999(含)之间的整数并以文字形式打印该值。例如,如果用户输入:

3421

那么程序应该打印:

three thousand four hundred twenty one

我的代码在下面,但它不起作用。

num=int(input('please enter an integer between 1 and 9999: '))

def int_to_en(num):
    d = { 0 : 'zero', 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 : 'ninteen', 20 : 'twenty', \
          30 : 'thirty', 40 : 'fourth', 50 : 'fifty', 60 : 'sixty', \
          70 : 'seventy', 80 : 'eighty', 90 : 'ninty' }
    k = 1000
    m = k * 1000

    if (num < 20):
        print(d[num])

    if (num < 100):
        if num % 10 == 0:
            print(d[num])
        else:
            print(d[num // 10 * 10] + '' + d[num % 10])

    if (num < k):
        if num % 100 == 0:
            print(d[num // 100] + ' hundred')
        else:
            print(d[num // 100] + ' hundred ' + int_to_en(num % 100))

    if (num < m):
        if num % k == 0:
            print(int_to_en(num // k) + ' thousand')
        else:
            print(int_to_en(num // k) + ' thousand, ' + int_to_en(num % k))

【问题讨论】:

  • 具体是什么不起作用?
  • 我认为代码格式在您的原始帖子(根本没有格式)和@CactusWoman 的编辑之间搞砸了。这些if 真的在函数内部吗?
  • int_to_en没有初始调用
  • 你永远不会返回任何东西,所以你不能使用递归。
  • StackOverflow 不是编码或教程服务。当你澄清你的问题陈述时,我们需要你把额外的信息放在问题的主体中——而不是在下面的评论中。

标签: python


【解决方案1】:

一旦您费心调用该函数,您遇到的下一个问题是您的 if 语句不是排他性的。例如,输入只有 5 ... 您会看到 5

您必须确保只执行这些 if 语句中的 一个。除了第一个,使用 elif 而不是 if


要解决您的 None 问题,您可以适当地将您的 print 语句更改为 return 语句。在回到主程序之前不要打印任何东西;其他调用只是在您计算出结果时附加结果,然后主程序立即打印整个字符串。


为节省大量时间,请学习basic debugging

【讨论】:

  • 我更正了,但直到 99 写例如 nintynine 和下一行无!当我写超过 99 时,显示如下错误: Traceback(最近一次调用最后一次):文件“/Users/iSam/Desktop/number_to_word.py”,第 29 行,在 print(int_to_en(num), end = "") 文件 "/Users/iSam/Desktop/number_to_word.py",第 23 行, int_to_en 打印(d[num//100]+'百'+int_to_en(num%100)) 类型错误:不能将“NoneType”对象隐式转换为 str
  • 这正是其他人指出的问题:您从函数中返回 None。当您从递归调用返回并尝试将 None 连接到“hundred”时,会出现错误。
  • 请按照我们的建议进行更改。如果之后您有新问题并且无法解决,请发布一个新问题。我们已经解决了这一问题中的三个问题; StackOverflow 应该是每个帖子的一个问题。
  • 谢谢,但我只使用打印而不返回。
【解决方案2】:

我以前创建过这样的功能。它并不完美,但效果很好:

def word_form(number):
    """word_form(number) -> string

    Returns the word form of the number.
    >>> word_form(32)
    'thirty-two'
    >>> word_form(123)
    'one hundred twenty-three'
    The highest number it is capable of converting is:
        999,999,999,999,999,999,999,999,999,999,999"""

    ones = ("", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
    tens = ("", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety")
    teens = ("ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen")
    levels = ("", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion", "nonillion")

    word = ""
    #number will now be the reverse of the string form of itself.
    num = reversed(str(number))
    number = ""
    for x in num:
        number += x
    del num
    if len(number) % 3 == 1: number += "0"
    x = 0
    for digit in number:
        if x % 3 == 0:
            word = levels[x / 3] + ", " + word
            n = int(digit)
        elif x % 3 == 1:
            if digit == "1":
                num = teens[n]
            else:
                num = tens[int(digit)]
                if n:
                    if num:
                        num += "-" + ones[n]
                    else:
                        num = ones[n]
            word = num + " " + word
        elif x % 3 == 2:
            if digit != "0":
                word = ones[int(digit)] + " hundred " + word
        x += 1
    return word.strip(", ")

使用示例:

word_form(1)
>>> 'one'

word_form(999)
>>> 'nine hundred ninety-nine'

【讨论】:

  • 非常感谢,但我只是用我写的这个结构来写(没有 del、str 和 ...)。谢谢。
【解决方案3】:

int_to_en 的返回值为 None,这将使您的代码中的连接失败,请尝试返回 String,然后连接结果。

num=int(input('please enter an integer between 1 and 9999: '))

def int_to_en(num):
    d = { 0 : 'zero', 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 : 'ninteen', 20 : 'twenty', \
          30 : 'thirty', 40 : 'fourth', 50 : 'fifty', 60 : 'sixty', \
          70 : 'seventy', 80 : 'eighty', 90 : 'ninty' }
    k = 1000
    m = k * 1000

    if (num < 20):
        return d[num]

    if (num < 100):
        if num % 10 == 0:
            return d[num]
        else:
            return d[num // 10 * 10] + ' ' + d[num % 10]

    if (num < k):
        if num % 100 == 0:
            return d[num // 100] + ' hundred'
        else:
            return d[num // 100] + ' hundred ' + int_to_en(num % 100)
    if (num < m):
        if num % k == 0:
            return int_to_en(num // k) + ' thousand'
        else:
            return int_to_en(num // k) + ' thousand, ' + int_to_en(num % k)

print int_to_en(num)

【讨论】:

  • 谢谢。但是当我使用例如 55 时,输出是 55 乘以 55!所以我只需要一个五十五!我想我需要在 if 之间休息一下,对吧?
  • 是的,您需要添加一个缺失的空格。看看上面更正后的代码。
猜你喜欢
  • 2020-10-26
  • 2017-12-20
  • 2011-07-25
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多