Antwort auf: Zahl im Textfeld formatieren

Startseite Foren Deutsches LiveCode-Forum Zahl im Textfeld formatieren Antwort auf: Zahl im Textfeld formatieren

#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