Advertisement
SoWesley

Procedure to convert Roman to Arabic

Jan 16th, 2015
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.12 KB | None | 0 0
  1. CREATE OR ALTER PROCEDURE PRO_ROMANOS_TO_ARABICOS (
  2.     ANUMERAL VARCHAR(100),
  3.     ADEFAULT INTEGER)
  4. RETURNS (
  5.     RESULT INTEGER)
  6. AS
  7.   DECLARE VARIABLE I INTEGER;
  8.   DECLARE VARIABLE C CHAR(1);
  9.   DECLARE VARIABLE N CHAR(1);
  10.   DECLARE VARIABLE VC INTEGER;
  11.   DECLARE VARIABLE VN INTEGER;
  12.   DECLARE VARIABLE TOTAL INTEGER;
  13. BEGIN
  14.   RESULT   = :ADEFAULT;
  15.   I        = 1;
  16.   TOTAL    = 0;
  17.   ANUMERAL = UPPER(:ANUMERAL);
  18.  
  19.   WHILE (I <= CHARACTER_LENGTH(:ANUMERAL)) DO
  20.   BEGIN
  21.     C = SUBSTRING(:ANUMERAL FROM :I FOR 1);
  22.  
  23.     IF (:C NOT IN ('I', 'V', 'X', 'L', 'C', 'D', 'M')) THEN
  24.     BEGIN
  25.       SUSPEND;
  26.       EXIT;
  27.     END
  28.  
  29.     I = I + 1;
  30.   END
  31.  
  32.   I = CHARACTER_LENGTH(:ANUMERAL);
  33.   WHILE (I > 0) DO
  34.   BEGIN
  35.     N  = '';
  36.     C  = SUBSTRING(:ANUMERAL FROM CHARACTER_LENGTH(:ANUMERAL) FOR 1);
  37.     VC = 0;
  38.     VN = 0;
  39.  
  40.     IF (CHARACTER_LENGTH(:ANUMERAL) > 1) THEN
  41.       N = SUBSTRING(:ANUMERAL FROM CHARACTER_LENGTH(:ANUMERAL)-1 FOR 1);
  42.  
  43.     IF (:C = 'I') THEN
  44.       VC = 1;
  45.     ELSE
  46.     IF (:C = 'V') THEN
  47.       VC = 5;
  48.     ELSE
  49.     IF (:C = 'X') THEN
  50.       VC = 10;
  51.     ELSE
  52.     IF (:C = 'L') THEN
  53.       VC = 50;
  54.     ELSE
  55.     IF (:C = 'C') THEN
  56.       VC = 100;
  57.     ELSE
  58.     IF (:C = 'D') THEN
  59.       VC = 500;
  60.     ELSE
  61.     IF (:C = 'M') THEN
  62.       VC = 1000;
  63.  
  64.      IF (:N = 'I') THEN
  65.       VN = 1;
  66.     ELSE
  67.     IF (:N = 'V') THEN
  68.       VN = 5;
  69.     ELSE
  70.     IF (:N = 'X') THEN
  71.       VN = 10;
  72.     ELSE
  73.     IF (:N = 'L') THEN
  74.       VN = 50;
  75.     ELSE
  76.     IF (:N = 'C') THEN
  77.       VN = 100;
  78.     ELSE
  79.     IF (:N = 'D') THEN
  80.       VN = 500;
  81.     ELSE
  82.     IF (:N = 'M') THEN
  83.       VN = 1000;
  84.  
  85.     IF (:VN < :VC) THEN
  86.     BEGIN
  87.       TOTAL = :TOTAL + (:VC - :VN);
  88.  
  89.       IF (:VN = 0) THEN
  90.       BEGIN
  91.         RESULT = :TOTAL;
  92.         SUSPEND;
  93.         EXIT;
  94.       END
  95.  
  96.       ANUMERAL = SUBSTRING(:ANUMERAL FROM 1 FOR CHARACTER_LENGTH(:ANUMERAL)-2);
  97.       I        = I - 2;
  98.     END
  99.     ELSE
  100.     BEGIN
  101.       TOTAL    = :TOTAL + :VC;
  102.       ANUMERAL = SUBSTRING(:ANUMERAL FROM 1 FOR CHARACTER_LENGTH(:ANUMERAL)-1);
  103.       I        = I - 1;
  104.     END
  105.   END
  106.  
  107.   RESULT = :TOTAL;
  108.   SUSPEND;
  109. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement