Römische Zahlen konvertieren in Dezimalzahlen in JavaFX

Michelangelo

Mitglied
Hallo Ihr lieben. Ich bräuchte mal wieder eure Hilfe. Unzwar hänge ich an einem Problem.
Folgende Aufgabenstellung:

Schreibe ein Programm(SWING oder JavaFX) welches römische zahlen in Dezimalzahlen konvertiert und umgekehrt.

Die Dezimalzahlen in römische zahlen zu konvertieren habe ich hinbekommen, jedoch habe ich das Problem, wenn ich einen String in ein Textfeld einlese
kann ich nicht anhand einer Schleife den Wert der Römischen Zahl ermitteln um ihn zu konvertieren und in einem Textfeld auszugeben.
Über gute Denkanstöße würde ich mich sehr freuen. und sorry, dass ich ein Klassisches Thema erneut geöffnet habe.
in der Mehode umrechnen in Arabisch ist mein Denkfehler.

Vorab bedanke ich mich und wünsche euch allen ein schönes Wochenende.

Java:
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class FXMLController {

@FXML    private Stage meineStage;

@FXML TextField rom;
@FXML TextField arab;



    int[] arabic = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
    String[] roem = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};


@FXML private void umrechenenInRom() {
   
for (int i = 1; i <= Integer.parseInt(arab.getText()); i++){
      String result ="";
      int input = i;
      int counter = arabic.length-1;
     
      while (input > 0){
        if (input >= arabic[counter]){
                result = result + roem[counter];
                input = input - arabic[counter];
                rom.setText(result);
        }
        else{
          counter--;
        }  
    } }
}

@FXML private void umrechnenInArabisch() {
        rom.getText().toString();
        for (int i = 1; i <= Integer.parseInt(rom.getText()); i++){
            String result = "";
            int input = i;
            int counter = roem.length-1;
     
            while (input > 0){
                if (input  >= arabic[counter]){
                    result = result + arabic[counter];
                    input = input - arabic[counter];
                    arab.setText(result);
                    System.out.println("test");
        }
        else{
          counter--;
      }  
      }}

}

Meine Fehlermeldung
Caused by: java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Integer.parseInt(Integer.java:678)
at java.base/java.lang.Integer.parseInt(Integer.java:786)
at romZahlen.FXMLController.umrechenenInRom(FXMLController.java:22)
... 57 more
 

KonradN

Super-Moderator
Mitarbeiter
Der Denkfehler ist offensichtlich und auch durch die Exception gegeben:
Du versuchst den Text der Römischen Zahl als Integer zu parsen. Aber Integer.parseInt hat ein klar umschriebenes Verhalten und dazu gehört nicht das Parsen der Zeichen der Römischen Zahlen.

Beschreibe den Algorithmus doch erst einmal mit Worten. Wie musst Du vorgehen, um eine Römische Zahl zu einer arabischen umzuwandeln?
 

Marinek

Bekanntes Mitglied
Hier sind erhebliche weitere Fehler.

1) Wahrscheinlich hast du irgendwo ein Textfeld:
Java:
rom
und dieser Text soll umgewandelt werden.

Mit der Anweisung:
Code:
Mit der Anweisung: rom.getText().toString();
holst du den String, aber du speicherst ihn in keiner Variablen? Somit wird dieser String verworfen und du arbeitest stattdessen mit den Arrays, die du für die Transformation aufgebracht hast.

2) Du hast eine komische for-Schleife:
Code:
for (int i = 1; i <= Integer.parseInt(rom.getText()); i++){

Sie geht von 1 (ein array fängt bei 0 an) und geht bis zu dem, was im Feld "rom" steht, wenn man das in ein int umwandelt?

Das ist grundlegend falsch, denn ich denke, dass in ROM römlische Zeichen erwartet werden. Du möchtest aber vermutlich jedes Zeichen in rom durchgehen, dann wäre es besser wie folgt zu formulieren:

Code:
for (int i = 0; i < rom.getText().length(); i++){

3) Die Kodierung der römischen Zeichen ist nicht präfix frei. Dein Quellcode geht bei "XL" so wie ich das auf die schnelle interpretiere eher von 60 aus.

Wenn ein kleiner Wert vor einem großen steht, dann wird er abgezogen. Bei dir wird das Array von hinten nach vorne durchlaufen. Dann trifft man zunächst das X. Und dann L. Könte aber auch in dieser kruden Schleife umgangen worden sein, das Problem.

Beachte die Punkte in deiner Lösung.
 

Michelangelo

Mitglied
Hallo liebe Javafreunde,

ich habe das Problem mit einer Switch - Case Abfrage + einer kleinen Mathematischen Formel, lösen können.


Ich bedanke mich für eure Hilfe und die von euch in Anspruch genommene Zeit.

Liebe Grüße
 

Neue Themen


Oben