Code archives/Algorithms/Roman Numerals

This code has been declared by its author to be Public Domain code.

Download source code

Roman Numerals by xlsior2009
- Validate whether a Roman Numeral is syntactically correct
- Convert Roman to Int
- Convert Int to Roman
' ROMAN NUMERAL FUNCTIONS
' 
' By Marc van den Dikkenberg / www.xlsior.org
' Created in February 2009
'
'   This code will allow you to:
' - Validate a Roman Numeral (Check a string and state whether or not it contains a valid number)
' - Convert from 'normal' Arabic numbers into Roman
' - Convert from Roman into 'normal' Arabic numbers
'
' Note: Bah.Regex is needed to validate the validity of a Roman Numeral.
' If you do not have the bah.regex module installed, you can remark out the 'ValidateRomanNumeral' call -- the others functions will still work, but won't be able to detect invalid input.
'

Import BaH.RegEx
SuperStrict

Local Test:String="MCMXCIX"  ' MCMXCIX = 1999

If ValidateRomanNumeral(Test)=True Then
	Print test+" is "+RomanToInt(Test)
Else
	Print test+" is not a valid number"
End If

Print "Roman Numeral for 1984 is: "+intToRoman(1984)

Function RomanToInt:Int(Roman:String)
	Local tempvar1:Int=0
	Local Workvar1:Int=0
	roman=Trim(roman.toUpper())
	While Len(roman)>0
		If Left(roman,2)="CM" Then
			workvar1=workvar1+900
			roman=Mid(roman,3)
		ElseIf Left(roman,1)="M" Then
			workvar1=workvar1+1000
			roman=Mid(roman,2)
		ElseIf Left(roman,2)="CD" Then
			workvar1=workvar1+400
			roman=Mid(roman,3)
		ElseIf Left(roman,1)="D" Then
			workvar1=workvar1+500
			roman=Mid(roman,2)
		ElseIf Left(roman,1)="D" Then
			workvar1=workvar1+500
			roman=Mid(roman,2)
		ElseIf Left(roman,1)="C" Then
			workvar1=workvar1+100
			roman=Mid(roman,2)
		ElseIf Left(roman,2)="XC" Then
			workvar1=workvar1+90
			roman=Mid(roman,3)
		ElseIf Left(roman,2)="XL" Then
			workvar1=workvar1+40
			roman=Mid(roman,3)
		ElseIf Left(roman,1)="L" Then
			workvar1=workvar1+50
			roman=Mid(roman,2)
		ElseIf Left(roman,2)="IX" Then
			workvar1=workvar1+9
			roman=Mid(roman,3)
		ElseIf Left(roman,1)="X" Then
			workvar1=workvar1+10
			roman=Mid(roman,2)
		ElseIf Left(roman,2)="IV" Then
			workvar1=workvar1+4
			roman=Mid(roman,3)
		ElseIf Left(roman,1)="V" Then
			workvar1=workvar1+5
			roman=Mid(roman,2)
		ElseIf Left(roman,1)="I" Then
			workvar1=workvar1+1
			roman=Mid(roman,2)
		End If	
	Wend
	Return workvar1		
End Function

Function IntToRoman:String(Number:Int)
	Local tempint1:Int=0
	Local tempstring:String=""
	While number>=1000 
		tempstring=tempstring+"M"
		number=number-1000
	Wend
	If number>=900 Then
		tempstring=tempstring+"CM"
		number=number-900
	End If
	If number>=500 Then
		tempstring=tempstring+"D"
		number=number-500
	End If
	If number>=400 Then
		tempstring=tempstring+"CD"
		number=number-400
	End If
	If number>=300 Then
		tempstring=tempstring+"CCC"
		number=number-300
	End If
	If number>=200 Then
		tempstring=tempstring+"CC"
		number=number-200
	End If	
	If number>=100 Then
		tempstring=tempstring+"C"
		number=number-100
	End If		
	If number>=90 Then
		tempstring=tempstring+"XC"
		number=number-90
	End If		
	If number>=80 Then
		tempstring=tempstring+"LXXX"
		number=number-80
	End If		
	If number>=70 Then
		tempstring=tempstring+"LXX"
		number=number-70
	End If			
	If number>=60 Then
		tempstring=tempstring+"LX"
		number=number-60
	End If			
	If number>=50 Then
		tempstring=tempstring+"L"
		number=number-50
	End If			
	If number>=40 Then
		tempstring=tempstring+"XL"
		number=number-40
	End If			
	If number>=30 Then
		tempstring=tempstring+"XXX"
		number=number-30
	End If			
	If number>=20 Then
		tempstring=tempstring+"XX"
		number=number-20
	End If			
	If number>=15 Then
		tempstring=tempstring+"XV"
		number=number-15
	End If			
	If number>=10 Then
		tempstring=tempstring+"X"
		number=number-10
	End If
	If number>=9 Then
		tempstring=tempstring+"IX"
		number=number-9
	End If	
	If number>=8 Then
		tempstring=tempstring+"VIII"
		number=number-8
	End If	
	If number>=7 Then
		tempstring=tempstring+"VII"
		number=number-7
	End If	
	If number>=6 Then
		tempstring=tempstring+"VI"
		number=number-6
	End If	
	If number>=5 Then
		tempstring=tempstring+"V"
		number=number-5
	End If	
	If number>=4 Then
		tempstring=tempstring+"IV"
		number=number-4
	End If	
	If number>=3 Then
		tempstring=tempstring+"III"
		number=number-3
	End If	
	If number>=2 Then
		tempstring=tempstring+"II"
		number=number-2
	End If	
	If number>=1 Then
		tempstring=tempstring+"I"
		number=number-1
	End If	
	Return tempstring
End Function


Function ValidateRomanNumeral:Int(Roman:String)
	Local RegEx:TRegEx = TRegEx.Create("(([IXCM])\2{10,})|[^IVXLCDM]|([IL][LCDM])|([XD][DM])|(V[VXLCDM])|(IX[VXLC])|(VI[VX])|(XC[LCDM])|(LX[LC])|((CM|DC)[DM])|(I[VX]I)|(X[CL]X)|(C[DM]C)|(I{2,}[VX])|(X{2,}[CL])|(C{2,}[DM])")
	Local match:TRegExMatch = regex.Find(Roman)
	If match Or Trim(Roman)=""
		' Not a valid Roman Numeral
		Return False
	Else
		' Valid Roman Numeral
		Return True
	End If
End Function

Comments

None.

Code Archives Forum