Seite 2 von 2

Verfasst: 17.11.2008 18:41
von mback2k
Ja, mein Account wurde versehentlich gelöscht. Nunja, kann man nix machen. Hab schon mit Robert drüber gesprochen, meine alten Posts können mir nicht wieder zugewiesen werden, da die Admins keinen MySQL Zugang haben.

Verfasst: 18.11.2008 20:17
von helpy
Hier mein Versuch:

Code: Alles auswählen

EnableExplicit

Procedure.s Dec2Rom(Dec.i)
	Protected Rom.s = ""
	Protected stepDec.i = 1000
	
	While stepDec
		If Dec >= stepDec
			Select stepDec
				Case 1000 : Rom + "M"
				Case 900  : Rom + "CM"
				Case 500  : Rom + "D"
				Case 400  : Rom + "CD"
				Case 100  : Rom + "C"
				Case 90   : Rom + "XC"
				Case 50   : Rom + "L"
				Case 40   : Rom + "XL"
				Case 10   : Rom + "X"
				Case 9    : Rom + "IX"
				Case 5    : Rom + "V"
				Case 4    : Rom + "IV"
				Case 1    : Rom + "I"
			EndSelect
			Dec - stepDec
		Else
			Select stepDec
				Case 1000 : stepDec = 900
				Case 900  : stepDec = 500
				Case 500  : stepDec = 400
				Case 400  : stepDec = 100
				Case 100  : stepDec =  90
				Case 90   : stepDec =  50
				Case 50   : stepDec =  40
				Case 40   : stepDec =  10
				Case 10   : stepDec =   9
				Case 9    : stepDec =   5
				Case 5    : stepDec =   4
				Case 4    : stepDec =   1
				Case 1    : stepDec =   0
			EndSelect
		EndIf
	Wend
	ProcedureReturn Rom	
EndProcedure

Procedure.i Rom2Dec(Rom.s)
	Protected Dec.i = 0
	Protected cut.i
	Rom = UCase(Rom)
	
	While Rom <> ""
		If     Left(Rom,1) =  "M" : Dec + 1000 : cut = 1
		ElseIf Left(Rom,2) = "CM" : Dec +  900 : cut = 2
		ElseIf Left(Rom,1) =  "D" : Dec +  500 : cut = 1
		ElseIf Left(Rom,2) = "CD" : Dec +  400 : cut = 2
		ElseIf Left(Rom,1) =  "C" : Dec +  100 : cut = 1
		ElseIf Left(Rom,2) = "XC" : Dec +   90 : cut = 2
		ElseIf Left(Rom,1) =  "L" : Dec +   50 : cut = 1
		ElseIf Left(Rom,2) = "XL" : Dec +   40 : cut = 2
		ElseIf Left(Rom,1) =  "X" : Dec +   10 : cut = 1
		ElseIf Left(Rom,2) = "IX" : Dec +    9 : cut = 2
		ElseIf Left(Rom,1) =  "V" : Dec +    5 : cut = 1
		ElseIf Left(Rom,2) = "IV" : Dec +    4 : cut = 2
		ElseIf Left(Rom,1) =  "I" : Dec +    1 : cut = 1
		Else                                     : cut = 1
		EndIf
		Rom = Right(Rom, Len(Rom)-cut)
	Wend
	ProcedureReturn Dec
EndProcedure

Define rom.s
Macro TEST(__number__)
	rom = Dec2Rom(__number__)
	Debug Str(__number__) + "  =>  " + rom + "  =>  " + Str(Rom2Dec(rom))
EndMacro

TEST(1)
TEST(2)
TEST(3)
TEST(4)
TEST(5)
TEST(6)
TEST(9)
TEST(10)
TEST(11)
TEST(14)
TEST(19)
TEST(20)
TEST(1984)
TEST(1780)
TEST(1799)
TEST(1497)
- Das 5000er Zeichen habe ich nicht berücksichtigt!
- Die römische Zahl wird nicht auf Korrektheit überprüft!
- Falsche Zeichen in der römischen Zahl werden ignoriert!

cu, guido

Verfasst: 26.12.2008 18:25
von Andesdaf
Hey, klappt super :D

Verfasst: 02.01.2009 13:34
von GCD_Chris
IIII für 4 muß nicht pauschal falsch sein. IV ist auch eine Abkürzung des römischen Gottes Jupiter. Siehe dazu im Wiki, Kapitel "Besonderheiten".

Verfasst: 02.01.2009 18:15
von Kaeru Gaman
QUID LICET IOVI
NON LICET BOVI

.. da sieht man auch, warum IV die Abkürzung sein kann... xD