Strings und das parsen

Diskutiere Strings und das parsen im Java Basics - Anfänger-Themen Bereich.
W

WaltoN

Hallo liebe Community,

eins vorweg: Ich freue mich hier bei euch sein zu dürfen, da ich diese Website schon länger Besuche wenn gerade in meiner Umschulung einige Probleme auftreten. Gerade bin ich dabei privat ein kleines Programm zu schreiben welches mir ganz Simpel Spritkosten ausrechnen soll. Leider bin ich zu blöd um die Strings vernünftig parsen zu lassen und auch eine Kommazahl zu erkennen... Desweiteren kann ich leider nur eine Zahl (Ziffer) eingeben was blöd ist wenn man zwei- oder dreistelligen wert hat. Ich glaube eh das ich viel zu kompliziert arbeite, vielleicht könnt ihr mir ja behilflich sein. Danke im voraus!

Java:
    private void berechneButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_berechneButtonMouseClicked
        if (evt.getButton() == java.awt.event.MouseEvent.BUTTON1) {
            if (eingabe1() == true) {
                berechne();
            }
//            eingabe1();
//            eingabe2();
//            eingabe3();
//            eingabe4();
//            eingabe5();
        }
    }//GEN-LAST:event_berechneButtonMouseClicked

    public boolean eingabe1() {
        neuKMEingabe.setBackground(Color.WHITE);
        boolean eingabe11 = false;
        String eingabe1 = neuKMEingabe.getText();
        int position = buchstabe(eingabe1);
        if (position == -1) {
            infoLabel.setText("Bitte eine Zahl eingeben!");
            neuKMEingabe.setBackground(Color.RED);
        } else if (position == 0) {
            infoLabel.setText("Bitte eine Zahl eingeben!");
            neuKMEingabe.setBackground(Color.RED);
        } else {
            neuKMEingabe.setBackground(Color.WHITE);
            return eingabe11 = true;
        }
        return eingabe11;
    }

    public static int buchstabe(String eingabe) {
        if (eingabe.equals(" ")) {
            return -1;
        }
        eingabe = eingabe.toUpperCase();
        int position = " 0123456789".indexOf(eingabe);
        return position;
    }

    public void berechne() {
        infoLabel.setText("");
        neuKMEingabe.setBackground(Color.WHITE);
        tankenEingabe.setBackground(Color.WHITE);
        preisEingabe.setBackground(Color.WHITE);
        tageEingabe.setBackground(Color.WHITE);
        altKMEingabe.setBackground(Color.WHITE);
        String kmAlt = altKMEingabe.getText();
        NumberFormat format = NumberFormat.getInstance(Locale.getDefault());
        Number kmAltNumber = null;
        try {
            kmAltNumber = format.parse(kmAlt);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        double kmAltDouble = kmAltNumber.doubleValue();
        String kmNeu = neuKMEingabe.getText();
        Number kmNeuNumber = null;
        try {
            kmNeuNumber = format.parse(kmNeu);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        double kmNeuDouble = kmNeuNumber.doubleValue();
        String getankt = tankenEingabe.getText();
        Number getanktNumber = null;
        try {
            getanktNumber = format.parse(getankt);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        double getanktDouble = getanktNumber.doubleValue();
        String bezahlt = preisEingabe.getText();
        Number bezahltNumber = null;
        try {
            bezahltNumber = format.parse(bezahlt);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        double bezahltDouble = bezahltNumber.doubleValue();
        String tage = tageEingabe.getText();
        Number tageNumber = null;
        try {
            tageNumber = format.parse(tage);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        double tageDouble = tageNumber.doubleValue();
        System.out.println(kmAltDouble+kmNeuDouble+getanktDouble+bezahltDouble+tageDouble);
    }
 
mrBrown

mrBrown

Das Problem ist deine Überprüfung, ob eine korrekte Zahl eingegeben wurde:

Deine Überprüfung ist (abgekürzt) ein "0123456789".contains(eingabe); - deine Eingabe muss also genau so, wie es eingegeben wurde, in "0123456789" vorkommen.

* Alle einzelnen Ziffern klappen natürlich problemlos.
* Kommazahlen sind nicht erlaubt, ein Komma kommt ja in "0123456789" nicht vor
* Längere Zahlen funktionieren manchmal:
** "123" oder "678" wären zB möglich, das kommt ja genauso in "0123456789" vor
** "321" aber nicht, das findet sich ja nicht in "0123456789" wieder
 
W

WaltoN

Danke mrbrown für Deine schnelle Antwort. Also ich verstehe zwar was du meinst, jedoch nicht wie ich das am besten schreiben kann.
 
W

WaltoN

Danke TM69 für Deine Antwort. Du meinst dann ungefähr so wenn ich das jetzt richtig verstanden habe?

Java:
    public boolean eingabe1() {
        neuKMEingabe.setBackground(Color.WHITE);
        String eingabe1 = neuKMEingabe.getText();
        if (Pattern.matches("[1234567890]*", eingabe1)) {
            System.out.println("Klappt 1");;
            altKMEingabe.setBackground(Color.BLUE);
            return abfrage1 = true;
        } else {
            infoLabel.setText("Bitte eine Zahl eingeben!");
            altKMEingabe.setBackground(Color.RED);
            return abfrage1 = false;
        }
    }
 
Zuletzt bearbeitet:
W

WaltoN

Das Problem hierbei ist, das er nun gar nichts mehr macht... Habe alle 5 eingaben entsprechend auf die hier geändert und oben folgende abfrage gestellt:

Java:
    private void berechneButtonMouseClicked(java.awt.event.MouseEvent evt) {
        if (evt.getButton() == java.awt.event.MouseEvent.BUTTON1) {
            if ((abfrage1 == true) && (abfrage2 == true) && (abfrage3 == true) && (abfrage4 == true) && (abfrage5 == true)) {
                berechne();
                System.out.println("Berechne...");
            } else {
                System.out.println("Da geht was nicht");
            }
        }
    }
 
sascha-sphw

sascha-sphw

Testet Zahlen [0-9] sowie [0-9].[0-9] sowie [0-9],[0-9] je nachdem was das Dezimalzeichen ist. Anzahl der Stellen ist nicht begrenzt, muss aber mindestens 1 Digit sein.
Java:
Pattern pattern = Pattern.compile("\\d+((\\.||,)\\d+)?");
Matcher matcher = pattern.matcher(input);
if(matcher.matches()) {
    System.out.println("match");
} else {
    System.out.println("no match");
}
 
mihe7

mihe7

Java:
NumberFormat nf = NumberFormat.getInstance();
try {
    double value = nf.parse(input).doubleValue();
    // alles ok
} catch (ParseException ex) {
    // Fehler beim Parsen von input
}
 
W

WaltoN

Vielen Dank für eure Zahlreichen antworten. irgendwie will jedoch das Pattern bei mir nicht so recht.. Habe es deshalb ein klein wenig anders gelöst. Funktioniert super mit dieser Methode:

Java:
public static boolean isNumeric(String string) {
        return string.matches("^[-+]?\\d+(\\,\\d+)?$");
    }
 
Thema: 

Strings und das parsen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben