December 04, 2020, 11:57:16 AM

Author Topic: [bmx] Roman Numerals by xlsior [ 1+ years ago ]  (Read 528 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Roman Numerals by xlsior [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : Roman Numerals
Author : xlsior
Posted : 1+ years ago

Description : - Validate whether a Roman Numeral is syntactically correct
- Convert Roman to Int
- Convert Int to Roman


Code :
Code: BlitzMax
  1. ' ROMAN NUMERAL FUNCTIONS
  2. '
  3. ' By Marc van den Dikkenberg / www.xlsior.org
  4. ' Created in February 2009
  5. '
  6. '   This code will allow you to:
  7. ' - Validate a Roman Numeral (Check a string and state whether or not it contains a valid number)
  8. ' - Convert from 'normal' Arabic numbers into Roman
  9. ' - Convert from Roman into 'normal' Arabic numbers
  10. '
  11. ' Note: Bah.Regex is needed to validate the validity of a Roman Numeral.
  12. ' 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.
  13. '
  14.  
  15. Import BaH.RegEx
  16. SuperStrict
  17.  
  18. Local Test:String="MCMXCIX"  ' MCMXCIX = 1999
  19.  
  20. If ValidateRomanNumeral(Test)=True Then
  21.         Print test+" is "+RomanToInt(Test)
  22. Else
  23.         Print test+" is not a valid number"
  24. End If
  25.  
  26. Print "Roman Numeral for 1984 is: "+intToRoman(1984)
  27.  
  28. Function RomanToInt:Int(Roman:String)
  29.         Local tempvar1:Int=0
  30.         Local Workvar1:Int=0
  31.         roman=Trim(roman.toUpper())
  32.         While Len(roman)>0
  33.                 If Left(roman,2)="CM" Then
  34.                         workvar1=workvar1+900
  35.                         roman=Mid(roman,3)
  36.                 ElseIf Left(roman,1)="M" Then
  37.                         workvar1=workvar1+1000
  38.                         roman=Mid(roman,2)
  39.                 ElseIf Left(roman,2)="CD" Then
  40.                         workvar1=workvar1+400
  41.                         roman=Mid(roman,3)
  42.                 ElseIf Left(roman,1)="D" Then
  43.                         workvar1=workvar1+500
  44.                         roman=Mid(roman,2)
  45.                 ElseIf Left(roman,1)="D" Then
  46.                         workvar1=workvar1+500
  47.                         roman=Mid(roman,2)
  48.                 ElseIf Left(roman,1)="C" Then
  49.                         workvar1=workvar1+100
  50.                         roman=Mid(roman,2)
  51.                 ElseIf Left(roman,2)="XC" Then
  52.                         workvar1=workvar1+90
  53.                         roman=Mid(roman,3)
  54.                 ElseIf Left(roman,2)="XL" Then
  55.                         workvar1=workvar1+40
  56.                         roman=Mid(roman,3)
  57.                 ElseIf Left(roman,1)="L" Then
  58.                         workvar1=workvar1+50
  59.                         roman=Mid(roman,2)
  60.                 ElseIf Left(roman,2)="IX" Then
  61.                         workvar1=workvar1+9
  62.                         roman=Mid(roman,3)
  63.                 ElseIf Left(roman,1)="X" Then
  64.                         workvar1=workvar1+10
  65.                         roman=Mid(roman,2)
  66.                 ElseIf Left(roman,2)="IV" Then
  67.                         workvar1=workvar1+4
  68.                         roman=Mid(roman,3)
  69.                 ElseIf Left(roman,1)="V" Then
  70.                         workvar1=workvar1+5
  71.                         roman=Mid(roman,2)
  72.                 ElseIf Left(roman,1)="I" Then
  73.                         workvar1=workvar1+1
  74.                         roman=Mid(roman,2)
  75.                 End If 
  76.         Wend
  77.         Return workvar1        
  78. End Function
  79.  
  80. Function IntToRoman:String(Number:Int)
  81.         Local tempint1:Int=0
  82.         Local tempstring:String=""
  83.         While number>=1000
  84.                 tempstring=tempstring+"M"
  85.                 number=number-1000
  86.         Wend
  87.         If number>=900 Then
  88.                 tempstring=tempstring+"CM"
  89.                 number=number-900
  90.         End If
  91.         If number>=500 Then
  92.                 tempstring=tempstring+"D"
  93.                 number=number-500
  94.         End If
  95.         If number>=400 Then
  96.                 tempstring=tempstring+"CD"
  97.                 number=number-400
  98.         End If
  99.         If number>=300 Then
  100.                 tempstring=tempstring+"CCC"
  101.                 number=number-300
  102.         End If
  103.         If number>=200 Then
  104.                 tempstring=tempstring+"CC"
  105.                 number=number-200
  106.         End If 
  107.         If number>=100 Then
  108.                 tempstring=tempstring+"C"
  109.                 number=number-100
  110.         End If         
  111.         If number>=90 Then
  112.                 tempstring=tempstring+"XC"
  113.                 number=number-90
  114.         End If         
  115.         If number>=80 Then
  116.                 tempstring=tempstring+"LXXX"
  117.                 number=number-80
  118.         End If         
  119.         If number>=70 Then
  120.                 tempstring=tempstring+"LXX"
  121.                 number=number-70
  122.         End If                 
  123.         If number>=60 Then
  124.                 tempstring=tempstring+"LX"
  125.                 number=number-60
  126.         End If                 
  127.         If number>=50 Then
  128.                 tempstring=tempstring+"L"
  129.                 number=number-50
  130.         End If                 
  131.         If number>=40 Then
  132.                 tempstring=tempstring+"XL"
  133.                 number=number-40
  134.         End If                 
  135.         If number>=30 Then
  136.                 tempstring=tempstring+"XXX"
  137.                 number=number-30
  138.         End If                 
  139.         If number>=20 Then
  140.                 tempstring=tempstring+"XX"
  141.                 number=number-20
  142.         End If                 
  143.         If number>=15 Then
  144.                 tempstring=tempstring+"XV"
  145.                 number=number-15
  146.         End If                 
  147.         If number>=10 Then
  148.                 tempstring=tempstring+"X"
  149.                 number=number-10
  150.         End If
  151.         If number>=9 Then
  152.                 tempstring=tempstring+"IX"
  153.                 number=number-9
  154.         End If 
  155.         If number>=8 Then
  156.                 tempstring=tempstring+"VIII"
  157.                 number=number-8
  158.         End If 
  159.         If number>=7 Then
  160.                 tempstring=tempstring+"VII"
  161.                 number=number-7
  162.         End If 
  163.         If number>=6 Then
  164.                 tempstring=tempstring+"VI"
  165.                 number=number-6
  166.         End If 
  167.         If number>=5 Then
  168.                 tempstring=tempstring+"V"
  169.                 number=number-5
  170.         End If 
  171.         If number>=4 Then
  172.                 tempstring=tempstring+"IV"
  173.                 number=number-4
  174.         End If 
  175.         If number>=3 Then
  176.                 tempstring=tempstring+"III"
  177.                 number=number-3
  178.         End If 
  179.         If number>=2 Then
  180.                 tempstring=tempstring+"II"
  181.                 number=number-2
  182.         End If 
  183.         If number>=1 Then
  184.                 tempstring=tempstring+"I"
  185.                 number=number-1
  186.         End If 
  187.         Return tempstring
  188. End Function
  189.  
  190.  
  191. Function ValidateRomanNumeral:Int(Roman:String)
  192.         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])")
  193.         Local match:TRegExMatch = regex.Find(Roman)
  194.         If match Or Trim(Roman)=""
  195.                 ' Not a valid Roman Numeral
  196.                 Return False
  197.         Else
  198.                 ' Valid Roman Numeral
  199.                 Return True
  200.         End If
  201. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal