Roman Numeral to Number Conversion

java

Solution

Roman numerals/Decode Example:

class Roman {

    private static int decodeSingle(char letter) {
        switch (letter) {
            case 'M':
                return 1000;
            case 'D':
                return 500;
            case 'C':
                return 100;
            case 'L':
                return 50;
            case 'X':
                return 10;
            case 'V':
                return 5;
            case 'I':
                return 1;
            default:
                return 0;
        }
    }

    public static int decode(String roman) {
        int result = 0;
        String uRoman = roman.toUpperCase(); //case-insensitive
        for (int i = 0; i < uRoman.length() - 1; i++) {//loop over all but the last character
            if (decodeSingle(uRoman.charAt(i)) < decodeSingle(uRoman.charAt(i + 1))) {
                result -= decodeSingle(uRoman.charAt(i));
            } else {
                result += decodeSingle(uRoman.charAt(i));
            }
        }
        result += decodeSingle(uRoman.charAt(uRoman.length() - 1));
        return result;
    }

    public static void main(String[] args) {
        System.out.println(decode("MCMXC")); //1990
        System.out.println(decode("MMVIII")); //2008
        System.out.println(decode("MDCLXVI")); //1666
    }
}

Problem

Trying to write program to read in a string of characters that represent a Roman numeral (from user input) and then convert it to Arabic form (an integer). For instance, I = 1, V = 5, X = 10 etc. Basically, the constructor that takes a parameter of type String must interpret the string (from user input) as a Roman numeral and convert it to the corresponding int value. Is there an easier way to solve this besides the below in progress (which isn't compiling as yet): ``` import java.util.Scanner; public class RomInt { String roman; int val; void assign(String k) { roman=k; } private class Literal { public char literal; public int value; public Literal(char literal, int value) { this.literal = literal; this.value = value; } } private final Literal[] ROMAN_LITERALS = new Literal[] { new Literal('I', 1), new Literal('V', 5), new Literal('X', 10), new Literal('L', 50), new Literal('C', 100), new Literal('D', 500), new Literal('M', 1000) }; public int getVal(String s) { int holdValue=0; for (int j = 0; j < ROMAN_LITERALS.length; j++) { if (s.charAt(0)==ROMAN_LITERALS[j].literal) { holdValue=ROMAN_LITERALS[j].value; break; } //if() }//for() return holdValue; } //getVal() public int count() { int count=0; int countA=0; int countB=0; int lastPosition = 0; for(int i = 0 ; i < roman.length(); i++) { String s1 = roman.substring(i,i+1); int a=getVal(s1); countA+=a; } for(int j=1;j<roman.length();j++) { String s2= roman.substring(j,j+1); String s3= roman.substring(j-1,j); int b=getVal(s2); int c=getVal(s3); if(b>c) { countB+=c; } } count=countA-(2*countB); return count; } void disp() { int result=count(); System.out.println("Integer equivalent of "+roman+" = " +result); } public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.print("Please enter Roman Symbol:"); String s = keyboard.nextLine(); RomInt(); } } ```

Original source

Related problems