Mit Double Werten rechnen

  • Hallo,
    nach längerer Zeit widme ich mich wieder der Java Programmierung.
    Ich habe das Android Studio wiederendeckt und versuche nun eine App zu erstellen, die Werte Multipliziert. Später sollen noch weitere Funktionen folgen.
    Die Berechnung soll bereits bei der Eingabe geschehen. Soweit klappt das auch. Nur bei Berechnungen mit den Dezimalstellen habe ich so meine Problemchen.
    Die Berechnung findet einfach nicht statt. Da ich dadurch abstürze hatte, habe ich mit try und catch den Fehler abgefangen.


    Ich bin mir nicht sicher, ob der Fehler bei der Variablen Befüllung, Berechnung oder Ausgabe auftritt.
    Durch android:digits="0123456789,." bekomme ich eine Dezimalzahl mit Kommer eingegeben. Aber in der Main Activity fehlt scheinbar noch etwas.


    Hier der Code der XML:
    <EditText
    android:id="@+id/zahl1gew"
    android:layout_width="84dp"
    android:layout_height="wrap_content"
    android:digits="0123456789,."
    android:ems="10"
    android:inputType="numberDecimal" />


    <EditText
    android:id="@+id/zahl1kgpreis"
    android:layout_width="80dp"
    android:layout_height="wrap_content"
    android:digits="0123456789,."
    android:ems="10"
    android:inputType="numberDecimal" />...Und hier die Main Activity:final EditText firstNumber;
    final EditText secondNumber;
    final TextView addResult;


    final double[] num1 = new double[1];
    final double[] num2 = new double[1];
    final double[] sum = new double[1];



    firstNumber = (EditText)findViewById(R.id.zahl1gew);
    secondNumber = (EditText)findViewById(R.id.zahl1kgpreis);
    addResult = (TextView)findViewById(R.id.zahl1preis);num1[0] = Double.parseDouble(firstNumber.getText().toString());
    num2[0] = Double.parseDouble(secondNumber.getText().toString());
    sum[0] = num1[0] * num2[0];
    addResult.setText(Double.toString(sum[0]));

  • Hallo irgendwie kann ich deinem Aufbau nicht folgen.


    final double[] num1 = new double[1];
    final double[] num2 = new double[1];
    final double[] sum = new double[1];


    Warum machst du ein Array und nicht einfach eine einfache double variable?


    double num1 = 1.00;


    Auch ist es nicht sinnvoll für das Array den final Typ zu benutzen.


    Wo ist eigentlich dein Problem?

  • also float oder double benutzen einen Punk und kein Komma. Das sind du doch auch deinem Ergebnis. Der edittext ist ja ein String da musst du auch einen Punkt eingeben damit es auch in ein double geparst werden kann.


    Ansonsten musst du vorher den String selber das Komma in den Punkt wandeln. Schaue dir die Datentypen in Java noch mal an.
    Eventuell mit String Operationen. Daten Typen sind immer mit Punkt.



    Zum Thema final würde mich interessieren wie dein Code wirklich aussiehst.
    Warum machst du überhaupt ein Array und nicht einfach eine primitive variable?


    Kann es sein das du mit Java nicht zurecht kommst .
    Also die Grundlagen nicht beherrschst?

  • Also prinzipiel kenn ich schon die Datentypen. Aber mit Strings lässt es sich normalerweise nicht rechnen.
    Eingabe und ausgabe soll unbedingt eine Dezimalzahl mit Komma sein. Am besten noch auf 2 Stellen gerundet aber das ist erst einmal nebensächlich.
    Eigentlich lese ich mit der Funktion ein String aus und konvertiere ihn in eine Double Vara. Ist das richtig?
    Wenn ja, gibt es eventuell eine andere Möglichkeit ein Double Feld auszulesen? Oder gibt es eine Funktion die das umcastet?
    Wenn die Varas hin und her umgewandelt werden, muss die Vara ja auch wieder dementsprechend ausgegeben werden. Das ist dann mit Sicherheit auch wieder eine andere Funktion.


    Ich bin ja wohl nicht der erste der das Problemchen hat.


    Zu meinen Kentnissen habe ich vor Jahren einige Java Grundlagen kennen gelernt. Hauptsächlich habe ich mich dann aber eher mit der Webprogrammierung und Serverkonfiguration beschäftigt.
    Ich finde das Android Studio da schon eine Hilfe, da ich in der Syntax noch nicht so firm bin.
    Hier der Quellcode, ohne Syntaxfehler:

  • Zitat

    Also prinzipiel kenn ich schon die Datentypen. Aber mit Strings lässt es sich normalerweise nicht rechnen.


    Richtig mit Strings kann man nicht Rechnen. Du wills den String in das Flies Komma Format Double bringen das ist richtig. Aber es ist eben so dass ein Flies Komma einen Punkt und nicht und nicht das Deutsche Komma benutzt. Somit wird beim Parsen des Strings in ein Double ein Fehler geworfen.


    Entweder du benutzt bei der Eingabe im EditText den Punkt und nicht das Komma.


    Oder du musst in den String das Komma selber zb. In den Punkt ersetzen bevor du es Parst. Zb. Durch String Operationen. Das hatte ich dir aber schon gesagt.


    Umwandeln des Strings in etwa so



  • Habe dein Code nur mal schnell überflogen und frage mich auch wie jogimuc, warum du Arrays statt normalen Variablen nutzt?


    Wie auch schon von jugimuc gesagt, müssen Double-Wert ein Punkt statt Komma haben.



    Java
    String test1 = "1,5";
    String test2 = "1.5";
    double parseTest1 = Double.parseDouble(test1); // FEHLER !
    double parseTest2 = Double.parseDouble(test2); // 1,5

    Heißt du muss das Komma durch einen Punkt ersetzt, bevor du in ein double parst.
    Und bei der String-Ausgabe kannst du das wieder umdrehen -> Punkt durch Komma ersetzten.
    Um das ganze passend zu ersetzen kannst du auf den String die replace-methode nutzen.

  • Ok ja mit der replace-methode ist es auch möglich den String umzuwandeln.



    Nur finde ich es über die Methode von mir sinnvoller, den damit wird auf im Handy eingestellte Sprache auch eingegangen. Bei US würde die Methode auch den Punkt benutzen.




    num1[0] = double.parseDouble(firstNumber.getText().toString().replace(",","."));
    würde in Deutsch ok sein aber in Us nicht .


    Zitat von Xcreen

    Habe dein Code nur mal schnell überflogen und frage mich auch wie jogimuc, warum du Arrays statt normalen Variablen nutzt?


    Das liegt daran das er, die Variablen in der onCrate erstellt also lokal und diese in dem Textwatcher benutzen will. Da schlägt das AS meistens vor. Ich hätte da wohl globale Variablen im Klassen Rumpf benutzt. In seinem Fall ist das so richtig.
    Da double ein primitiver Datentyp ist und als final es nicht gehen würde. Das konnte ich in seinem ersten Post nicht sehen.



    Zitat von Terzel

    Wenn ich final weglasse bekomme ich eine Fehlermeldung. KA warum aber bei der Verwendung der Vara wird sie rot unterstrichen.


    nach deinem letzten Code ist es klar warum, denn du willst im Textwatcher auf die lokalen Variablen zugreifen. Eine primitive double als final ist leider auch nicht möglich. Deshalb ist es richtig ein final Array zu benutzen. Hattest du aber erst nicht verraten.


    Am einfachsten währe globale Klassen Variablen zu benutzen.
    Aber das ist ja nicht das Problem was du hast sondern das du in dem EditText ( String ) das Komma benutzt und nicht den Punkt

  • Super danke
    .replace(",","."));
    und bei der Ausgabe:
    .replace(".",","));
    funktioniert



    Ich habe dann auch noch auf zwei Stellen mit
    sum[0] = Math.round(sum[0]*100)/100.00; gerundetBisl unschöhn sieht es aus wenn die Zahl nur eine Nachkommastelle hat, aber eigentlich ist es nicht so wichtig und funktioniert.Ich habe mir nun überlegt, wie man weiter macht. Auch die Arrays hatte ich dunkel als recht nützlich in Erinnerung. Ich möchte nähmlich eine Tabelle mit Variablen Zeilen erstellen.Also das was ich bisher gemacht habe, ist nur die erste Zeile.

  • Ich habe locale for Preview auf Deutsch gestellt und habe trotzdem die Ausgabe mit Punkt bekommen, wenn ich nicht das replace nehme.
    addResult.setText(sumstring[0].replace(".",","));Ich dachte das währe mit deiner Funktion nicht nötig.Um eine weitere Stringvara kommt man wohl nicht rum oder? Bzw ich habe wieder ein Array genommen. Das Zahlenformat sieht so genau richtig aus und funktioniert.

  • Hallo


    Ich glaube das du doch noch einige Grundlagen Probleme mit Java hast.


    Das Beispiel soll dir zeigen wie man einen String formatieren kann mit der format Methode.


    Dafür brauchst du kein replace und auch nicht einen neuen String.


    Das von mir war ein Grundlagen Beispiel und nicht die fertige Lösung. Habe dir auch einen Link mitgegeben hoffe du hast ihn auch gelesen.

    Code
    addResult.setText(String.format("%.2f",sum[0]));


    sum[0] ist dein Double Array und kein String



    http://openbook.rheinwerk-verl…sel9/javainsel_04_010.htm

  • Immer wenn ich krank bin, widme ich mich der programmierung :huh:
    Nun weiter im Thread, obwohl es mit dem ursprünglichen Thema wenig zu tun hat.


    Zur Erläuterung was am Ende entstehen soll:
    Es geht um Preiskalkulation.
    Pro Spalte soll folgendes abgebildet werden: Stück, Gewicht, kg Preis, Preis für das Stück, Button für eine Verlinkung an wen es verkauft wird.
    Am Ende eine Spalte mit der Gesamtsumme.


    Die Rows sind Variabel in der Anzahl. Also die Anzahl der Stücke ist nicht vorgegeben und wird mit "Neue Zeile" erweitert
    Die Preise pro Kilo werden sich für den Benutzer eigentlich nicht oder selten ändern. Deswegen währe es schon gut wenn, bei Neustart alles gespeichert wird.
    Außerdem sollte in z.B einer csv Datei die Verkäufe gespeichert werden. Der Button könnte den NAmen aus den Kontakten verknüpfen.


    Soweit bin ich jetzt:
    ich habe mit euer Hilfestellung nun die erste Row im grund funktionsfähig. Mit den Kommerstellen bin ich nun klar gekommen.
    Die Intension, des Array dachte ich, kann man für die Anzahl der Rows benutzen.


    So nun habe ich folgenden Code gefunden um Zeilen zuzufügen:


    Wie bastel ich da nun meinen Code rein.
    Ihrgendwie kann ich die Arrays mit "i" row für row benutzen. Nur mir fehlt das "wie füge ich was ein".
    Die Onclick View Funktion habe ich erstmal ursprünglich gelassen. Ich kann meinen Code aber auch nicht einfach so einfügen, wegen dem "i".

  • Hallo ich glaube du bringst Array und Liste etwas durch einander. Oder dir ist der Unterschied nicht klar.


    In dem gefunden Quellcode wird eine "Liste" oder auch "Array Liste" benutz und nicht ein Array wie bei deinem Code.


    Der haupt unterschied ist das ein Array[] statisch ist also zur Laufzeit des Programms sich die größte nicht ändern kann. Wenn du zb ein
    Array[10] erstellst dann kannst du nicht Felder Laufzeit hinzufügen. Es sind immer 10.


    Eine Liste ist ein dynamischer Speicher Bereich "eine verkettete Liste" die du zu Laufzeit erweitern und auch löschen kannst.


    Schaue die die Unterschiede in Java noch mal an.

  • Ich empfand statische Arrays nie so richtig praktisch und in dem Fall ungeeignet. Nach deiner Aussage benutze ich bereits eine Array Liste, also genau das was ich brauche. Aber bitte korrigiere mich wenn ich mich irre.


    Das erstellen der Rows funktioniert soweit. Nur kann ich keine mehr löschen und ich weiß nicht weshalb. Bastel da schon eine Weile rum.



    Davon abgesehen bin ich auch am überlegen, ob ich mich dem Speicherproblem langsam widme. Also werden beim schließen der App die Zeilen gespeichert? Im Moment nicht, aber später?


    Gruß und Dank

  • hallo


    Zitat

    Ich empfand statische Arrays nie so richtig praktisch und in dem Fall ungeeignet. Nach deiner Aussage benutze ich bereits eine Array Liste

    das was du in deinen ersten postings hast ist keine Liste.
    Der Code in post 13 benutzt eine Liste. Wie du nun deinen Code dort rein gebastelt hast wissen wir nicht.
    Um eine richtige aussage machen zu können zeige deinen jetzigen Code.
    Ohne gibt es keine Hilfe.

  • Kommt sofort.
    Hier die Funktion zum Löschen der Row:

  • der code ist der gleiche ohne eine änderung wie in Post 13.


    was soll ich damit wo ist das Problem?



    Zitat

    Das erstellen der Rows funktioniert soweit. Nur kann ich keine mehr löschen und ich weiß nicht weshalb. Bastel da schon eine Weile rum.

    ja wie sieht den deine liste aus?


    was speicherst du in der liste und wie......?

  • Also Add Row funktioniert soweit. Ich überlege, ob man die Default werte noch ändert. Default ist es Text, wenn ich es eingebe wird es zum double Wert und es rechnet richtig.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!