Ankündigung

Einklappen
Keine Ankündigung bisher.

Formatieren einer Zahl

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Formatieren einer Zahl

    Moin zusammen,

    entweder bin ich deppert oder ich schlafe schon. Hat jemand eine elegante Idee um aus einem u32 einen String mit Tausenderpunkten zu machen?

    also statt "17345653" lieber "17.345.653"...

    es scheints als das die stringformat Funktion das nicht hergibt...

    Gruß,
    Bernd


    #2
    Hast du denn schon die alternative Formatierung probiert (was auch immer das ist, siehe "man 3 printf")?
    Zu Fuß könnte es so aussehen (ungetestet), oder dann halt als Makro für beliebige Variablen:

    [highlight=epc]
    Zahl_str = $$
    Zahl_len = 0u16
    Zahl = 0u32

    if change( Zahl ) or systemstart() then {
    Zahl_str = convert( Zahl, Zahl_str );
    Zahl_len = size( Zahl_str );
    if Zahl_len > 3u16 then {
    Zahl_str = split( Zahl_str, 0u16, Zahl_len - 4u16 ) + $.$ + split( Zahl_str, Zahl_len - 3u16, Zahl_len - 1u16 )
    } endif;
    if Zahl_len > 6u16 then {
    Zahl_str = split( Zahl_str, 0u16, Zahl_len - 7u16 ) + $.$ + split( Zahl_str, Zahl_len - 6u16, Zahl_len )
    } endif;
    if Zahl_len > 9u16 then {
    Zahl_str = split( Zahl_str, 0u16, Zahl_len - 10u16 ) + $.$ + split( Zahl_str, Zahl_len - 9u16, Zahl_len + 1u16 )
    } endif
    } endif
    [/highlight]

    Ps. Wie üblich würde ich mir leftString( String, length ), midString( String, start, length ) und rightString( String, length ) wünschen!
    BR
    Marc

    Kommentar


      #3
      Zitat von saft6luck Beitrag anzeigen
      Ps. Wie üblich würde ich mir leftString( String, length ), midString( String, start, length ) und rightString( String, length ) wünschen!
      Dito...aber siehe F-000116

      Kommentar


        #4
        Zitat von MarkusL Beitrag anzeigen
        Dito...aber siehe F-000116
        Sieh va. letzter Absatz im pdf .
        Ich weiss, ich habe es erst nach Weihnachten versprochen, ist aber nun schon im Compiler realsiert. Dann wird aber auch nicht mehr gemeckert.
        Die Sache mit den lokalen Variablen in Makros sollte eigentlich erst bei der Veröffentlichung der neuen Version publik werden, so als Schmackerl, aber ihr seid ja immer so ungeduldig...
        Angehängte Dateien
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          Zitat von enertegus Beitrag anzeigen
          Sieh va. letzter Absatz im pdf .
          Das ist ja nett!!

          Kleines Korrekturlesen zum Text:
          "Note, the @-character at the end of the name is mandatory, whereas VARNAME can be an valid variable name (combination of letters and numbers and “_” characters)."
          ->
          "Note: The @-character at the end of the name is mandatory, whereas VARNAME needs to comply to the rules for valid variable names (combination of letters, numbers and “_” characters)."

          Kommentar


            #6
            Zitat von MarkusL Beitrag anzeigen
            Kleines Korrekturlesen zum Text:
            hab ich noch schnell ausgebessert
            offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
            Enertex Produkte kaufen

            Kommentar


              #7
              Und für welche FW / Patchlevel / Eibstudioversion gilt das?
              Gruss Pio

              Kommentar


                #8
                Und kann ich :return auch als vorzeitige Abbruchbedingung nutzen?
                Also so:

                :begin protected_div(x,y)
                :info Function to divide x/y and return and error code if divisor y is 0
                if y==0 then :return 9999999999999f16 endif
                :return x/y
                :end

                Im Handbuch ist übrigens noch ein kleiner Fehler, ein Doppelpunkt vor dem return im Beispiel

                :begin tanh(x)
                :info Calculates the tanh-Funktion
                ::return (exp(x)-exp(-x))/2f32
                :end

                ist zuviel.
                Gruss Pio

                Kommentar


                  #9
                  Zitat von pio Beitrag anzeigen
                  Und für welche FW / Patchlevel / Eibstudioversion gilt das?
                  Das wird nur von der Compilerversion bestiimmt (also nicht FW). Ist im Compiler > 1.900 drinne. Den hat aber noch keiner außer Enertex.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #10
                    Zitat von pio Beitrag anzeigen
                    Und kann ich :return auch als vorzeitige Abbruchbedingung nutzen?
                    Also so:
                    :begin protected_div(x,y)
                    :info Function to divide x/y and return and error code if divisor y is 0
                    if y==0 then :return 9999999999999f16 endif
                    :return x/y
                    :end
                    Nee, so nicht.
                    aber so:
                    [highlight=epc]
                    :begin protected_div(x,y)
                    :info Function to divide x/y and return and error code if divisor y is 0
                    // Eine lokale Variable einführen
                    :var ret@
                    // Deklaration der lokalen Variable
                    ret@=0f16
                    if y==0 then ret@=999999f16 else ret@=x/y endif
                    :return ret@
                    :end
                    [/highlight]
                    wobei aber sowie die Firmware das abfängt und ein event generiert.
                    Aber man könnte auch mit einer globalen Error-Variablen arbeiten. Einen Fehler über das Ergebnis zurückgeben ist m.E nicht optimal.
                    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                    Enertex Produkte kaufen

                    Kommentar


                      #11
                      Das sieht nicht schlecht aus! Weihnachten lohnt sich diese Jahr! Danke Entertex!

                      Auf der einen Seite finde ich es sehr gut (!), dass die Deklaration von Variablen nun ein spezielles Kommando kennt, andererseits verstehe ich die Notwendigkeit hierfür nicht. Der Kompiler könnte den Gültigkeitsbereich problemlos automatisch erkennen. Darf man var dann auch im Code verwenden?

                      Zur Anleitung:
                      • ich glaube mich zu erinnern, dass tanh(x) nicht cosh(x) ist
                      • ist :val (siehe Beispiele hier) ein Tippfehler?
                      • was haben lokale Variablen mit objektorientierter Programmierung zu tun?
                        (ja, ist alt): "Auf diese Weise können Sie nun Variablen ähnlich zu objektorientierten Programmiersprachen „kapseln“.
                        Im Beispiel ist die Variable „Doppelklick“ immer wieder genutzt. Wenn es nicht für jedes Makro eine „eigene“ Doppelklick-Variable gäbe, würde das Programm fehlerhaftes Verhalten generieren."

                        Da ist leider nichts gekapselt und die Intention entspricht wohl eher einer lokalen Variablen wie von Funktionen bekannt. Mit OOP hat das jedenfalls nichts zu tun.


                      Auf jeden Fall macht weiter so! Noch die eine oder andere Syntax-Plage entfernt und man kann sich der Programmierung widmen, statt bei jeder Änderung ständig Strichpunkte umher zu schubsen.
                      BR
                      Marc

                      Kommentar


                        #12
                        Zitat von saft6luck Beitrag anzeigen
                        Auf der einen Seite finde ich es sehr gut (!), dass die Deklaration von Variablen nun ein spezielles Kommando kennt, andererseits verstehe ich die Notwendigkeit hierfür nicht.
                        Der Grund war die Einfachheit - schließlich ist das eine Erweiterung des Macromoduls und das ist etwas anders aufgebaut als etwa der Syntaxparsers.
                        Darf man var dann auch im Code verwenden?
                        Nein.
                        Zur Anleitung:ich glaube mich zu erinnern, dass tanh(x) nicht cosh(x) ist
                        Helles Köpfchen. Werd ich mal ausbessern....
                        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                        Enertex Produkte kaufen

                        Kommentar

                        Lädt...
                        X