Input/Output zahl aus showInputDialog()

Reggie()

Bekanntes Mitglied
also ich weiss, dass ich mit int eingabe = Integer.parseInt(JOptionPane.showInputDialog("Zahl eingeben: "); eine Zahl bekomme, aber natürlich kann es auch zum Fehler kommen, wenn keine Zahl eingegeben wird. Da dies offensichtlich ein ganz häufiges Problem ist, wundert es mich, dass die Methode nur einen String zurückgibt. Es wäre doch perfekt, wenn nur eine Zahl angenommen werden würde und bei falscher Eingabe bei klick auf OK einfach nichts passieren würde.
ich würde das wie folgt lösen, bin mir aber fast sicher, dass es noch elegantere Lösungen gibt. da ich Anfänger bin und das Problem - wie bereits gesagt - ein häufiges sein dürfte.
Java:
int zahl = 0;
while (true) {
    try {
      zahl = Integer.parseInt(JOptionPane.showInputDialog("Zahl eingeben: "));
      break;
    } catch (Exception e) {
      JOptionPane.showMessageDialog("Eingabe war keine Zahl!");
    }  
}
 
ja, war "aus dem Kopf" geschrieben und habs später dann auch gemerkt. Den Rest würdest du auch so machen oder kennst du eine elegantere Lösung?
 
Da dies offensichtlich ein ganz häufiges Problem ist, wundert es mich, dass die Methode nur einen String zurückgibt. Es wäre doch perfekt, wenn nur eine Zahl angenommen werden würde und bei falscher Eingabe bei klick auf OK einfach nichts passieren würde.
Naja, das ist halt keine Zahlen-eingeben-Dialog, sondern nur Texteingabe 😉

ich würde das wie folgt lösen, bin mir aber fast sicher, dass es noch elegantere Lösungen gibt. da ich Anfänger bin und das Problem - wie bereits gesagt - ein häufiges sein dürfte.
Im Allgemeinen ist das die Lösung 😉

Man könnte die while durch eine do-while mit "besserer" Bedingung ersetzten und statt dem try-catch die Eingabe erst auf Validität prüfen.
 
Mach dir eine regular expression die den von dir gewünschten Wertebereich abdeckt und prüfe das mit myString.matches(...) und ob du dann die Exception immer noch abfangen willst ist deine Gewissensentscheidung
 
Alles gut, so wie es ist. Würde durchs Refactoring kommen.
Nur die mögliche potenzielle Exception könntest du spezifizieren/konkretisieren/einengen.
 
Mach dir eine regular expression die den von dir gewünschten Wertebereich abdeckt und prüfe das mit myString.matches(...) und ob du dann die Exception immer noch abfangen willst ist deine Gewissensentscheidung
kannst du mir dafür ein code-Beispiel geben? ich weiss nicht wirklich was du meinst.
Könnte ich nicht auch die Funktion showInputDialog überschreiben mit anderem Rückgabewert?
public static int showInputDialog(String txt)
und müsste ich dafür von der Klasse JOptionPane erben?
 
Und ein Beispiel wäre :
Code:
 if(myString.matches("^[1-9]?[0-9]{1}$|^100$")) {
// es war eine Zahl von 1 .. 100
}
Die Epression ist aber ungetestet
 
Zuletzt bearbeitet:
Mal ein ganz einfacher Ansatz:
Java:
    public static void main(String[] args) {
        Number n = null;

        while (true) {
            String inp = JOptionPane.showInputDialog(null, "Gib was ein, was als Zahl interpretiert werden könnte:");
            if (inp == null) {
                continue;
            }
            Matcher m1 = Pattern.compile("\\-").matcher(inp);
            int c = 0;
            while (m1.find()) {
                c++;
            }
            Matcher m2 = Pattern.compile("\\d+").matcher(inp);
            String str = "";
            while (m2.find()) {
                str += m2.group();
            }
            if (str.isEmpty()) {
                continue;
            }
            try {
                int i = Integer.parseInt(str);
                if (c % 2 == 1) {
                    i = -i;
                }
                n = i;
            } catch (NumberFormatException e1) {
                try {
                    long l = Long.parseLong(str);
                    if (c % 2 == 1) {
                        l = -l;
                    }
                    n = l;
                } catch (NumberFormatException e2) {
                    BigInteger b = new BigInteger(str);
                    if (c % 2 == 1) {
                        b = b.negate();
                    }
                    n = b;
                }
            }
            break;
        }

        System.out.println("Du hast eingegeben: " + n);
    }
 
bin mir aber fast sicher, dass es noch elegantere Lösungen gibt. da ich Anfänger bin und das Problem - wie bereits gesagt - ein häufiges sein dürfte.
Ich glaube du willst auf so etwas hinaus: Bei einer Webseite, die Bootstrap verwendet, kann man den Typ auf "number" setzen. Wenn der Benutzer auf seiner Tastatur auf einen Buchstabentaste drückt dann passiert einfach nichts. Nur wenn er Ziffern eingibt erscheinen Sie in dem Textfeld. In Chrome funktioniert dies sauber. Auf Firefox scheint es jedoch nicht zu funktionieren.
Code:
<input type="number" class="form-control" id="InputPersonalnummer" name="InputPersonalnummer" maxlength="9" min="1" max="999999999" step="1" placeholder="Geben Sie eine Personalnummer ein" required>

Ich weiß nicht, wie man das in Java macht. Fakt ist: Wenn du ein JTextField verwendest hast du viel mehr Möglichkeiten. Es lässt sich z.B. einem JTextField ein KeyListener hinzufügen. Du kannst dann sogar jedesmal darauf reagieren wenn der Benutzer ein Zeichen eingegeben hat und noch gar nicht auf OK geklickt hat.
 
Ich weiß nicht, wie man das in Java macht.
Man macht das in Java z.B. so:
Code:
    public static void setNumericOnly(JTextField jTextField) {
        jTextField.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                char c = e.getKeyChar();
                if ((!Character.isDigit(c)
                        || (c == KeyEvent.VK_BACK_SPACE)
                        || (c == KeyEvent.VK_DELETE))) {
                    e.consume();
                }
            }
        });
    }
Aber ich könnte schwören dass er was von JOptionPane und showInputDialog geschrieben hat.
 
ich glaube mittlerweile, dass dieses "Problem" doch nicht so alltäglich ist, weil wohl kaum noch einer JOptionPane.showInputDialog() benutzt, sondern alles im Rahmen einer GUI mit actionListenern händelt, richtig?
Ich hatte das "Problem" ja auch nur, weil ich erstmal ein lauffähiges Proogramm schreiben wollte und dafür die einfachste Textform für Input/Output gewählt habe.
 
Ich glaube du willst auf so etwas hinaus: Bei einer Webseite, die Bootstrap verwendet, kann man den Typ auf "number" setzen. Wenn der Benutzer auf seiner Tastatur auf einen Buchstabentaste drückt dann passiert einfach nichts. Nur wenn er Ziffern eingibt erscheinen Sie in dem Textfeld. In Chrome funktioniert dies sauber. Auf Firefox scheint es jedoch nicht zu funktionieren.

Das ist HTML (5), Bootstrap ist nur ein CSS-Framework und hat damit nichts zu tun.
So langsam fangen zum Glück alle Browser an, das zu unterstützen, Firefox ist da nur etwas langsam...
 

Zurück
Oben