2012-06-24 3 views
7

Ich habe eine Liste von ganzen Zahlen - gibt es eine Bibliothek, um sie in reine Text-Rangliste zu konvertieren? IE: 1,2,3 -> "erste, zweite, dritte"?Gibt es eine Bibliothek, um Ganzzahl in erste/zweite/dritte zu konvertieren

+1

http://www.daniweb.com/software-development/python/code/216839/number-to-word-converter-python –

+1

Als ich mit der Universität anfing, war es eine unserer Aufgaben am ersten Tag genau das zu schreiben Java. Wenn Sie etwas Erfahrung in der Programmierung haben, sollten Sie nicht länger als 30 Minuten brauchen. –

+1

30 Minuten? wirklich lol .. du meinst 1 minuten .... http://jsfiddle.net/cmvLS/ (javascript) – ncubica

Antwort

5

Wie hoch möchten Sie gehen? (Erwarten Sie, je höher ist als, sagen wir, „zwanzigste“?)

Vielleicht brauchen Sie nur ein dict,

nth = { 
    1: "first", 
    2: "second", 
    3: "third", 
    4: "fourth" 
    # etc 
} 
+3

Es wird nur einfacher nach "zwanzigsten" :) –

2

Je nach Situation könnten Sie finden es sinnvoll, die ganze Zahl zu erhalten und fügen Sie " st "," nd "," rd "und" th ". Wenn ja, ist hier ein einfacher Algorithmus:

HINWEIS: Dieser Algorithmus ist in Java geschrieben. Ich kenne Python nicht. Jeder, der es in Python umschreiben möchte, sei mein Gast.

public static String appendInt(int number) { 
    String value = String.valueOf(number); 
    if(value.length() > 1) { 
     // Check for special case: 11 - 13 are all "th". 
     // So if the second to last digit is 1, it is "th". 
     char secondToLastDigit = value.charAt(value.length()-2); 
     if(secondToLastDigit == '1') 
      return "th"; 
    } 
    char lastDigit = value.charAt(value.length()-1); 
    switch(lastDigit) { 
     case '1': 
      return "st"; 
     case '2': 
      return "nd"; 
     case '3': 
      return "rd"; 
     default: 
      return "th"; 
    } 
} 

So

System.out.println(1 + appendInt(1)); 
System.out.println(2 + appendInt(2)); 
System.out.println(3 + appendInt(3)); 
System.out.println(4 + appendInt(4)); 
System.out.println(5 + appendInt(5)); 
System.out.println(11 + appendInt(11)); 
System.out.println(21 + appendInt(21)); 

Displays

1st 
2nd 
3rd 
4th 
5th 
11th 
21st 
+0

Das ist ein toller Weg, darüber zu gehen. – answerSeeker

3

nicht kommentieren ryvantage der Post wegen der Punkte, aber ich schrieb den gleichen Code für Python:

def appendInt(num): 
    if num > 9: 
     secondToLastDigit = str(num)[-2] 
     if secondToLastDigit == '1': 
      return 'th' 
    lastDigit = num % 10 
    if (lastDigit == 1): 
     return 'st' 
    elif (lastDigit == 2): 
     return 'nd' 
    elif (lastDigit == 3): 
     return 'rd' 
    else: 
     return 'th' 



def appendInt2(num): 
    value = str(num) 
    if len(value) > 1: 
     secondToLastDigit = value[-2] 
     if secondToLastDigit == '1': 
      return 'th' 
    lastDigit = value[-1] 
    if (lastDigit == '1'): 
     return 'st' 
    elif (lastDigit == '2'): 
     return 'nd' 
    elif (lastDigit == '3'): 
     return 'rd' 
    else: 
     return 'th' 

Die das zweite ist eher ein direktes trans lation, aber ich fand, dass die erste Variante wesentlich schneller ist:

Fr 28 11.48.13 2015 August führt in die Vene

  300000005 function calls in 151.561 seconds 

    Ordered by: call count, name/file/line 

    ncalls tottime percall cumtime percall filename:lineno(function) 
100000000 6.674 0.000 6.674 0.000 {len} 
100000000 43.064 0.000 43.064 0.000 test.py:7(appendInt) 
100000000 66.664 0.000 73.339 0.000 test.py:22(appendInt2) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     1 0.000 0.000 151.561 151.561 <string>:1(<module>) 
     1 0.000 0.000 151.561 151.561 test.py:51(main) 
     1 16.737 16.737 59.801 59.801 test.py:39(test1) 
     1 18.421 18.421 91.759 91.759 test.py:45(test2) 
+0

Array [-2] ist der vorletzte Array-Wert in Python? * cool * – ryvantage

2

ähnlich @Hugh Bothwellwas following, mit Ihrem nur keine dict (seit Tasten sind schon schön und numerisch), ich habe folgendes zusammengestellt „Motto“:

ordinal=lambda x:["first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth"][x-1] 

, die alle Fälle abdeckt, bis zu 12. Wenn y Du brauchst höhere (in die Hunderte usw.), dann wirst du wahrscheinlich etwas robusteres brauchen (mit Rekursion, die ich mir vorstellen kann, usw.).

0

Eine schöne und einfache Rewrite:

def num_to_ith(num): 
    """1 becomes 1st, 2 becomes 2nd, etc.""" 
    value    = str(num) 
    before_last_digit = value[-2] 
    last_digit  = value[-1] 
    if len(value) > 1 and before_last_digit == '1': return value +'th' 
    if last_digit == '1': return value + 'st' 
    if last_digit == '2': return value + 'nd' 
    if last_digit == '3': return value + 'rd' 
    return value + 'th' 
9

Das Python inflect Paket hat ein Verfahren zur Ziffern in ordinals Umwandlung:

import inflect 
p = inflect.engine() 

for i in range(1,25,5): 
    print(p.ordinal(i)) 

Displays:

1st 
6th 
11th 
16th 
21st 
+1

Haha, super! Dies ** ist ** die richtige Antwort auf die Frage. – Atcold

+0

Wow, was ich gesucht habe !! – answerSeeker

+0

'p.number_to_words (p.ordinal (i))' wird es als 'first',' second', 'third' usw. anzeigen –

0

Mein Code für diese verwendet die Liste, ganzzahliger Modulus, um die erste Ziffer und die ganzzahlige Stockwerkteilung zu finden, um nach aus ru zu suchen 11 le bis 13.em

def stringify(number): 
     suffix = ["th","st","nd","rd","th","th","th","th","th","th"] 
     return str(number) + suffix[number % 10] if str(number // 10)[-1] != 1 else str(number) + "th"   

Die letzte Zeile lesbarer:

if str(number // 10)[-1] != '1':  
     return str(number) + suffix[number % 10] 
    else: 
     return str(number) + "th" 

Grundsätzlich Ich überprüfe die zweite Ziffer für 1 *, die einen möglichen 11. angibt, 12., 13. Regelbrecher.Für die Regelhalter wird die Liste durch den Rest einer Division durch 10 (Modulooperator) referenziert.

Ich habe keine Tests für Code-Effizienz durchgeführt, und die Überprüfung gegen die Länge ist viel besser lesbar, aber das funktioniert.

* (str (Anzahl) [- 2]. Erzeugt einen Indexerror, wenn die Eingabe eine einstellige wird mit Bodenteilung auf ganze Zahlen ergibt immer mindestens 1 Stelle, so dass die Zeichenfolge immer eine -1 Index haben)

Verwandte Themen