Ho cercato d'implementare ora un metodo che fa l'operazione opposta, cioè conversione da numero romano ad arabo, va quasi tutto bene inquanto la conversione va a buon fine fino al penultimo carattere il quale non viene letto per una questione d'indici, ottenendo così una conversione non veritiera. Cioè quando verifico la condizione

...

//Conversione
while(i<NrRomano.length()){ //NrRomano contiene il valore da convertire in arabo

if(NrRomano.substring(i,i+1).equals("M")) //migliaia
...

ottengo il seguente errore:

C:\j2sdk1.4.1_01\bin>java TestRomani
Classe di test per la classe Numeri Romani

Numero Arabo: 23
23 = XXIII
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 6
at java.lang.String.substring(String.java:1477)
at Romani.calcolaNumeroArabo(Romani.java:209)
at TestRomani.main(TestRomani.java:30)


però se limito di un carattere la lunghezza della stringa che rappresenta il numero romano non ho una conversione esatta, come riportato nell'esempio sottostante:

C:\j2sdk1.4.1_01\bin>java TestRomani
Classe di test per la classe Numeri Romani

Numero Arabo: 23
23 = XXIII
XXIII = 22
Vuoi Inserire un nuovo Numero? [s/n] s

Numero Arabo: 45
45 = XLV
XLV = 40
Vuoi Inserire un nuovo Numero? [s/n] n

come si vede il non considerare l'ultimo carattere sballa totalmente il risultato.

Per completezza vi riporto il listato del metodo e la classe di test:

/*@return il numero arabo dell’oggetto ricevente*/
public int calcolaNumeroArabo(){
int i=0;

//Conversione
while(i<NrRomano.length()-1){ //ERRORRE: non legge l'ultimo carattere

if(NrRomano.substring(i,i+1).equals("M")) //migliaia
NrArabo+=1000;
else if (NrRomano.substring(i,i+1).equals("C")) //centinaia

if(NrRomano.substring(i,i+2).equals("CD")){ //400
NrArabo+=400;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else if(NrRomano.substring(i,i+2).equals("CM")){ //900
NrArabo+=900;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else
NrArabo+=100;

else if (NrRomano.substring(i,i+1).equals("D"))
NrArabo+=500;
else if (NrRomano.substring(i,i+1).equals("X")) //decine

if(NrRomano.substring(i,i+2).equals("XL")){ //40
NrArabo+=40;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else if(NrRomano.substring(i,i+2).equals("XC")){ //90
NrArabo+=90;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else
NrArabo+=10;

else if (NrRomano.substring(i,i+1).equals("L"))
NrArabo+=50;
else if (NrRomano.substring(i,i+1).equals("I")) //unità

if(NrRomano.substring(i,i+2).equals("IV")){ //4
NrArabo+=4;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else if(NrRomano.substring(i,i+2).equals("IX")){ //9
NrArabo+=9;
i++; //salta un carattere in quanto un numero può essere composto da due cifre
}else
NrArabo+=1;

else if (NrRomano.substring(i,i+1).equals("V"))
NrArabo+=5;

i++; //incrementa posizione successiva
}//while

return NrArabo;
}//calcolaNumeroArabo



Classe si test:

public class TestRomani {
/* classe di test per la classe Studente */
public static void main (String[] args) {

Romani NR; // numero romano
String risposta = "s",tmp; // per leggere le risposte dell’utente
int n;//numero arabo da convertire

/* visualizzazione della finalita’ della classe */
System.out.println("Classe di test per la classe Numeri Romani");
System.out.println();


/* ciclo di test */
while (risposta.equals("s")) {

//conversione da arabo a romano
System.out.print("Numero Arabo: ");
n = Input.readInt();

NR = new Romani(n);
tmp = NR.calcolaNumeroRomano();
if(tmp=="")
System.out.println("Errore nell'inserimento dei dati.");
else
System.out.println(n+" = "+tmp);

//conversione da romano ad arabo
NR = new Romani(tmp);
n = NR.calcolaNumeroArabo();
if(n==-1)
System.out.println("Errore nell'inserimento dei dati.");
else
System.out.println(tmp+" = "+n);

/* nuova interrogazione dell’utente e lettura della sua risposta */
System.out.print("Vuoi Inserire un nuovo Numero? [s/n] ");
risposta = Input.readString();
System.out.println();
}//while
}//main
}//TestRomani

Se siente in gardo di risolvere questo problema x favore aiutatemi!!!