Zahl im Textfeld formatieren

Startseite Foren Deutsches LiveCode-Forum Zahl im Textfeld formatieren

Ansicht von 7 Antwort-Themen
  • Autor
    Beiträge
    • #15079
      Heroturtle
      Teilnehmer

        Ich bin absoluter Newbie und versuche seit Tagen erfolglos folgendes umzusetzen: Ich habe verschiedene Textfelder in verschiedenen Tabs in meiner app, in denen ausschließlich Zahlen eingegeben werden können, die dann zur Berechnung herangezogen werden. Da sich diese Zahlen manchmal zwischen 10 und Trillionen bewegen können, ist es gerade bei langen Zahlen sehr unübersichtlich für den User. Daher hätte ich gern Hunderter-Trennpunkte in den Zahlen, also
        anstatt 1000 –> 1.000 oder
        anstatt 1000000 –> 1.000.000 usw

        – Wie kann ich das bei der Eingabe der Werte bewerkstelligen?
        – An welche Stelle muss ich den code setzen? (in das script jedes einzelnen Feldes oder geht das auch global für alle Textfelder meiner app, die dann eben bei jeder Texteingabe egal welches, wirkt? oder vllt eine globale Funktion [wo werden die definiert dann?], die ich dann bei jedem einzelnen Feld/Gruppe von Feldern aufrufen kann?)
        – Welcher Event ist am besten geeignet, um die Formatierung auszulösen? (im Optimalfall während der Eingabe oder besser nachdem man das Textfeld verlassen hat, wie heißt das Event dann?)

        Ich hoffe, ich konnte mich verständlich ausdrücken. Vielen Dank.

      • #15081
        Klaus Major
        Administrator

          Hallo heldenhafte Schildkröte,

          willkommen im Forum! 🙂

          Die message, die Du suchst, heisst -> on closefield
          Die wird gesendet, wenn der Focus das Feld verlässt UND dessen Inhalt geändert wurde!
          Wenn der Inhalt nicht geändert wurde, kommt die Message -> on exitfield

          Zufällig habe ich vor einiger Zeit mal so eine Funktion erstellt, Achtung genau durchlesen und bei Bedarf nachfragen, die ist nicht ganz trivial, aber logisch. 🙂

          Du könntest dann den Feldern dieses Skript geben:

          on closefield
            put tausender_trenner(me) into me
          end closefield

          Hier die Funktion, die auch noch Nachkommastellen, per Komma getrennt, in Betracht zieht.

          function tausender_trenner tZahl
             ## Das hier liefern wir am Schluss zurück
             put empty into zahlMitTausenderTrenner
             
             ## Hat die Zahl Nachkommastellen?
             ## Dann müssen wir uns die merken, denn wir arbeiten nur mit den ganzen Zahlen VOR dem Komma
             put FALSE into nachkommastellen
             set itemdel to ","
             if the num of items of tZahl = 2 then
                put TRUE into nachkommastellen
                put item 2 of tZahl into dieNachkommastelle
                put item 1 of tZahl into tZahl
             end if
             
             ## Nun ganz so, wie man es mit einem Stück Papier, Stift,
             ## Schere und Uhu machen würde!
             ## Wenn man sich ein Problem mit eigenen Worten erklären kann
             ## kann man das fast 1:1 in LC "übersetzen"!
             repeat 
                
                ## wir fangen hinten mit den letzten drei Ziffern an:
                put char -3 to -1 of tZahl into tTemp
                if the num of chars of tTemp < 3 then
                   put tTemp before zahlMitTausenderTrenner
          
                   ## Nichts mehr zu trennen, daher:
                   exit repeat
                else
                   
                   ## Punkt hier einfügen
                   put "." & tTemp before zahlMitTausenderTrenner
                end if
                
                ## Nun die bereits bearbeiteten Ziffern löschen
                delete char -3 to -1 of tZahl
             end repeat
             
             ## Vielleicht haben wir vorn einen Punkt, den brauchen wir aber nicht
             if char 1 of zahlMitTausenderTrenner = "." then
                delete char 1 of zahlMitTausenderTrenner 
             end if
             
             ## Nachkommastellen? Dann wieder hinten drankleben
             if nachkommastellen then
                put "," & dieNachkommastelle AFTER zahlMitTausenderTrenner
             end if
             return zahlMitTausenderTrenner
          end tausender_trenner

          Aber immer dran denken, LC rechnet auf ENGLISCH, erwartet also einen PUNKT als Nachkommetrenner, falls das für Dich von Belang ist.

          Für solche Gelegenheiten hat der Onkel natürlich auch vorgesorgt 🙂
          Pack das ins Stackskript und rufe es auf bevor Du Berechnungen anstellst.

          function ohne_komma tZahl
             replace "," with "." in tZahl
             return tZahl
          end ohne_komma
          
          function mit_komma tZahl
            replace "." with "," in tZahl
            return tZahl
          end mit_komma

          Wenn Du allerdings ein Feld mit obiger Funktion schon mit Punkt UND Kommata versehen hast, müsstest Du zuerst die Tausenderpunkt löschen -> replace “.” with EMTPY in FeldInhalt
          und dann erst die Kommata ersetzen zur Berechnung. Capisce?

          Beispiel mit schlicher Addition mit Feldern, die schon schön formatiert sind mit Tausendertrenner und allem Zick und Zack:

          on mouseup
            put fld 1 into Summand1
            put fld 2 into Summand2
          
            ## Tausendertrenner entfernen!
            replace "." with EMPTY in Summand1
            replace "." with EMPTY in Summand2
          
            ## Für die Berechnung durch LC vorbereiten = Komma durch Punkt ersetzen
            ## Ich habe die beiden Schritte zusammengefasst:
            put ohne_komma(Summand1) + ohne_komma(Summand2) into tErgebnis
            
            ## Ergebnis der Addition nett formatieren und ins Feld schreiben
            ## Wir sind in Germanien, also zuerst:
            put mit_komma(tErgebnis) into tergebnis
            put tausender_trenner(tErgebnis) into fld "ergebnis"
          end mouseup

          Liebe Grüße

          Klaus

        • #15084
          Heroturtle
          Teilnehmer

            Boa Klaus… vielen Dank, du bist mein Held… da muss ich mich als absoluter Newbie erstmal durchwurschteln, aber werd’s schon verstehen, wenn nicht, melde ich mich ganz bestimmt wieder. Happy Weekend. xo

            Edit: Meine app arbeitet ausschließlich mit Ganzzahlen, das macht es dann sicher schon mal einfacher. 😉

          • #15087
            Klaus Major
            Administrator

              Gern geschehen, ich weiß wie steil die Lernkurve von LC ist!
              Ich habe mir das vor knapp 20 Jahren OHNE Internetzugang (= Hilfe jeglicher Art) beigebracht, nur Try & Error, DAS schult! 😀

            • #15089
              Klaus Major
              Administrator

                Noch ein Hinweis:

                ...
                ## Nachkommastellen? Dann wieder hinten drankleben
                   if nachkommastellen then
                      put "," & dieNachkommastelle AFTER zahlMitTausenderTrenner
                   end if
                ...

                Die Variable nachkommastellen enthält einen Bool’schen Wert, also TRUE oder FALSE.
                Wenn wir den Vergleich weglassen -> if nachkommastellen = TRUE/FALSE
                nimmt LC automatisch an, wir meinen TRUE!
                Dieser “Optimismus” von LC spart uns etwas Tipparbeit. 🙂

              • #15191
                Herby
                Teilnehmer

                  Bin schon wieder beindruckt, was der Klaus alles nebenbei so mal löst.
                  Hut ab
                  Herby

                • #15195
                  Klaus Major
                  Administrator

                    You can leave your hat on! 😀

                  • #15214
                    Klaus Major
                    Administrator
                  Ansicht von 7 Antwort-Themen
                  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.