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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      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
      Verwalter

      You can leave your hat on! 😀

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