Kleiner Zahlenkonverter

Code-Stücke können hier veröffentlicht werden.
Antworten
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Hallo,

Ich bin noch nicht lange bei Python dabei und habe jetzt mal versucht, einen Konverter zu schreiben, der japanische Zahlen in einen Integer verwandelt. Allerdings denke ich, dass ich das vielleicht nicht gerade sonderlich toll angegangen bin.

Da der ganze Hintergrund vielleicht ohne Japanischkenntnisse zu schwierig ist, hier kurz eine Referenz bei Wikipedia: http://de.wikipedia.org/wiki/Japanische ... zte_Zahlen (Ist nicht schwierig zu verstehen).

Das Programm braucht Python 3, da die ganzen Zahlen Unicode benötigen. Deswegen in einer Datei dann bitte UTF-8-kodiert abspeichern :)

Code: Alles auswählen

def cjk_to_int(cjknumber):
    """Konvertiert CJK-Nummern in Integer

    Konvertiert chinesische, japanische und koreanischen Zahlen in Integer.
    Bis 10^20.

    """

    numbers = {
            "零": 0,  #Normale Nummern
            "〇": 0, 
            "一": 1,
            "二": 2, 
            "兩": 2, 
            "两": 2, 
            "両": 2, 
            "三": 3, 
            "四": 4, 
            "五": 5, 
            "六": 6, 
            "七": 7, 
            "八": 8, 
            "九": 9, 
            "壹": 1,  #Finanznummern
            "壱": 1,
            "貳": 2, 
            "贰": 2, 
            "弐": 2, 
            "參": 3, 
            "叁": 3, 
            "参": 3, 
            "肆": 4, 
            "伍": 5, 
            "陸": 6, 
            "陆": 6, 
            "柒": 7, 
            "捌": 8, 
            "玖": 9, 
            "0": 0, #Vollbreite Nummern
            "1": 1,
            "2": 2, 
            "3": 3, 
            "4": 4, 
            "5": 5, 
            "6": 6, 
            "7": 7, 
            "8": 8, 
            "9": 9, 
            "十": 10,  #Große Nummern
            "拾": 10, 
            "廿": 20, 
            "念": 20, 
            "卅": 30, 
            "百": 100, 
            "佰": 100, 
            "千": 1000, 
            "仟": 1000, 
            "萬": 10000, 
            "万": 10000, 
            "億": 100000000, 
            "亿": 100000000, 
            "兆": 1000000000000, 
            "京": 10000000000000000, 
            "垓": 100000000000000000000, 
            "영": 0,  #Koreanisch
            "령": 0, 
            "공": 0, 
            "일": 1, 
            "이": 2, 
            "삼": 3, 
            "사": 4, 
            "오": 5, 
            "육": 6, 
            "륙": 6, 
            "칠": 7, 
            "팔": 8, 
            "구": 9, 
            "십": 10, 
            "백": 100, 
            "천": 1000, 
            "만": 10000, 
            "억": 100000000, 
            "조": 1000000000000, 
            "경": 10000000000000000, 
            "해": 100000000000000000000
            }
            
    
    #Konvertiert cjknumber in einen String, falls es keiner ist
    cjknumber = str(cjknumber)
    
    #Wandelt jede Nummer um und tut sie in eine neue Liste
    number_array = []
    for i in cjknumber:
        if i in numbers:
            number_array.append(numbers[i])
        else:
            number_array.append(int(i))
    
   
    #Wenn es mehrere zweistellige Nummern gibt, die aufeinanderfolgen
	#(z.B. [1,2,3,1000,1,2,3]), diese zusammenfügen in [123,1000,123]
    zwischenrechnung = ""
    number_array_2 = []
    for position, number in enumerate(number_array):
        if number < 10:
            zwischenrechnung = zwischenrechnung + str(number)
			#Wenn es das letzte Element in einem Block ist oder das letzte Elemente in der Liste:
			#Speicher den Block in einer neuen Liste
            if position == len(number_array)-1 or number_array[position+1] >= 10:
                number_array_2.append(int(zwischenrechnung))
                zwischenrechnung = ""
        if number >= 10:
            number_array_2.append(number)
    
    #Wieder in die ursprüngliche Liste zurückkopieren
    number_array = None
    number_array = number_array_2
    
    #Zehner, Hunderter und Tausender berechnen (können mehrmals auftreten).
    for digit in (10,  100,  1000):
        for position,  number in enumerate(number_array):
            if number == digit:
                #Mit Nummer davor multiplizieren, z.B. 5*10=50
                if position != 0:
                    if number_array[position-1] < number:
                        number_array[position] = digit * number_array[position-1]
                        del number_array[position-1]
                        position -= 1
                #Nummer dahinter addieren, z.B. 50+1=51
                if position != len(number_array)-1:
                    if number_array[position+1] < number_array[position]:
                        number_array[position] = number_array[position] + number_array[position+1]
                        del number_array[position+1]
            
    #Größere Nummern >=10000 berechnen (Können nur einmal auftreten)
    if len(number_array) > 1:
        for position,  number in enumerate(number_array):
            if number >= 10000:
                number_array[position-1] = number_array[position-1] * number
                del number_array[position]
    
    
    #Alles aufaddieren
    final = 0
    for i in number_array:
        final += i
    
    return final


Zum Ausführen, hier einige Beispielzahlen:

Code: Alles auswählen

print(cjk_to_int('一二三四')) #1234
print(cjk_to_int('一万二千三百四十一')) #12341
print(cjk_to_int('四十五兆二千百億四百五十一万二千百二十三')) #45210004512123
print(cjk_to_int('2億23万')) #200230000

Mich wundert vor allem, ob es etwas eleganteres als mein dauerndes Löschen von Elementen in der Liste gibt.

Danke schön :) Und Entschuldigung für das komplizierte Thema :D
Antworten