2013-10-21 33 views
5

Ich muss Zahlen von 1 - 99 in Wörter umwandeln. Das ist, was ich bisher habe:Konvertieren von Zahlen in Wörter in Python

num2words1 = {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'} 
num2words2 = ['Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'] 

def number(Number): 

    if (Number > 1) or (Number < 19): 
     return (num2words1[Number]) 
    elif (Number > 20) or (Number < 99): 
     return (num2words2[Number]) 
    else: 
     print("Number Out Of Range") 
     main() 

def main(): 
    num = eval(input("Please enter a number between 0 and 99: ")) 
    number(num) 
main() 

Nun, das größte Problem, dass ich so weit ist, dass das, wenn elif und else-Anweisungen zu arbeiten scheinen nicht. Nur die erste if-Anweisung wird ausgeführt.

Das zweite Problem ist die Schaffung der String-Version der Zahlen von 20 bis 99 ....

Bitte helfen, danke im voraus.

P.S. Ja, ich kenne die num2word Bibliothek, aber ich darf sie nicht benutzen.

+0

Als Randbemerkung, die Sie nicht Zeilenfortsetzungs Symbole müssen '' \\ hier. – georg

+0

Nebenbei bemerkt sollten Sie die Eingabe mit 'int' statt mit' eval' umwandeln. –

+1

Ich glaube nicht, dass Sie Ihre Problemspezifikation basierend auf den bereitgestellten Antworten ändern und ein neues Problem neu festlegen sollten. Das macht die richtigen vorherigen Antworten irrelevant. – RMcG

Antwort

11

Ihre erste Anweisungslogik ist falsch. Wenn Number 1 oder kleiner ist, ist diese Aussage immer True; 200 ist auch größer als 1.

Verwenden and statt und umfassen 1 in den akzeptablen Werten:

if (Number >= 1) and (Number < 19): 

könnten Sie auch Verkettungs verwenden:

if 1 <= Number < 19: 

Für Zahlen von 20 oder größer ist, verwenden divmod() beide bekommen die Anzahl der Zehner und der Rest:

tens, below_ten = divmod(Number, 10) 

Demo:

>>> divmod(42, 10) 
(4, 2) 

dann diese Werte benutzen, um Ihre Nummer von den Teilen zu bauen:

return num2words2[tens - 2] + '-' + num2words1[below_ten] 

Alle zusammen:

def number(Number): 
    if 1 <= Number < 19: 
     return num2words1[Number] 
    elif 20 <= Number <= 99: 
     tens, below_ten = divmod(Number, 10) 
     return num2words2[tens - 2] + '-' + num2words1[below_ten] 
    else: 
     print("Number out of range") 
+0

Danke, ich reparierte es ... kann nicht glauben, dass ich sah, dass – user1919840

+0

@ user1919840: BTW, ist es gängige Praxis * lassen * Ihre Frage mit den Problemen immer noch darin. Auf diese Weise bleibt Ihre Frage für andere in der Zukunft nützlich, die auf das gleiche Problem stoßen. –

+0

Es war hilfreich, aber ich brauche immer noch Hilfe mit dem Rest des Programms, Ihre "Join" Vorschlag ist gut, aber ich darf nicht verwenden – user1919840

0
if Number > 19 and Number < 99: 
    textNumber = str(Number) 
    firstDigit, secondDigit = textNumber 
    firstWord = num2words2[int(firstDigit)] 
    secondWord = num2words1[int(secondDigit)] 
    word = firstWord + secondWord 
if Number <20 and Number > 0: 
    word = num2words1[Number] 
if Number > 99: 
    error 
1

Ich habe auch bereits Umwandlung Zahlen Wörter für einige Fuzzy-Matching-Routinen. Früher habe ich eine Bibliothek namens inflect ich aus pwdyson gegabelt, die genial gearbeitet:

https://github.com/pwdyson/inflect.py

8

Sie diese viel einfacher, indem Sie ein Wörterbuch machen und einen try/except-Klausel wie folgt aus:

num2words = {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', 20: 'Twenty', 30: 'Thirty', 40: 'Forty', \ 
      50: 'Fifty', 60: 'Sixty', 70: 'Seventy', 80: 'Eighty', \ 
      90: 'Ninety', 0: 'Zero'} 

>>> def n2w(n): 
     try: 
      print num2words[n] 
     except KeyError: 
      try: 
       print num2words[n-n%10] + num2words[n%10].lower() 
      except KeyError: 
       print 'Number out of range' 

>>> n2w(0) 
Zero 
>>> n2w(13) 
Thirteen   
>>> n2w(91) 
Ninetyone 
>>> n2w(21) 
Twentyone 
>>> n2w(33) 
Thirtythree 
0

rekursiv :

num2words = {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'} 
num2words2 = ['Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety'] 
def spell(num): 
    if num == 0: 
     return "" 
    if num < 20: 
     return (num2words[num]) 
    elif num < 100: 
     ray = divmod(num,10) 
     return (num2words2[ray[0]-2]+" "+spell(ray[1])) 
    elif num <1000: 
     ray = divmod(num,100) 
     if ray[1] == 0: 
      mid = " hundred" 
     else: 
      mid =" hundred and " 
     return(num2words[ray[0]]+mid+spell(ray[1])) 
1
import math 

number = int(input("Enter number to print: ")) 

number_list = ["zero","one","two","three","four","five","six","seven","eight","nine"] 
teen_list = ["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"] 
decades_list =["twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"] 


if number <= 9: 
    print(number_list[number].capitalize()) 
elif number >= 10 and number <= 19: 
    tens = number % 10 
    print(teen_list[tens].capitalize()) 
elif number > 19 and number <= 99: 
    ones = math.floor(number/10) 
    twos = ones - 2 
    tens = number % 10 
    if tens == 0: 
     print(decades_list[twos].capitalize()) 
    elif tens != 0: 
     print(decades_list[twos].capitalize() + " " + number_list[tens]) 
0

Dies hat seinen Zweck erfüllt für mich (Python 2.x)

nums = {1:"One", 2:"Two", 3:"Three" ,4:"Four", 5:"Five", 6:"Six", 7:"Seven", 8:"Eight",\ 
     9:"Nine", 0:"Zero", 10:"Ten", 11:"Eleven", 12:"Tweleve" , 13:"Thirteen", 14:"Fourteen", \ 
     15: "Fifteen", 16:"Sixteen", 17:"Seventeen", 18:"Eighteen", 19:"Nineteen", 20:"Twenty", 30:"Thirty", 40:"Forty", 50:"Fifty",\ 
     60:"Sixty", 70:"Seventy", 80:"Eighty", 90:"Ninety"} 
num = input("Enter a number: ") 
# To convert three digit number into words 
if 100 <= num < 1000: 
    a = num/100 
    b = num % 100 
    c = b/10 
    d = b % 10 
    if c == 1 : 
     print nums[a] + "hundred" , nums[b] 
    elif c == 0: 
     print nums[a] + "hundred" , nums[d] 
    else: 
     c *= 10 
     if d == 0: 
      print nums[a] + "hundred", nums[c] 
     else: 
      print nums[a] + "hundred" , nums[c], nums[d] 
# to convert two digit number into words    
elif 0 <= num < 100: 
    a = num/10 
    b = num % 10 
    if a == 1: 
     print nums[num] 
    else: 
     a *= 10 
     print nums[a], nums[b] 
0
def giveText(num): 
    pairs={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',20:'twenty', 
    30:'thirty',40:'fourty',50:'fifty',60:'sixty',70:'seventy',80:'eighty',90:'ninety',0:''} # this and above 2 lines are actually single line 
    return pairs[num] 

def toText(num,unit): 
    n=int(num)# this line can be removed 
    ans="" 
    if n <=20: 
     ans= giveText(n) 
    else: 
     ans= giveText(n-(n%10))+" "+giveText((n%10)) 
    ans=ans.strip() 
    if len(ans)>0: 
     return " "+ans+" "+unit 
    else: 
     return " " 

num="99,99,99,999"# use raw_input() 
num=num.replace(",","")# to remove ',' 
try: 
    num=str(int(num)) # to check valid number 
except: 
    print "Invalid" 
    exit() 

while len(num)<9: # i want fix length so no need to check it again 
    num="0"+num 

ans=toText(num[0:2],"Crore")+toText(num[2:4],"Lakh")+toText(num[4:6],"Thousand")+toText(num[6:7],"Hundred")+toText(num[7:9],"") 
print ans.strip() 
2

Verwenden Python-Bibliothek namens num2words Verbindung ->HERE

-2
num2words = {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', 20: 'Twenty', 30: 'Thirty', 40: 'Forty', \ 
       50: 'Fifty', 60: 'Sixty', 70: 'Seventy', 80: 'Eighty', \ 
       90: 'Ninety', 0: 'Zero'} 
    def n2w(n): 
    try: 
     return num2words[n] 
    except KeyError: 
     try: 
     return num2words[n-n%10] + num2words[n%10].lower() 
     except KeyError: 
     try: 
      if(n>=100 and n<=999): 
      w='' 
      w=w+str(n2w(int(n/100)))+'Hundred' 
      n=n-(int(n/100)*100) 
      if(n>0): 
       w=w+'And'+n2w(n) 
      return w  
      elif(n>=1000): 
      w='' 
      w=w+n2w(int(n/1000))+'Thousand' 
      n=n-int((n/1000))*1000 
      if(n>0 and n<100): 
       w=w+'And'+n2w(n) 
      if(n>=100): 
       w=w+n2w(int(n/100))+'Hundred' 
       n=n-(int(n/100)*100) 
       if(n>0): 
       w=w+'And'+n2w(n) 
      return w 
     except KeyError: 
      return 'Ayyao' 
    for i in range(0,99999): 
    print(n2w(i)) 
Verwandte Themen