Seite 1 von 1

Dezimal- in Lateinzahlen

Verfasst: Dienstag 16. Dezember 2003, 18:18
von HarryH
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

Verfasst: Dienstag 16. Dezember 2003, 18:40
von Milan
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.

Verfasst: Dienstag 16. Dezember 2003, 22:04
von Milan
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.

re:

Verfasst: Donnerstag 18. Dezember 2003, 08:54
von HarryH
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.