Convert roman number to decimal

2

I'm doing an exercise where I need to convert a typed Roman number, and the program returns a decimal number.

My algorithm:

import java.util.Scanner;

public class NumerosRomanos {

    public static void main (String args []) {

        System.out.println ("Digite um Número em Romanos, para saber qual é esse Número em Decimais");

        Scanner sc = new Scanner (System.in);

        String numeroRomanoInicial = sc.nextLine();

        String numeroRomano = numeroRomanoInicial.toUpperCase();

    System.out.println(verificarNumerosRomanos(numeroRomano));
    }

    public static int verificarNumerosRomanos (String numeroRomano) {
        int digitoRomano = 0;
        int digitoRomanoemconjunto = 0;

        for (int i=0; i<numeroRomano.length(); i++) {
        digitoRomano = numeroRomano.charAt(i);    
            switch (digitoRomano) {
                case 'I': digitoRomano += 1;
            break;
                case 'V': digitoRomano += 5;
            break;
                case 'X': digitoRomano += 10;
            break;
                case 'L': digitoRomano += 50;
            break;
                case 'C': digitoRomano += 100;
            break;
                case 'D': digitoRomano += 500;
            break;
                case 'M': digitoRomano += 1000;
            break;
            default: System.out.println("Dígito Romano Errado.");
            }
        }
            int soma = 0;

            for (int i = 0; i<numeroRomano.length(); i++) {

            char dr = numeroRomano.charAt(i);
            char drSeguinte = numeroRomano.charAt(i+1);

                if (dr == 'I' && drSeguinte == 'V') {
                    digitoRomanoemconjunto += 4;
                } else

                if (dr == 'I' && drSeguinte == 'X') {
                    digitoRomanoemconjunto += 9;
                }
                else

                if (dr == 'X' && drSeguinte == 'L') {
                    digitoRomanoemconjunto += 50;
                } else 

                if (dr == 'X' && drSeguinte == 'C') {
                    digitoRomanoemconjunto += 90;

                } else 

                if (dr == 'C' && drSeguinte == 'D') {
                    digitoRomanoemconjunto += 400;
                } else 

                if (dr == 'C' && drSeguinte == 'M') {
                   digitoRomanoemconjunto += 900;
                }
            }
            soma += digitoRomano + digitoRomanoemconjunto;
            return soma;
    }
}

Generate error of StringIndexOutOfBoundsException .

How to fix this error?

    
asked by anonymous 20.10.2016 / 00:43

1 answer

5

This error is on the line:

char drSeguinte = numeroRomano.charAt(i + 1);

What you can solve with:

char drSeguinte = i < numeroRomano.length() - 1 ? numeroRomano.charAt(i + 1) : ' ';

It has a way to make it more efficient, but I will not trivial to confuse it with new concept.

But the code has logic problems. What you're doing there does not make much sense. The calculation is doing it wrong, but this is another problem that is not the focus of the question.

See the problem solved in ideone .

    
20.10.2016 / 01:05