2013-10-05 3 views
0

Я начинающий программист в python, и мне нужна помощь с некоторым кодом. Прикрепленный код, над которым я работал. Цель состоит в том, чтобы взять сумму в долларах, как 305,67, и преобразовать номер в текстовую фразу типа «Триста пять долларов и шестьдесят семь центов». До сих пор я получил большую часть кода, чтобы разбить его на текст, но у меня все еще возникают проблемы с номерами 11-19, которые являются особым случаем. Мне нужна помощь в выяснении того, как программа может решить, где правильно применять 11-19, а также когда нужно удалить строку «ZERO», когда она не нужна. Если вы запустите программу, вы увидите, что я имею в виду. Цикл ниже в основной функции будет запускать цикл с учетом желаемой суммы в зависимости от функции. Кроме того, существует функция, называемая «getDollarFormatText», которая будет принимать числовую версию денег, такую ​​как 305.67 или 45.13, и предоставить вам текстовый формат. Проблема, с которой я сталкиваюсь, заключается в том, как заставить программу игнорировать десятичную и затем конвертировать все влево и вправо от десятичной дроби. Это загруженная проблема, и я буду очень благодарен за это. По сути, проблему легко исправить, но я понятия не имею, как ее решить. Код начинается с функции, которая обрабатывает двухзначные числа (я уже занимался функцией, которая разделяет только однозначные числа).Beginner Python: инструкции If-else, ошибки форматирования

def getWordForTwoDigits(amount): 

#This value uses integer division to get the number of tens within a number. 

    tensAmount = int(amount)/10 

#This variable uses the first function above to find the equivalent single number within the number given using modulo. (Zero through 9) 

    singlesWord = getWordForDigit(int(amount)%10) 

#For this decision structure, the structure is set to figuring out the number of tens within a number and appropriately naming it after its correct name (ten, twenty, etc.) 


    if tensAmount == 1: 

     wordTen = "TEN" 

    else: 

     if tensAmount == 2: 

      wordTen = "TWENTY" 

     else: 

      if tensAmount == 3: 

       wordTen = "THIRTY" 
      else: 

       if tensAmount == 4: 

        wordTen = "FORTY" 

       else: 

        if tensAmount == 5: 

         wordTen = "FIFTY" 

        else: 

         if tensAmount == 6: 

          wordTen = "SIXTY" 

         else: 

          if tensAmount == 7: 

           wordTen = "SEVENTY" 

          else: 

           if tensAmount == 8: 

            wordTen = "EIGHTY" 

           else: 

            if tensAmount == 9: 

             wordTen = "NINETY" 


return "%s-%s"%(wordTen, singlesWord) 

######################################## 

def getWordForThreeDigits(dolamount): 

    hundredAmount = int(dolamount)/100 

    twoDigits = getWordForTwoDigits(int(dolamount) % 100) 

    if hundredAmount == 0: 

     return twoDigits 

    else: 

     if hundredAmount == 1: 

      wordHun = "ONE HUNDRED" 

     else: 

      if hundredAmount == 2: 

       wordHun = "TWO HUNDRED" 

      else: 

       if hundredAmount == 3: 

        wordHun = "THREE HUNDRED" 

       else: 

        if hundredAmount == 4: 

         wordHun = "FOUR HUNDRED" 

        else: 

         if hundredAmount == 5: 

          wordHun = "FIVE HUNDRED" 

         else: 

          if hundredAmount == 6: 

           wordHun = "SIX HUNDRED" 

          else: 

           if hundredAmount == 7: 

            wordHun = "SEVEN HUNDRED" 

           else: 

            if hundredAmount == 8: 

             wordHun = "EIGHT HUNDRED" 

            else: 

             if hundredAmount == 9: 

              wordHun = "NINE HUNDRED" 


return "%s %s"%(wordHun, twoDigits) 

#################################### 

def getDollarFormatText(dollarAndCents): 

#how would you separate 190.67 (example) to 190 and 67 and and give the text form for eacn 
+3

Quick! elif на помощь! http://stackoverflow.com/questions/2395160/what-is-the-correct-syntax-for-else-if (это по крайней мере поможет вам с отступом) –

+2

И после этого взгляните на словари: http : //docs.python.org/release/2.7.5/tutorial/datastructures.html#dictionaries –

ответ

2

Хорошо ... Много проблем здесь. Давайте начнем с некоторых основных синтаксических материалов.

Прежде всего, вам нужно вернуться и посмотреть, как работает форматирование в Python. Он работает в четырех пространствах, что эквивалентно «tab», если вы находитесь в правильном процессоре. Когда вы определяете функцию, все, что будет содержаться в этой функции, должно быть на расстоянии не менее 4 пробелов. в функции «getWordForTwoDigits()» у вас есть это:

def getWordForTwoDigits(amount): 
... 
return ... 

Это возвращение должно быть четыре пространства из (вы сделали это для обоих ваших функций, BTW).

Во-вторых, ваша конструкция else-if является винтовой и ненужной. Вместо того, что у вас есть сейчас, просто сделать это:

if TensAmount == 1: 
    do something 
elif TensAmount == 2: 
    do something different 

Тогда просто добавить больше «Элиф вниз до 9.

Кроме того, вы говорите

singlesWord = getWordForDigit(int(amount)%10) 

, но вы никогда не определить эту функцию.

Для вас актуальный вопроса о том, как отделить 196 и 97, попробовать что-то вроде этого:

def splitter(num): 
    sep=str(num).rsplit('.', 1) 
    return sep 

«rsplit» в основном разбивает строку на две части на основе полукокса в первых парах.Он возвращает список ["partone", "parttwo"], поэтому вам нужно будет извлечь две части списка и преобразовать их обратно в ints в ваш основной код.

Надеюсь, что это поможет!

+0

Благодарим вас за ввод, это получилось красиво! –

+0

Добро пожаловать. –

1

использование elif вместо

else: 
if 

Это быстро исправить. Ибо часть для обработки 11-19 до

tensAmount = int(amount)/10 

использование

if 10<amount<20: 
#your statements to handle 11-19 
else: 
#your regular statements to divide by 10 again 

, но я настоятельно рекомендую вам работать со словарем, чтобы вы начали, как это.

singleDigitDict={1="one", 2="Two"}#fill up 
wordSingleDigit=singleDigitDict[singleDigitAmount] 
+0

как бы сказать после сказать, когда число равно 11, оно вернет «ELEVEN» и так далее? –

+0

как в выражении you, используйте 'if amount == 11: word =" Eleven "и т. Д., Но у разработчика есть хорошее решение для вас, посмотрите на это и поймите себя, что этот код действительно делает, и читайте замечательные комментарии Исайи, мой ответ был не полным решением, а быстрым руководством. – Ananta

+0

Спасибо за ввод! –

3

Для вашей практики мы адаптировали существующее красивое решение ref для преобразования чисел в слова следующим образом:

def numToWords(num,join=True): 
    '''words = {} convert an integer number into words''' 
    units = ['','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','quadrillion', \ 
       'quintillion','sextillion','septillion','octillion', \ 
       'nonillion','decillion','undecillion','duodecillion', \ 
       'tredecillion','quattuordecillion','sexdecillion', \ 
       'septendecillion','octodecillion','novemdecillion', \ 
       'vigintillion'] 
    words = [] 
    if num==0: words.append('zero') 
    else: 
     numStr = '%d'%num 
     numStrLen = len(numStr) 
     groups = (numStrLen+2)/3 
     numStr = numStr.zfill(groups*3) 
     for i in range(0,groups*3,3): 
      h,t,u = int(numStr[i]),int(numStr[i+1]),int(numStr[i+2]) 
      g = groups-(i/3+1) 
      if h>=1: 
       words.append(units[h]) 
       words.append('hundred') 
      if t>1: 
       words.append(tens[t]) 
       if u>=1: words.append(units[u]) 
      elif t==1: 
       if u>=1: words.append(teens[u]) 
       else: words.append(tens[t]) 
      else: 
       if u>=1: words.append(units[u]) 
      if (g>=1) and ((h+t+u)>0): words.append(thousands[g]+',') 
    if join: return ' '.join(words) 
    return words 

#example usages: 
print numToWords(0) 
print numToWords(11) 
print numToWords(110) 
print numToWords(1001000025) 
print numToWords(123456789012) 

результатов:

zero 
eleven 
one hundred ten 
one billion, one million, twenty five 
one hundred twenty three billion, four hundred fifty six million, seven hundred 
eighty nine thousand, twelve 

Обратите внимание, что это работает для целых чисел , Тем не менее тривиально делить число с плавающей точкой на две целые части.

+0

Хотя это, пожалуй, самый правильный ответ, я не могу использовать это, поскольку некоторые понятия еще не преподаются. Спасибо за ваш вклад! Я уважаю чудесное усилие! –

Смежные вопросы