• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 683
  • Last Modified:

Roman Numeral to numeric and visa versa


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
Looking_4_Answers
Asked:
Looking_4_Answers
  • 2
1 Solution
 
Mahdi78Commented:
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.

Open in new window

0
 
Looking_4_AnswersAuthor Commented:
That will doit!  Thanks
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now