Code archives/Algorithms/Roman Numerals
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
- 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