如何在python中将最多63位的数字转换成word?

2024-06-26 00:06:30 发布

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

我想在python中将数字转换成单词,而不导入任何模块或库

我已经试过编写一些代码,但是当在这段时间内出现这么多的零时,它就不能正常工作了

print("upto sixty three digits only: ")
a=input("enter the number: ")
c=a
e=int(a)
b=""
l=[]
l2=[]
while len(c)%3 != 0:
    c="0"+c
d=len(c)/3
while len(c)!=0:
    l.append(c[0:3])
    c=c[3:len(c)]

on=["", "one","two","three", "four","five","six","seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]

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

h="hundred"
grt=["thousand","million","billion","trillion","quadrillion","quintillion","sextillion","septillion","octillion","nonillion","decillion","undecillion","duodecillion","tredecillion","quattuor-decillion","quindecillion","sexdecillion","septen-decillion","octodecillion","novemdecillion","vigintillion"                                        ]

for i in l:
    k=int(i)

    if i[0]=="0":
        if k<20:
            l2.append(on[k])
        else:
            l2.append(str(tens[k//10])+" "+str(on[k%10]))
    else:
        if int(i[1:3])<20:
            l2.append(str(on[k//100])+" "+h+" "+str(on[k%100]))
        else:
            l2.append(str(on[k//100])+" "+h+" "+str(tens[(k%100)//10])+" "+str(on[k%10]))


for i in range(0,len(l2)):

    b=b+l2[i]+" "+grt[int(d-2)]+" "
    d=d-1
l=b.split()
l.pop()
d=""
for i in l:
    d=d+i+" "
print(d)

当输入的数字之间没有零时,代码工作正常

(例如123456789=>;一亿二千三百四十五万六千七百八十九)

但当中间有许多零时,它就不起作用了

(例如120000000987=>;一亿两千万九百八十七)


Tags: 代码inforlenifon数字else
2条回答

您缺少的是一个if语句: 只要写,而不是简单的

b=b+l2[i]+" "+grt[int(d-2)]+" "

如果值为“”(0),则不添加grt wortd的if语句

if l2[i] != "":
    b=b+l2[i]+" "+grt[int(d-2)]+" "

只是一些额外的建议: 编码/测试更容易的是声明一个函数,然后您可以针对一些“测试模式”调用您的函数,并更改/改进您的代码,直到所有测试都正常为止。你知道吗

下面是一个将代码转换为函数的示例,以及一些测试这两个示例的行,这些都是您在问题中发布的。你知道吗

我得再加一行才能通过考试。 我删除了一个带有以下行的尾随空白字符:

d=d.带()

请看下面的代码:

def num2txt(num):
    a = num
    c=a
    e=int(a)
    b=""
    l=[]
    l2=[]
    while len(c)%3 != 0:
        c="0"+c
    d=len(c)/3
    while len(c)!=0:
        l.append(c[0:3])
        c=c[3:len(c)]

    on=["", "one","two","three", "four","five","six","seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]

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

    h="hundred"
    grt=["thousand","million","billion","trillion","quadrillion","quintillion","sextillion","septillion","octillion","nonillion","decillion","undecillion","duodecillion","tredecillion","quattuor-decillion","quindecillion","sexdecillion","septen-decillion","octodecillion","novemdecillion","vigintillion"                                        ]

    for i in l:
        k=int(i)

        if i[0]=="0":
            if k<20:
                l2.append(on[k])
            else:
                l2.append(str(tens[k//10])+" "+str(on[k%10]))
        else:
            if int(i[1:3])<20:
                l2.append(str(on[k//100])+" "+h+" "+str(on[k%100]))
            else:
                l2.append(str(on[k//100])+" "+h+" "+str(tens[(k%100)//10])+" "+str(on[k%10]))


    for i in range(0,len(l2)):
        if l2[i] != "":
            b=b+l2[i]+" "+grt[int(d-2)]+" "
        d=d-1
    l=b.split()
    l.pop()
    d=""
    for i in l:
        d=d+i+" "

    d = d.strip()
    return d

print("upto sixty three digits only: ")
# a=input("enter the number: ")
test_data = [
    ("123456789", "one hundred twenty three million four hundred fifty six thousand seven hundred eighty nine"),
    ("120000000987", "one hundred twenty billion nine hundred eighty seven"),
    ]

for num_str, expected in test_data:
    result = num2txt(num_str)
    if result == expected:
        print("OK", repr(num_str), "=", repr(result))
    else:
        print("KO", num_str, "=>", repr(result), "!=", repr(expected))

正如@gelonida所建议的,如果你用函数来做“肮脏的工作”会更好。例如,我修改了您的脚本,添加了两个函数,一个用于将数字划分为长度为3的块,另一个用于对前面提到的块进行“文字化”。就像这样,我相信代码会变得更简单、更简短、更易读:

def wordify(n):
    s=''
    if len(n)==3:
        s+=on[int(n[0])]+' hundred '
    if len(n)>1:
        if n[-2]=='1':
            s+=teen[int(n[-1])]
            return s
        else:
            s+=tens[int(n[-2])]+' '
    s+=on[int(n[-1])]
    return s

a=input('Insert number: ')
gb3 = lambda x: [x[i:i+3] for i in range(0,len(x),3)]
rem = len(a)%3
tokens=[a[:rem]]+gb3(a[rem:]) if rem!=0 else gb3(a[rem:])
l = len(tokens)

on=["", "one","two","three", "four","five","six","seven", "eight", "nine"]
teen=["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
tens=["","","twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
grt=["","thousand","million","billion","trillion","quadrillion","quintillion","sextillion","septillion","octillion","nonillion","decillion","undecillion","duodecillion","tredecillion","quattuor-decillion","quindecillion","sexdecillion","septen-decillion","octodecillion","novemdecillion","vigintillion"]

print()
word_number = ''
for k in range(l):
    if int(tokens[k])!=0:
        word_number += wordify(tokens[k])+' '+grt[l-k-1]+' '
print(' '.join([w for w in word_number.split(' ') if len(w)>1]))

上一次打印调用中,我使用了一个快速的方法来均匀地排列单词。 告诉我你是怎么想的!你知道吗

相关问题 更多 >