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; }
XLI = (L - X) + I = (50 - 10) + 1 = 41. Hence, the value of Roman Numerals XLI is 41.
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"); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With