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