Task

Create a function that takes a Roman numeral as its argument and returns its value as a numeric decimal integer.

You don't need to validate the form of the Roman numeral.

Modern Roman numerals are written by expressing each decimal digit of the number to be encoded separately,

starting with the leftmost decimal digit and skipping any 0s   (zeroes).

1990 is rendered as   MCMXC     (1000 = M,   900 = CM,   90 = XC)     and

2008 is rendered as   MMVIII       (2000 = MM,   8 = VIII).

The Roman numeral for 1666,   MDCLXVI,   uses each letter in descending order.




'This code will create a GUI Form and Objects and carry out the Roman Numeral convertion as you type
'The input is case insensitive
'A basic check for invalid charaters is made
 
hTextBox As TextBox                                           'To allow the creation of a TextBox
hValueBox As ValueBox                                         'To allow the creation of a ValueBox
 
Public Sub Form_Open()                                        'Form opens..
 
SetUpForm                                                     'Go to the SetUpForm Routine
hTextBox.text = "MCMXC"                                       'Put a Roman numeral in the TextBox
 
End
 
Public Sub TextBoxInput_Change()                              'Each time the TextBox text changes..
Dim cRomanN As Collection = ["M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1]  'Collection of nemerals e.g 'M' = 1000
Dim cMinus As Collection = ["IV": -2, "IX": -2, "XL": -20, "XC": - 20, "CD": -200, "CM": -200] 'Collection of the 'one less than' numbers e.g. 'IV' = 4
Dim sClean, sTemp As String                                   'Various string variables
Dim siCount As Short                                          'Counter
Dim iTotal As Integer                                         'Stores the total of the calculation
 
hTextBox.Text = UCase(hTextBox.Text)                          'Make any text in the TextBox upper case
 
For siCount = 1 To Len(hTextBox.Text)                         'Loop through each character in the TextBox
  If InStr("MDCLXVI", Mid(hTextBox.Text, siCount, 1)) Then    'If a Roman numeral exists then..
    sClean &= Mid(hTextBox.Text, siCount, 1)                  'Put it in 'sClean' (Stops input of non Roman numerals)
  End If
Next
 
hTextBox.Text = sClean                                        'Put the now clean text in the TextBox
 
For siCount = 1 To Len(hTextBox.Text)                         'Loop through each character in the TextBox
  iTotal += cRomanN[Mid(hTextBox.Text, siCount, 1)]           'Total up all the characters, note 'IX' will = 11 not 9
Next
 
For Each sTemp In cMinus                                      'Loop through each item in the cMinus Collection
  If InStr(sClean, cMinus.Key) > 0 Then iTotal += Val(sTemp)  'If a 'Minus' value is in the string e.g. 'IX' which has been calculated at 11 subtract 2 = 9
Next
 
hValueBox.text = iTotal                                       'Display the total
 
End
 
Public Sub SetUpForm()                                        'Create the Objects for the Form
Dim hLabel1, hLabel2 As Label                                 'For 2 Labels
 
Me.height = 150                                               'Form Height
Me.Width = 300                                                'Form Width
Me.Padding = 20                                               'Form padding (border)
Me.Text = "Roman Numeral converter"                           'Text in Form header
Me.Arrangement = Arrange.Vertical                             'Form arrangement
 
hLabel1 = New Label(Me)                                       'Create a Label
hLabel1.Height = 21                                           'Label Height
hLabel1.expand = True                                         'Expand the Label
hLabel1.Text = "Enter a Roman numeral"                        'Put text in the Label
 
hTextBox = New TextBox(Me) As "TextBoxInput"                  'Set up a TextBox with an Event Label
hTextBox.Height = 21                                          'TextBox height
hTextBox.expand = True                                        'Expand the TextBox
 
hLabel2 = New Label(Me)                                       'Create a Label
hLabel2.Height = 21                                           'Label Height
hLabel2.expand = True                                         'Expand the Label
hLabel2.Text = "The decimal equivelent is: -"                 'Put text in the Label
 
hValueBox = New ValueBox(Me)                                  'Create a ValueBox
hValueBox.Height = 21                                         'ValuBox Height
hValueBox.expand = True                                       'Expand the ValueBox
hValueBox.ReadOnly = True                                     'Set ValueBox to Read Only
 
End