Учет нуля по количеству переводчиков слов - PullRequest
0 голосов
/ 22 октября 2018

Я создаю переводчик цифр в слово и работаю с одним исключением.

У меня проблемы с учетом нулей, например, если выводится число 4056, введенное в 'four thousand zero hundred fifty six'.Кроме того, если 50 введено в 'fifty zero', выводится.

То, что у меня есть, включено ниже:

def convert(number_str):

    d1 = {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: 'nineteen'}
    l2 = ['twenty','thirty','fourty','fifty','sixty','seventy','eighty','ninety']

    if (int(number_str) >= 1) and (int(number_str) < 19):
        return(d1[number_str])
    elif (int(number_str) >= 20) and (int(number_str) <99):
        tens, single = divmod(number_str, 10)
        return l2[tens-2] + " " + d1[single]
    elif (int(number_str) >= 100) and (int(number_str) <999):
        hundreds, tens1 = divmod(number_str, 100)
        tens, single = divmod(tens1,10)
        return(d1[hundreds]+' hundred '+l2[tens-2]+" "+d1[single])
    elif (int(number_str) >= 1000) and (int(number_str) <9999):
        thousands, hundreds1 = divmod(number_str,1000)
        hundreds, tens1 = divmod(hundreds1,100)
        tens, single = divmod(tens1,10)
        return(d1[thousands]+' thousand '+d1[hundreds]+' hundred '+l2[tens-2]+" "+d1[single])

def main():

    user_input = input('> ')
    while  user_input != 'quit':
        print(convert(int(user_input)))
        user_input = input('> ')

main()

Какую логику я могу добавить, чтобы лучше справляться с использованием нулей для поддержки этой программы?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вам нужно добавить специальные условия для нуля.Например, проблему с 50 можно проверить с помощью оператора if:

lif (int(number_str) >= 20) and (int(number_str) <99):
    tens, single = divmod(number_str, 10)
    if single == 0:
        return l2[tens-2]
    else:
        return l2[tens-2] + " " + d1[single]

Вы можете написать аналогичное, если иметь дело с 0 в сотне.

0 голосов
/ 22 октября 2018

Система нумерации, которую мы используем в языке, была разработана задолго до использования арабской системы нумерации, которая эффективно использует нули в качестве заполнителя.

Я мог бы представить некоторую логику, в которой ни один ноль не комментируется,Работа.Чисто рассматривайте это как заполнитель, чтобы сделать числа слева более высоким значением 10 ^ n.

def convert(number_str):

    d1 = {0: '',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: 'nineteen'} 
 # Changed zero to an empty string
    l2 = ['twenty','thirty','fourty','fifty','sixty','seventy','eighty','ninety']
    if int(number_str) == 0: # Catches the unique case when zero is mentioned
      return('zero')
    elif (int(number_str) >= 1) and (int(number_str) < 19):
        return(d1[number_str])
    elif (int(number_str) >= 20) and (int(number_str) <=99):
        tens, single = divmod(number_str, 10)
        return l2[tens-2] + " " + d1[single]
    elif (int(number_str) >= 100) and (int(number_str) <=999):
        hundreds, tens1 = divmod(number_str, 100)
        tens, single = divmod(tens1,10)
        return(d1[hundreds]+' hundred '+((l2[tens-2]+" "+d1[single]) if tens > 1 else d1[tens*10+single]))
        # Added a conditional statement above to deal with numbers ending
        # in a number less than 20
    elif (int(number_str) >= 1000) and (int(number_str) <=9999):
        thousands, hundreds = divmod(number_str,1000)
        return(d1[thousands]+' thousand '+ convert(hundreds))
        # Added a recursive call to save code

def main():

    user_input = input('> ')
    while  user_input != 'quit':
        print(convert(int(user_input)))
        user_input = input('> ')

main()

Обратите внимание, что оно редактируется в двух местах.Сначала сделать ноль пустой строкой, затем перехватить условие, при котором оно просто равно нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...