# 60. Convert a Roman Numeral

# Description

Converts a Roman numeral back into a standard (Arabic) number.

# Code

SET TextVar TO "«TextVar:LIKE THIS»"

SET Temp-n TO LENGTH( TextVar )

SET LoopLimit-n[ Temp-n ] TO 1

0

REPEAT Loop

// Look at the next two characters

SET Char-t TO MID( TextVar, COUNTER, 1 )

IF COUNTER < Temp-n

SET Next-t TO MID( TextVar, COUNTER + 1, 1)

ELSE

SET Next-t TO ""

END IF

// 1s

IF Char-t = "I"

IF Next-t = "V"

OR Next-t = "X"

OR Next-t = "L"

OR Next-t = "C"

OR Next-t = "D"

OR Next-t = "M"

RESULT - 1

ELSE

RESULT + 1

END IF

// 5s

ELSE IF Char-t = "V"

IF Next-t = "X"

OR Next-t = "L"

OR Next-t = "C"

OR Next-t = "D"

OR Next-t = "M"

RESULT - 5

ELSE

RESULT + 5

END IF

// 10s

ELSE IF Char-t = "X"

IF Next-t = "L"

OR Next-t = "C"

OR Next-t = "D"

OR Next-t = "M"

RESULT - 10

ELSE

RESULT + 10

END IF

// 50s

ELSE IF Char-t = "L"

IF Next-t = "C"

OR Next-t = "D"

OR Next-t = "M"

RESULT - 50

ELSE

RESULT + 50

END IF

// 100s

ELSE IF Char-t = "C"

IF Next-t = "D"

OR Next-t = "M"

RESULT - 100

ELSE

RESULT + 100

END IF

// 500s

ELSE IF Char-t = "D"

IF Next-t = "M"

RESULT - 500

ELSE

RESULT + 500

END IF

// 1000s

ELSE IF Char-t = "M"

RESULT + 1000

END IF

SET LoopLimit-n TO UNANSWERED

END REPEAT

SET Temp-n TO UNANSWERED

SET Char-t TO UNANSWERED

SET Next-t TO UNANSWERED

# Explanation

This computation is for the rare occasion when you need to convert a Roman numeral back into a standard numeral (e.g. "MCMXCIX" > 1999). The result is a HotDocs number value.

NOTE: To format a standard numeral as a Roman numeral, just use the "IX" format for the number.

This computation uses a simple loop in the form of a repeated dialog called Loop. A detailed explanation of how the loop works is available in Computation 15: Loops Via REPEAT. The dialog has a single number variable in it called LoopLimit-n. Set this variable's Advanced options to "Ask only in dialog," "Don't warn if unanswered," and "Don't save in answer file." The computation also uses two other temporary text variables, Char-t and Next-t. Set their Advanced options just like you did for LoopLimit-n. These variables store the current characters being analyzed.

The computation uses the Loop to examine each character of the Roman numeral, one at a time. On any given pass, the computation will store the current character in Char-t and the character following it (if any) in Next-t. We do this because we must see two Roman numerals at a time, as you'll see.

The computation then examines the character in Char-t to determine what it is. It must then look at the following character to see if it is higher in order. If so, the current character is reducing the overall value. Otherwise it is increasing it. For example, the character "I" normally increases the overall value by 1 (e.g. VI = 5 + 1, or 6; VIII = 5 + 1 + 1 + 1, or 8). But if a higher-order character follows it, it reduces the overall value by 1 (e.g. IV = -1 + 5, or 4; IX = -1 + 10, or 9).

The computation returns the numeric equivalent of the Roman numeral