Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting Roman Numerals To Decimal

Tags:

java

I have managed to get my code to convert most Roman numerals to its appropriate decimal value. But it doesn't work for some exceptional cases. Example : XCIX = 99 but my code prints 109.

Here is my code.

public static int romanConvert(String roman) {     int decimal = 0;      String romanNumeral = roman.toUpperCase();     for(int x = 0;x<romanNumeral.length();x++)     {         char convertToDecimal = roman.charAt(x);          switch (convertToDecimal)         {         case 'M':             decimal += 1000;             break;          case 'D':             decimal += 500;             break;          case 'C':             decimal += 100;             break;          case 'L':             decimal += 50;             break;          case 'X':             decimal += 10;             break;          case 'V':             decimal += 5;             break;          case 'I':             decimal += 1;             break;         }     }     if (romanNumeral.contains("IV"))     {         decimal-=2;     }     if (romanNumeral.contains("IX"))     {         decimal-=2;     }     if (romanNumeral.contains("XL"))     {         decimal-=10;     }     if (romanNumeral.contains("XC"))     {         decimal-=10;     }     if (romanNumeral.contains("CD"))     {         decimal-=100;     }     if (romanNumeral.contains("CM"))     {         decimal-=100;     }     return decimal; } 
like image 676
Daniel Cook Avatar asked Jan 31 '12 01:01

Daniel Cook


People also ask

What is Xil in roman numerals?

XLI = (L - X) + I = (50 - 10) + 1 = 41. Hence, the value of Roman Numerals XLI is 41.


1 Answers

It will be good if you traverse in reverse.

public class RomanToDecimal {     public static void romanToDecimal(java.lang.String romanNumber) {         int decimal = 0;         int lastNumber = 0;         String romanNumeral = romanNumber.toUpperCase();         /* operation to be performed on upper cases even if user             enters roman values in lower case chars */         for (int x = romanNumeral.length() - 1; x >= 0 ; x--) {             char convertToDecimal = romanNumeral.charAt(x);              switch (convertToDecimal) {                 case 'M':                     decimal = processDecimal(1000, lastNumber, decimal);                     lastNumber = 1000;                     break;                  case 'D':                     decimal = processDecimal(500, lastNumber, decimal);                     lastNumber = 500;                     break;                  case 'C':                     decimal = processDecimal(100, lastNumber, decimal);                     lastNumber = 100;                     break;                  case 'L':                     decimal = processDecimal(50, lastNumber, decimal);                     lastNumber = 50;                     break;                  case 'X':                     decimal = processDecimal(10, lastNumber, decimal);                     lastNumber = 10;                     break;                  case 'V':                     decimal = processDecimal(5, lastNumber, decimal);                     lastNumber = 5;                     break;                  case 'I':                     decimal = processDecimal(1, lastNumber, decimal);                     lastNumber = 1;                     break;             }         }         System.out.println(decimal);     }      public static int processDecimal(int decimal, int lastNumber, int lastDecimal) {         if (lastNumber > decimal) {             return lastDecimal - decimal;         } else {             return lastDecimal + decimal;         }     }      public static void main(java.lang.String args[]) {         romanToDecimal("XIV");     } } 
like image 180
Ravindra Gullapalli Avatar answered Sep 19 '22 14:09

Ravindra Gullapalli