Dezimalzahlen addieren

Startseite Foren Deutsches LiveCode-Forum Dezimalzahlen addieren

Ansicht von 6 Antwort-Themen
  • Autor
    Beiträge
    • #5719
      Jan
      Teilnehmer

        Moin,
        bin ganz Neuling auf dem Gebiet und würde gerne einen Betrag aus einem Textfeld abrufen und den dann mit einer Dezimalzahl, “Kommazahl” addieren.
        Bislang bekomme ich immer nur folgende Fehlermeldung:
        compilation error at line 4 (Expression: double binary operator) near “=”, char 4

        Der errechnete Wert soll dann im gleichen Textfield wieder eingesetzt werden, damit man damit weiterrechnen kann.

        Später will ich den Wert noch auf eine andere Card in ein Textfield kriegen 🙂

        Vll kann mir ja wer helfen?
        Ist für euch doch sicher Kleinkram

      • #5721
        Klaus Major
        Administrator

          Hallo Ja,

          willkommen im Forum!

          DasProblem ist, daß LC ENGLISCH ist und somit nur den PUNKT als Dezimaltrenner versteht! :-/
          Deutsch: 2,36
          Englisch: 2.36

          Ich habe mir dafür zwei Funktionen geschrieben, die eine rufe ich auf
          1. BEVOR ich mit LC Berechnungen anstelle, die andere
          2. BEVOR ich die Zahlen wieder zur Darstellung in ein Feld packe

          Die Funktionen ersetzen nur den Punkt mit einem Komma bzw. umgekehrt in einer mitgelieferten Zahl.

          Diese zwei Funktionen kopierst du in Dein Stackskript, so können sie von überall benutzt werden!

          # Werte zur richtigen Berechnung als Punktwerte
          # da nur mit Punkt (english) korrekt berechnet wird
          function ohne_komma tZahl
             replace "." with "" in tZahl
             replace "," with "." in tZahl
             return tZahl
          end ohne_komma
          
          function mit_komma tZahl
             replace "." with "," in tZahl
             return tZahl
          end mit_komma

          Und so benutzt Du sie:

          ...
          put fld "menge" into tMenge
          ## 2
          put fld "einzelpreis" into tEP
          ## 2,36
          
          ## Menge* Einzelpreis = Gesamtpreis
          ## Nun zuerst den Preis mit PUNKT versehen
          put ohne_komma(tEP) into tEP
          ## -> 2.36!
          
          ## Nun können wir ohne ERROR rechnen:
          put tMenge * tEP into tGesamtpreis
          
          ## Nun den wieder MIT Komma versehen, weil wir ihn im Feld anzeigen wollen:
          put mit_komma(tGesamtpreis) into fld "Gesamtpreis"
          ...

          Ich hoffe, das kleine Beispiel ist selbsterklärend, sonst bitte nachfragen!

          Liebe Grüße

          Klaus

        • #5725
          Jan
          Teilnehmer

            Vielen Dank Klaus.
            Hat mir sehr geholfen.
            Nun muss ich nur noch den Wert auf ne andere Card übertragen ohne ihn anzeigen zu lassen, damit ich dort weiterrechnen kann.

            Viele Grüße
            Jan

          • #5744
            Jan
            Teilnehmer

              Ich hab noch ein weiteres Problem.
              Das Addieren haben wir ja gelöst, aber er zeigt leider nur eine Stelle hinter dem Komma an. Bei Preisen würde ich gern 2 Stellen hinter dem Komma haben.
              Ausserdem würde ich gern, dass sich das Textfield verfärbt, wenn er einen Preis übersteigt.
              Vll kann man mir nochmal helfen?

            • #5748
              Klaus Major
              Administrator

                Man kann! 🙂

                Du könntest Folgendes der einen Funktion hinzufügen:

                function mit_komma tZahl
                   replace "." with "," in tZahl
                   
                   ## Wir "splitten" die Zahl auf in ITEMS:
                   set itemdelimiter to ","
                   ## Nun schauen, wie viele Nachkommastellen wir schon haben 
                   put item 2 of tZahl into nachdemkomma
                   ## und bei Bedarf mit 0 auffüllen
                   if the number of chars of nachdemkomma = 1 then
                      put "0" after tZahl
                   end if
                   return tZahl
                end mit_komma

                Gruß

                Klaus

              • #5768
                Jan
                Teilnehmer

                  Vielen Dank abermals. Klappt jetzt super! 🙂

                • #5916
                  golive
                  Teilnehmer

                    Ich nutze relativ häufig die “set the numberformat to …”-Funktion. Allerdings arbeitet diese nur mit Dezimalpunkten und keinen Tausenderzeichen.

                    Im angefügten Code-Beispiel gibt es ein Feld “werte”, in welchem Dezimalzahlen mit Punkt oder Komma als Dezimalzeichen in je einer Zeile stehen. Das Ergebnis soll im Feld “summ” mit Komma als Dezimalzeichen erscheinen.

                    Das Problem hier ist, dass Zahlenformat sehr unterschiedlich sein können und man nicht 100%ig wissen kann, welches Zahlenformat gerade verwendet wird. Man könnte die Einstellungen im Computer abfragen oder der Anwender müsste vorgeben, welche Zahlenformat er verwendet. Es sollte diese dann nicht mehr mischen.

                    Schweiz: Dezimalpunkt und Hochkomma als Tausenderzeichen 1’000’000.00
                    Deutschland: Dezimalkomma und Punkt als Tausenderzeichen 1.000.000,00
                    USA: Dezimalpunkt und Komma als Tausenderzeichen 1,000,000.00

                    Das kann zu unerwarteten Ergebnissen und Fehlermeldungen führen, wenn gleichzeitig verschiedene Zahlenformate verwendet werden (müssen). LiveCode selbst verwendet die Zahlenformat, wie sie in der Computersprache C vorgegeben sind, da LiveCode auch auf der Sprache Objective-C beruht.

                    Es käme also jetzt noch eine Funktion hinzu, die Tausenderzeichen einsetzt oder entfernt, je nach verwendetem Zahlenformat und Situation.

                    Probleme entstehen hier häufig auch dann, wenn solche Daten exportiert werden und in einem anderen Land dann die Zahlen nicht mehr funktionieren.

                    on mouseUp
                        local tSumme=0
                        ---
                        set the numberformat to "#.00"
                        /* Das Ausgabeformat der Zahl */
                        ---
                        put "0.00" into field "summe"
                        put calcSum (field "werte" ) into tSumme --> Funktion im gleichen Script
                        put tSumme *  1 into field "summe" 
                           /* eine Multiplikation mit 1 erzeugt das gewünschte Zahlenformat */
                        put replaceText ( tSumme, "\." , comma  ) into tSumme
                           ## Die 'replaceText'-Funktion ist eine Regex-Funktion und 
                           ## verwendet den Punkt in der eigenen Syntax.
                           ## Daher muss der Punkt hier mit dem Backslash-Charakter markiert 
                           ## werden, damit er nicht als Regex-Zeichen '\' verwendet wird. 
                           ## Das ist das sogenante 'Escape'-Zeichen.'*/
                              
                           /* Eine Alternative zu anderen Alternativen:  */
                              --- replace "." with comma in tSumme */
                        
                        put tSumme into field "summe"
                    end mouseUp
                    
                    function calcSum pField
                        ## Die Funktion addiert Zahlen in einer Zahlenliste, 
                        ## die mit einem Punkt oder Komma als Dezimalzeichen verwendet werden.
                        local tSum=0
                        local tLine=""
                        ---
                        put replaceText ( pField, comma , "." ) into pField
                        ---
                        repeat for each line tLine in pField
                            if tLine is a number then
                                add tLine+0 to tSum
                            end if
                        end repeat
                        ---
                        return tSum    
                        /* Das Ergebnis ist eine Zahl mit Dezimalpunkt */
                    end calcSum
                Ansicht von 6 Antwort-Themen
                • Du musst angemeldet sein, um auf dieses Thema antworten zu können.