Dezimal- in Lateinzahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo,
Ich habe mal eine kleine Funktion geschrieben, um lateinische Zahlen in dezimale Zahlen zu konvertieren und umgekehrt.

Ich bitte um Begutachtung und evtl. Fehlerfindung.
Danke!

Code: Alles auswählen

def DecLat(zahl):
    convertzahl=zahl
    if zahl != "" and zahl.isalpha() == 1:
        lat=['CM', 'M', 'CD', 'D', 'XC', 'C', 'XL', 'L', 'IX', 'X', 'IV', 'V', 'I']
        dez=[900, 1000, 400, 500, 90, 100, 40, 50, 9, 10, 4, 5, 1]
        convertzahl=0
        for i,j in zip(lat,dez):convertzahl += zahl.count(i)*j; zahl=zahl.replace(i,"")
        convertzahl = str(convertzahl).zfill(4)
    elif zahl != "" and zahl.isdigit() == 1:
        lat=['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
        dez=[1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        convertzahl=""
        for i in range(100):
            for i,j in zip(lat,dez):
                if int(zahl)-j >= 0:
                    zahl=int(zahl)-j
                    convertzahl += i
                    break
            if zahl == 0:break
        convertzahl = str(convertzahl)
    return convertzahl
Gruß, Harry
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Ich weiß, das ist gemein... aber es wird nicht geprüft, ob so eine Lateinische Zahl gültig ist (z.B. bei Nutzereingaben): "MCMCMCMCD" oder "IVI" sind zum Beispiel ungültig, wenn man streng ist. Aber das ist ja eigentlich Haarspalterei :wink:

Auch meckert er bei mir bei "convertzahl = str(convertzahl).zfill(4)":
Traceback (most recent call last):
File "<pyshell#4>", line 1, in ?
DecLat("MC")
File "<pyshell#1>", line 8, in DecLat
convertzahl = str(convertzahl).zfill(4)
AttributeError: 'str' object has no attribute 'zfill'

Rechnen tut er aber sonst richtig, ich hab die Stelle einfach mal rausgenommen.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hmmm... Python ist heute gut gelaunt :lol: Jetzt gehts :wink: ... Nee, ich glaube zfill ist erst ab Python 2.3 als Methode dabei, stimmts? Wäre vielleicht besser, hier doch aus dem Modul string zu importieren.
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo Milan,

Habe die Funktion noch ein wenig auf deinen Rat verbessert.

Code: Alles auswählen

#Lateinische Zahlen in dezimale Zahlen konvertieren und umgekehrt
import string
def DecLat(zahl):
    convertzahl=zahl
    if zahl != "" and zahl.isalpha() == 1:
        zahl=string.upper(zahl)
        lat=['CM', 'M', 'CD', 'D', 'XC', 'C', 'XL', 'L', 'IX', 'X', 'IV', 'V', 'I']
        dez=[900, 1000, 400, 500, 90, 100, 40, 50, 9, 10, 4, 5, 1]
        convertzahl=0
        for i,j in zip(lat,dez):
            convertzahl += zahl.count(i)*j
            zahl=zahl.replace(i,"")
        if zahl == "" and int(convertzahl) < 5000:
            convertzahl = string.zfill(str(convertzahl),4)
            return convertzahl
        else:return "Berechnung nicht moeglich"
        
    elif zahl != "" and zahl.isdigit() == 1 and int(zahl) < 5000 and int(zahl) > 0:
        lat=['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
        dez=[1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        convertzahl=""
        for i in range(100):
            for i,j in zip(lat,dez):
                if int(zahl)-j >= 0:
                    zahl=int(zahl)-j
                    convertzahl += i
                    break
            if zahl == 0:break
        convertzahl = str(convertzahl)
        return convertzahl
    return "Berechnung nicht moeglich"
Jetzt müsste nur noch die richtige Reihenfolge bei der Eingabe lateinischer Zahlen abgefragt werden. Habt ihr da vielleicht noch eine schnelle Möglichkeit.
Gruß, Harry
Antworten