Roman to decimal and the other way round

PROBLEM
Convert Roman numerals (MDCCCIX) to their decimal equivalents (1809).

IMPLEMENTATION
Unit: internal function, external function without procedure statement
 
Parameter: the Roman string - a given Roman number
 
Returns: the decimal representation of a given Roman number
 

R2D: procedure
parse upper arg Roman .
RtoD.I = 1; RtoD.V = 5; RtoD.X = 10
RtoD.L = 50; RtoD.C = 100
RtoD.D = 500; RtoD.M = 1000
Decimal = 0; Rdigit = LEFT(Roman, 1)
Ddigit = RtoD.Rdigit
do J = 2 to LENGTH(Roman)
  Rdigit = SUBSTR(Roman, J, 1)
  Next = RtoD.Rdigit
  if Next > Ddigit
    then Decimal = Decimal - Ddigit
    else Decimal = Decimal + Ddigit
  Ddigit = Next
end
return Decimal + Ddigit

 

PROBLEM
Convert a number from decimal to Roman numerals.

IMPLEMENTATION
Unit: internal function, external function without procedure statement
 
Parameter: Decimal, 1<=Decimal<=3999
 
Returns: the Roman representation of a given decimal number
 

D2R: procedure
parse arg Decimal
if (Decimal < 1) | (Decimal > 3999) | ^DATATYPE(Decimal, "W")
  then call ERROR,
    "D2R: Error - integer must be in range 1 - 3999"
parse value RIGHT(FORMAT(Decimal, , 0), 4, 0),
  with A +1 B +1 C +1 D
parse value "1 1 1 1 3 4 4 4 4 7",
  with X.0 X.1 X.2 X.3 X.4 X.5 X.6 X.7 X.8 X.9
parse value "0 1 2 3 2 1 2 3 4 2",
  with Y.0 Y.1 Y.2 Y.3 Y.4 Y.5 Y.6 Y.7 Y.8 Y.9
R = "IIIVIIIXXXLXXXCCCDCCCMMM"
/*            1         2      */
/*   123456789012345678901234  */
return SUBSTR(R, X.A + 21, Y.A) || SUBSTR(R, X.B + 14, Y.B),
    || SUBSTR(R, X.C +  7, Y.C) || SUBSTR(R, X.D, Y.D)
 
ERROR: say ARG(1); exit

 

CO-AUTHOR

Cover Contents Index Main page

last modified 30th July 2001
Copyright 2000-2001 Vladimir Zabrodsky
Czech Republic