uRomanNumerals.pas
unit uRomanNumerals;
interface
uses
System.SysUtils;
type
TRomanNumRange = 0..3999;
{ TRomanNum }
TRomanNum = class
private
const
NumArr: array [0..12] of
record n: Integer; c: string end = (
(n: 1; c: 'I'), (n: 4; c: 'IV'),
(n: 5; c: 'V'), (n: 9; c: 'IX'),
(n: 10; c: 'X'), (n: 40; c: 'XL'),
(n: 50; c: 'L'), (n: 90; c: 'XC'),
(n: 100; c: 'C'), (n: 400; c: 'CD'),
(n: 500; c: 'D'), (n: 900; c: 'CM'),
(n: 1000; c: 'M'));
public
class function Roman(x: TRomanNumRange): string;
class function Arabic(s: string): TRomanNumRange;
end;
implementation
{ TRomanNum }
class function TRomanNum.Roman(x: TRomanNumRange): string;
begin
result := '';
var i := High(NumArr);
while x > 0 do
if x >= NumArr[i].n then
begin
result := result + NumArr[i].c;
Dec(x, NumArr[i].n);
end
else
Dec(i);
end;
class function TRomanNum.Arabic(s: string): TRomanNumRange;
begin
result := 0;
var i := High(NumArr);
while s <> '' do
if s.StartsWith(NumArr[i].c, True) then
begin
Inc(result, NumArr[i].n);
s := s.Remove(0, NumArr[i].c.Length);
end
else
begin
Dec(i);
if i < 0 then
raise Exception.Create('Can not convert.');
end;
end;
end.
program RomanTest;
{$APPTYPE CONSOLE}
uses
System.SysUtils, uRomanNumerals;
begin
Writeln(TRomanNum.Roman( 0)); //
Writeln(TRomanNum.Roman( 12)); // XII
Writeln(TRomanNum.Roman( 24)); // XXIV
Writeln(TRomanNum.Roman( 42)); // XLII
Writeln(TRomanNum.Roman( 49)); // XLIX
Writeln(TRomanNum.Roman( 89)); // LXXXIX
Writeln(TRomanNum.Roman( 299)); // CCXCIX
Writeln(TRomanNum.Roman( 493)); // CDXCIII
Writeln(TRomanNum.Roman(1960)); // MCMLX
Writeln(TRomanNum.Roman(3999)); // MMMCMXCIX
Writeln;
Writeln(TRomanNum.Arabic('' )); // 0
Writeln(TRomanNum.Arabic('XII' )); // 12
Writeln(TRomanNum.Arabic('XXIV' )); // 24
Writeln(TRomanNum.Arabic('XLII' )); // 42
Writeln(TRomanNum.Arabic('XLIX' )); // 49
Writeln(TRomanNum.Arabic('LXXXIX' )); // 89
Writeln(TRomanNum.Arabic('CCXCIX' )); // 299
Writeln(TRomanNum.Arabic('CDXCIII' )); // 493
Writeln(TRomanNum.Arabic('MCMLX' )); // 1960
Writeln(TRomanNum.Arabic('MMMCMXCIX')); // 3999
Readln;
end.