【问题标题】:How to convert an integer number to words in python?如何将整数转换为python中的单词?
【发布时间】:2016-03-04 10:52:24
【问题描述】:

编写一个将整数作为输入参数并返回的函数 使用单词的整数。例如,如果输入是 4721,那么 函数应返回字符串“四七二一”。注意 单词之间应该只有一个空格,它们应该是 在您返回的字符串中全部小写。

这是我的代码:

def Numbers_To_Words (number):
    dict = {1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine", 0: "zero"}
    output_str = " "
    list = []

#Main Program
number = 4721
result = Numbers_To_Words (number)
print (result)

我的问题是,如何将数字分开,然后与我创建的字典进行比较?我知道长度不适用于整数数据类型。我知道进一步的逻辑是将键发送到字典并获取它们各自的值。但在此之前,我被困在这里分隔整数的数字。

【问题讨论】:

  • 你不能将整数转换为字符串 (str(number)) 吗?在这种情况下,您还需要更改 dict 以将字符映射到单词!
  • 我会尝试实现这个。

标签: python python-3.x


【解决方案1】:

为此使用模块: https://pypi.python.org/pypi/num2words

另外,检查类似的问题:How do I tell Python to convert integers into words

您可以安装这些模块,看看它是如何在那里实现的。

但是你的问题是这样解决的:

def numbers_to_words (number):
    number2word = {'1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six",
            '7': "seven", '8': "eight", '9': "nine", '0': "zero"}
    return " ".join(map(lambda i: number2word[i], str(number)))


print(numbers_to_words(1234))

【讨论】:

  • 这显然是一个家庭作业,所以这个答案根本没有帮助
【解决方案2】:

有一种方法比其他方法更简单:

def number_to_words(number)
    words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]
    return " ".join(words[int(i)] for i in str(number))

【讨论】:

  • ... 或 return " ".join(words[int(digit)] for digit in str(number)) - 我觉得更容易阅读。
【解决方案3】:
def number_to_words(number):
    dict={"1":"one","2":"two","3":"three","4":"four","5":"five","6":"six","7":"seven","8":"eight","9":"nine","0":"zero"}
    s=""
    for c in str(number):
        s+=dict[c]+" "
    #if it's matter that the string won't conatain
    #space at the end then add the next line:
    s=s[:-1]

    return s

【讨论】:

  • 您实际上并没有在 dict 中查看 c,并且 OP 似乎想要一个列表,而不是一个字符串。
  • 对不起,我已经修好了。
【解决方案4】:

这将帮助您在无法导入模块以将数字转换为单词的地方。此代码用于将数字从 1 转换为 1000,包括 1 和 1000。

def integer_to_english(number):
    if number>=1 and number<=1000:
        a = ['','one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen','twenty ','thirty ','fourty ','fifty ','sixty ','seventy ','eighty ','ninty ']
        if number<=20:
            if number%10==0: return a[number]
            else: return a[number]
        elif number<100:
            b=number-20
            r=b%10
            b//=10
            return a[20+b]+a[r]
        elif number<1000:
            if number%100==0:
                b=number//100
                return a[b]+' hundred'
            else:
                r=number%100
                b=number//100
                if r<=20:
                    return a[b]+' hundred'+' and '+a[r]
                else:
                    r=r-20
                    d=r//10
                    r%=10
                    return a[b]+' hundred'+' and '+a[20+d]+a[r]
        elif number==1000:
            return 'one thousand'
        else:
            return -1

number=789
print(integer_to_english(number))

【讨论】:

    【解决方案5】:

    我会使用re.sub

    >>> def Numbers_To_Words (number):
        dict_ = {'1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six", '7': "seven", '8': "eight", '9': "nine", '0': "zero"}
        return re.sub(r'\d', lambda m: dict_[m.group()] + ' ', str(number)).strip()
    
    >>> print Numbers_To_Words(4721)
    four seven two one
    >>> print Numbers_To_Words(98765423)
    nine eight seven six five four two three
    

    【讨论】:

    • 是的,“可读性很重要”。
    • 在这种情况下,Regex 似乎有点矫枉过正。
    • @GingerPlusPlus 好的,您更喜欢哪种解决方案?我可以告诉你这样做的缺点吗?
    • @AvinashRaj:zondo's answer 是我最喜欢的,JRazors' 是第二好的。如果要过滤数字,请在 map 之前将其通过 filter(str.isdigit) 管道/将 if i.isdigit() 子句添加到生成器表达式。有什么缺点吗?
    【解决方案6】:
    def number_to_words(number):
        names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
        lst = []
        while True:
            lst.insert(0, number % 10) # Prepend
            number /= 10
            if number == 0:    # Do this here rather than in the while condition
               break;          # so that 0 results in ["zero"]
    
        # If you want a list, then:
        return lst;
    
        # If you want a string, then:
        return " ".join(lst)       
    

    【讨论】:

    • 添加到 Python 列表的速度很慢。可能更快的是追加,然后反转。
    • 这实际上是我最初的反应:-),但我认为速度在这里不太重要——而可读性才是。 (哦,感谢您的编辑。正确性更为重要!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2015-06-02
    • 2014-02-16
    • 2013-03-13
    相关资源
    最近更新 更多