Taschenrechner: Eingegebene Zahlen in float umwandeln und weiter Rechnen

  • Antworten:5
Hans M.
  • Forum-Beiträge: 32

28.06.2017, 15:57:30 via Website

Hallo ich habe vor ein Taschenrechner zu programmieren. Bis jetzt habe ich geschafft das ich jeden Button drücken kann und mir dann auch der Text ausgegeben wird auch mit Operatoren. Aber ich weiß nicht wie ich die eingegebenen Zahlen in ein float umwandeln kann damit ich mit den weiter rechnen kann.

Bis jetziger Code:

    TextView eingabe;
    TextView ergebnis;
    StringBuilder screenTextMath = new StringBuilder("");
    StringBuilder textMath = new StringBuilder(""); 
    StringBuilder textMathoperator = new StringBuilder("");


@Override
public void onClick(View v) {
    int id = v.getId();

    if (id == R.id.btn0){
        if (screenTextMath.length()<48) {   

            textMath.append("0");
            screenTextMath.append("0");
        }
        eingabe.setText(screenTextMath);
    }
    if (id == R.id.btn1){
        if (screenTextMath.length()<48) {   

            textMath.append("1");
            screenTextMath.append("1");
        }
        eingabe.setText(screenTextMath);
    }
    else if (id == R.id.btn2){
        if (screenTextMath.length()<48) {   

            textMath.append("2");
            screenTextMath.append("2");
        }
        eingabe.setText(screenTextMath);
    }

     else if (id == R.id.btn3){
        if (screenTextMath.length()<48) {

            textMath.append("3");
            screenTextMath.append("3");
        }
        eingabe.setText(screenTextMath);
    }

     else if (id == R.id.btn4){
        if (screenTextMath.length()<48) {   

            textMath.append("4");
            screenTextMath.append("4");
        }
        eingabe.setText(screenTextMath);
    }

     else if (id == R.id.btn5){
        if (screenTextMath.length()<48) {   

            textMath.append("5");
            screenTextMath.append("5");
        }
        eingabe.setText(screenTextMath);
    }

     else if (id == R.id.btn6){
        if (screenTextMath.length()<48) {   

            textMath.append("6");
            screenTextMath.append("6");
        }
        eingabe.setText(screenTextMath);
    }
    else if (id == R.id.btn7){
        if (screenTextMath.length()<48) {   

            textMath.append("7");
            screenTextMath.append("7");
        }
        eingabe.setText(screenTextMath);
    }

    else if (id == R.id.btn8){
        if (screenTextMath.length()<48) {   

            textMath.append("8");
            screenTextMath.append("8");
        }
        eingabe.setText(screenTextMath);
    }

    else if (id == R.id.btn9){
        if (screenTextMath.length()<48) {   

            textMath.append("9");
            screenTextMath.append("9");
        }
        eingabe.setText(screenTextMath);
    }

    else if (id == R.id.btndiv){
        if (screenTextMath.length()<48) {

            textMathoperator.append("/");
            screenTextMath.append("/");
        }
        eingabe.setText(screenTextMath);
    }
    else if (id == R.id.btnmul){
        if (screenTextMath.length()<48) {   
            textMathoperator.append("*");
            screenTextMath.append("*");
        }
        eingabe.setText(screenTextMath);
    }
    else if (id == R.id.btnminis){
        if (screenTextMath.length()<48) {   
            textMathoperator.append("-");
            screenTextMath.append("-");
        }
        eingabe.setText(screenTextMath);
    }
    else if (id == R.id.btnplus){
        if (screenTextMath.length()<48) {   

            textMathoperator.append("+");
            screenTextMath.append("+");
        }
        eingabe.setText(screenTextMath);
    }

    else if (id == R.id.btndot){
        if (screenTextMath.length()<48) {   
            textMathoperator.append(".");
            screenTextMath.append(".");
        }
        eingabe.setText(screenTextMath);
    }

    else if(id == R.id.btnclear){
        textMath = new StringBuilder("");
        screenTextMath = new StringBuilder("");
        eingabe.setText("");
        ergebnis.setText("");

    }

}

Bei fragen einfach fragen. Hoffe ihr könnt mir helfen.
Danke im voraus

— geändert am 28.06.2017, 16:37:09

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2017, 16:01:57 via Website

Hallo Hans,

Herzlich wilkommen hier im Forum :)
Ich habe deinen Thread mal in den Entwickler-Bereich verschoben.


Du willst es eigentlich andersherum oder?

Den StringBuilder in einen String umzuwandeln sollte kein Problem sein:

String fullText = myStringBuilder.toString();

Wie willst du dann allerdings mit dem String weiterrechnen??
Man kann nur mit Integer/double/float/long etc. rechnen, nicht aber mit Strings.

Und wenn du einfach das Ergebnis des Strings haben willst, bracuhst du eine Lib/Logik, welche dir aus dem String die passenden Integers & Operatoren herauszieht und das Ergebnis dann berechnet.

PS: Werden die If-Verzwiegungen nicht irgendwann zu lang? Nutzte besser ein Switch-case damit bleibt es übersichtlicher.
Und deine Prüfung auf 48 Zeichen reicht einmal vor allen ifs, di musst du nicht immer wiederholen.

— geändert am 28.06.2017, 16:02:59

LG Pascal //It's not a bug, it's a feature. :) ;)

Hans M.

Antworten
Hans M.
  • Forum-Beiträge: 32

28.06.2017, 16:36:06 via Website

Genau ich meinte ein String in ein float umwandeln.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2017, 16:44:05 via Website

naja das ist im Grunde recht einfach, solage du nur die Zahl als String hast:

String myNumber = "3.1415";
float myFloat = Float.parseFloat(myNumber);

Sobald dein String aber so aussieht:

String myCalcString = "3.1415*360";

DFann kannst du diese Parse funktion nicht mehr benutzen. Dann musst du die Zahlen einzeln ermitteln und den Operator dazwischen auswerten und dann den ermittelten Operator auf beide Zahlen anwenden.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Hans M.
  • Forum-Beiträge: 32

28.06.2017, 17:17:28 via Website

Dann kannst du diese Parse funktion nicht mehr benutzen. Dann musst du die Zahlen einzeln ermitteln und den Operator dazwischen auswerten und dann den ermittelten Operator auf beide Zahlen anwenden.

Weißt du auch wie das geht?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2017, 17:32:01 via Website

Je nachdem wieviel du selber machen willst, nimst du entweder direkt sowas:
http://mathparser.org/

oder du parst den String selber:

Dafür musst du erst definieren, welche Operatoren dein Taschrnrechner unterstützen soll, dann kannst du mit diesen Operatoren und dem String#split arbeiten. Damit bekommst du immer deine Stringteile zurück, je nachdem welcher Operator gerade dazwischen steht. Bei einer einfachen Rechnung mit 2 Summanden/Faktoren/Quotienten mag das noch einfach sein, aber wenn du dass für n-Operatoren und n-Zahlen machen willst wirds komplex. Außerdem benötigst du dann eine passende Objektstruktur um die Reihenfolge abzuarbeiten. Zudem müssen dann noch Regeln befolgt werden (Punkt vor Strich etc, deswegen die Reohenfolge...)

Also ich stelle mir das garnicht so einfach vor. Vielleicht habe ich auch gerade nicht den passenden Ansatz im Kopf...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hans M.

Antworten