» Help

# How to convert an integer value to a Roman Numeral representation

Converts an integer value to a string containing a roman numeric code ("XVII"):

```{
Parameters:   Num: Integer to convert.
Return Value: Roman numerical representation of the passed integer value.
History:      12/7/99 "Philippe Ranger"
}
function IntToRoman(num: Cardinal): string;
const
Nvals = 13;
vals: array [1..Nvals] of word =
(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
roms: array [1..Nvals] of string[2] =
('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C',
'CD', 'D', 'CM', 'M');
var
b: 1..Nvals;
begin
result := '';
b := Nvals;
while num > 0 do
begin
while vals[b] > num do
dec(b);
dec (num, vals[b]);
result := result + roms[b]
end;
end;```

A ready made project containing this demo code is available. View the project.

This demo displays the roman numerals up to 3999, which is about as large a number as this routine can cope with. To create the demo start a new Delphi VCL application then:

• Drop a TListBox on the form. Set its TabWidth property to 30.
• Create an OnCreate event handler for the form.
• Name the form "Form1" and save the form unit as `Unit1.pas`.
• Now code Unit1 as follows:
```unit Unit1;

interface

uses
SysUtils, Forms, Classes, Controls, StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{\$R *.dfm}

function IntToRoman(num: Cardinal): string;
const
Nvals = 13;
vals: array [1..Nvals] of word =
(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
roms: array [1..Nvals] of string[2] =
('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C',
'CD', 'D', 'CM', 'M');
var
b: 1..Nvals;
begin
result := '';
b := Nvals;
while num > 0 do
begin
while vals[b] > num do
dec(b);
dec (num, vals[b]);
result := result + roms[b]
end;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
N: Cardinal;
R: string;
begin
for N := 1 to 3999 do
begin
R := IntToRoman(N);