Solved

Roman Numeral to numeric and visa versa

Posted on 2010-09-06
664 Views

I need a function that takes a string as parameter and does one of two things:

1.) converts it to Roman Numeral if its a numeric

or

2.) converts it to numeric if its Roman a Numeral

Example:   function convertValue(Value: String): String;

Note:  if a user types anything other than 0..9, or  I,V,X,L,C,D,M
0
• 2

LVL 9

Expert Comment

0

LVL 9

Accepted Solution

Mahdi78 earned 500 total points
This what you want, drop 2 TEdit and TButton

``````unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{\$R *.dfm}

function RomanToArabic(const romanNumber : string) : integer ;
const
romanChars = 'IVXLCDMvxlcdm?!#' ;
decades : array [0..8] of integer = (0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000) ;
OneFive : array [boolean] of byte = (1, 5) ;
var
newValue, oldValue : integer ;
cIdx, P : byte ;
begin
result := 0;
oldValue := 0 ;
for cIdx := Length(romanNumber) downto 1 do
begin
P := Succ(Pos(romanNumber[cIdx], romanChars)) ;
newValue := OneFive[Odd(P)] * decades[P div 2] ;
if newValue = 0 then
begin
result := -1;
Exit;
end ;
if newValue < oldValue then newValue := - newValue ;
Inc(result, newValue) ;
oldValue := newValue
end ;
end;

function ArabicToRoman(Decimal: Longint): string;
const
Numbers: array[1..13] of Integer =
(1, 4, 5, 9, 10, 40, 50, 90, 100,
400, 500, 900, 1000);
Romans: array[1..13] of string =
('I', 'IV', 'V', 'IX', 'X', 'XL',
'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
var
i: Integer;
begin
Result := '';
for i := 13 downto 1 do
while (Decimal >= Numbers[i]) do
begin
Decimal := Decimal - Numbers[i];
Result  := Result + Romans[i];
end;
end;

function convertValue(Value: String): String;
function IsStrANumber(const S: string): Boolean;
var
P: PChar;
begin
P      := PChar(S);
Result := False;
while P^ <> #0 do
begin
if not (P^ in ['0'..'9']) then Exit;
Inc(P);
end;
Result := True;
end;
begin
if IsStrANumber(Value) then Result := ArabicToRoman(StrToInt(Value))
else Result := IntToStr(RomanToArabic(Value));

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := convertValue(Edit1.Text);
end;

end.
``````
0

Author Closing Comment

That will doit!  Thanks
0

Featured Post

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…