[Openroad-users] Convert numbers to Roman
gareth.2.edwards at bt.com
gareth.2.edwards at bt.com
Tue Jul 8 20:11:28 EST 2008
Hi Herve,
Here's a procedure i just knocked up for you. You need to parse the RomanNumeral string prior to calling the procedure to check it comprises of correct characters.
PROCEDURE roman2int(RomanNumeral = VARCHAR(10) NOT NULL)=
DECLARE
Symbol = CHAR(1) NOT NULL;
Year = SMALLINT NOT NULL DEFAULT 0;
ENDDECLARE
{
WHILE RomanNumeral != '' DO
Symbol = LEFT(RomanNumeral,1);
IF Symbol = 'I' THEN
Year = Year + 1;
ELSEIF Symbol = 'V' THEN
Year = Year + 5;
ELSEIF Symbol = 'X' THEN
Year = Year + 10;
ELSEIF Symbol = 'L' THEN
Year = Year + 50;
ELSEIF Symbol = 'C' THEN
Year = Year + 100;
ELSEIF Symbol = 'D' THEN
Year = Year + 500;
ELSE // Character = 'M'
Year = Year + 1000;
ENDIF;
RomanNumeral = RIGHT(RomanNumeral,LENGTH(RomanNumeral) - 1);
ENDWHILE;
RETURN Year;
}
Cheers,
Gareth Edwards
BT Global Services
t: +44 (0)131 300 1907
e: Gareth.2.Edwards at BT.com <mailto:gareth.2.edwards at bt.com>
________________________________
From: openroad-users-bounces at peerlessit.com [mailto:openroad-users-bounces at peerlessit.com] On Behalf Of Hervé de Gabai
Sent: Tuesday, July 08, 2008 7:38 AM
To: International OpenROAD Users
Subject: Re: [Openroad-users] Convert numbers to Roman
Good Morning all,
Thank you Bodo for the int2roman procedure which might prove useful.
Do you also have an OpenRoad Procedure to convert roman to integer?
Regards
Hervé de Gabai
Applications Systems Division
International Telecommunications Union
----- Original Message ----
From: Bodo Bergmann <Bodo.Bergmann at ingres.com>
To: International OpenROAD Users <openroad-users at peerlessit.com>
Sent: Wednesday, 2 July, 2008 1:51:15 PM
Subject: Re: [Openroad-users] Convert numbers to Roman
Have you tried something like this (modiefied from some VB example I found - should work for numbers<4000):
PROCEDURE int2roman(iNumber=INTEGER NOT NULL)=
DECLARE
sNumeral=VARCHAR(4) NOT NULL;
ENDDECLARE
{
WHILE (iNumber > 0) DO
IF iNumber >= 1000 THEN
sNumeral = sNumeral + 'M';
iNumber = iNumber - 1000;
ELSEIF iNumber >= 900 THEN
sNumeral = sNumeral + 'CM';
iNumber = iNumber - 900;
ELSEIF iNumber >= 500 THEN
sNumeral = sNumeral + 'D';
iNumber = iNumber - 500;
ELSEIF iNumber >= 400 THEN
sNumeral = sNumeral + 'CD';
iNumber = iNumber - 400;
ELSEIF iNumber >= 100 THEN
sNumeral = sNumeral + 'C';
iNumber = iNumber - 100;
ELSEIF iNumber >= 90 THEN
sNumeral = sNumeral + 'XC';
iNumber = iNumber - 90;
ELSEIF iNumber >= 50 THEN
sNumeral = sNumeral + 'L';
iNumber = iNumber - 50;
ELSEIF iNumber >= 40 THEN
sNumeral = sNumeral + 'XL';
iNumber = iNumber - 40;
ELSEIF iNumber >= 10 THEN
sNumeral = sNumeral + 'X';
iNumber = iNumber - 10;
ELSEIF iNumber = 9 THEN
sNumeral = sNumeral + 'IX';
iNumber = 0;
ELSEIF iNumber >= 5 THEN
sNumeral = sNumeral + 'V';
iNumber = iNumber - 5;
ELSEIF iNumber = 4 THEN
sNumeral = sNumeral + 'IV';
iNumber = 0;
Else
sNumeral = sNumeral + 'I';
iNumber = iNumber - 1;
ENDIF;
ENDWHILE;
RETURN sNumeral;
}
You can of course apply lowercase() to the return value if required.
Bodo.
Bodo Bergmann | Sr. Software Engineer | Bodo.Bergmann at ingres.com <mailto:Bodo.Bergmann at ingres.com> | Ingres Germany GmbH | Ohmstr. 12 | 63225 Langen | GERMANY | +49 6103 9881 0
________________________________
Not happy with your email address?
Get the one you really want <http://uk.docs.yahoo.com/ymail/new.html> - millions of new email addresses available now at Yahoo! <http://uk.docs.yahoo.com/ymail/new.html>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.peerlessit.com/pipermail/openroad-users/attachments/20080708/30213997/attachment.html
More information about the Openroad-users
mailing list