Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. [Vorlage] Zifferngruppe und Ersetzen von Dezimaltrennzeichen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Vorlage] Zifferngruppe und Ersetzen von Dezimaltrennzeichen

    This topic has been deleted. Only users with topic management privileges can see it.
    • O
      obakuhl Developer last edited by

      Hallo zusammen,

      im Zuge der Erstellung von PushBenachrichtigungen für die Familie jeden Morgen, um das Infektionsgeschehen des CoronaVirus (Adapter) im Auge zu behalten habe ich mich etwas mit der Behandlung bzw. Änderungen von Zahlenwerten beschäftigt. Da ich viel mit Blockly mache sind meine ersten Versuche auch mit Blockly-Bausteinen selber gewesen. Relativ schnell habe ich gemerkt, dass ich auf keinen grünen Zweig komme und habe mich etwas mit JavaScript beschäftigt. Als ich dann noch entdeckt habe, dass es möglich ist JavaScript Funktionen in Blockly mit Informationen zu füttern habe ich mich an zwei Funktionen zur Datenaufbereitung gewagt, die sich die Familie gewünscht hat.

      1. Punkt als Trennung bei großen Zahlen
        Beispiele: 5960 → 5.960 | 27 → 27 | 2739417 → 2.739.417

      2. Konvertiere Punkt in Komma
        Beispiele: 27.38 → 27,38 | 938.1 → 938,1

      JavaScript Funktionen man mit folgendem Baustein sehr leicht in Blockly integrieren:

      JavaScriptBausteinReturn.png

      Diesen Baustein einfach nach rechts rausziehen und loslassen. Damit ist der Baustein bereit bearbeitet zu werden.

      Zu 1. - Punkt als Trennung bei großen Zahlen:

      Anstatt "etwas tun" schreiben wir zur Beschreibung der Funktion "Punkt bei Tausendern". Danach erstellen wir eine Variable über das Zahnrad, die der JavaScript Funktion übergeben werden kann und benennen diese von "x" auf "DigitGrouping" um.

      CreateVar.png

      Nach einem Klick auf das Zahnrad verschwindet das PopUpMenü wieder. Wir können nun die eigentliche Funktion einfügen. Dazu gehen wir auf die drei Punkte ganz rechts und fügen folgendes dort ein:

      DigitGrouping = '' + DigitGrouping;
      if (DigitGrouping.length > 3) {
          var mod = DigitGrouping.length % 3;
          var output = (mod > 0 ? (DigitGrouping.substring(0,mod)) : '');
          for (i=0 ; i < Math.floor(DigitGrouping.length / 3); i++) {
              if ((mod == 0) && (i == 0))
              output += DigitGrouping.substring(mod+ 3 * i, mod + 3 * i + 3);
              else
              // hier wird das Trennzeichen festgelegt mit '.'
              output+= '.' + DigitGrouping.substring(mod + 3 * i, mod + 3 * i + 3);
              }
          return (output);
          }
      else return DigitGrouping;
      

      Quelle des Codes

      Nach einem Klick auf Speichern ist der Baustein soweit startklar. Neben der neuen Variable "DigitGrouping" wurde auch ein neuer Baustein unter "Funktionen" erstellt:

      neuerBaustein.png

      Jetzt können wir loslegen und das Skript nutzen. Mit Hilfe des neuen Bausteins können wir z.B. über den LogAusgabeBaustein (debug output) unsere unterteilte Zahl ausgeben lassen. Das Ergebnis im log lautet "284.923".

      DigitGrouping.PNG

      So wird das Skript nur einmal beim Speichern (wenn das Skript bereits ausgeführt wird) ausgeführt. Für zyklische Ausführungen ist natürlich ein Trigger notwendig.

      Zu 2. - Konvertiere Punkt in Komma:

      Wir nutzen wieder den gleichen Baustein wie bei 1. Punkt. Anstatt "etwas tun" schreiben wir zur Beschreibung der Funktion diesmal "Konvertiere Punkt zu Komma". Danach erstellen wir eine Variable über das Zahnrad, die der JavaScript Funktion übergeben werden kann und benennen diese von "x" auf "ConvertString" um.

      CreateVar2.png

      Nach einem Klick auf das Zahnrad verschwindet das PopUpMenü wieder. Wir können nun die eigentliche Funktion einfügen. Dazu gehen wir auf die drei Punkte ganz rechts und fügen folgendes dort ein:

      ConvertString = ConvertString.toString().replace('.', ',');
      
      return ConvertString;
      

      Nach einem Klick auf Speichern ist auch dieser Baustein soweit startklar. Neben der neuen Variable "ConvertString" wurde auch ein neuer Baustein unter "Funktionen" erstellt:

      neuerBaustein2.png

      Jetzt können wir auch hier loslegen und das Skript nutzen. Mit Hilfe des neuen Bausteins können wir z.B. über den LogAusgabeBaustein (debug output) unsere "konvertierte" Zahl ausgeben lassen. Das Ergebnis im log lautet "27,84".

      ConvertString.PNG

      Auch hier wird das Skript so nur einmal beim Speichern (wenn das Skript bereits ausgeführt wird) ausgeführt. Für zyklische Ausführungen ist ein Trigger notwendig.

      Das wars 😁 Da ich nie das gefunden habe, was ich suchte habe ich diesen Thread eröffnet, um anderen Suchenden eine Hilfe zu bieten. Alle Variablennamen können individuell angepasst werden, im Skript muss dann analog auch der Variablenname angepasst werden.

      F B Pamf 3 Replies Last reply Reply Quote 6
      • F
        fastfoot @obakuhl last edited by

        @obakuhl mit Node 14.x funktioniert auch Intl.NumberFormat('de-DE').format(12345.67)

        javascript.0 (250) script.js.Aktiv.ScriptJS: 12.345,67
        
        1 Reply Last reply Reply Quote 2
        • B
          bruesche @obakuhl last edited by

          @obakuhl Ich habe dein Skript komplett übernommen, nur ersetze ich Komma durch Semikolon, da ih einen Datenpunkt habe, der mehrere Werte mit Komma separiert. Diese werde benötige ich aber für die Value List mit Semikolon separiert.
          Dein Skript arbeitet einwandfrei, nur wandelt es nur das erste Komma in ein Semikolon um und macht dann nichts mehr. Was muss ich tun, damit dein Skript den kompletten Datenpunkt durchforstet und die Komma durch Semikolons ersetzt?

          Danke für Hilfe!

          A 1 Reply Last reply Reply Quote 0
          • A
            Ahnungsbefreit @bruesche last edited by

            @bruesche Wenn es wirklich nur um das Ersetzen von Komma durch Semikolon geht, kannst Du das einfacher haben:

            59e69978-2ede-45be-9d97-a563f3fb6623-image.png

            Und in der JS Funktion steht eine Zeile Code:

            return stringSource.split(whatToReplace).join(toReplaceWithWhat);
            
            1 Reply Last reply Reply Quote 1
            • Pamf
              Pamf @obakuhl last edited by

              @obakuhl Bei Zahlen mit Nachkommastellen habe ich Probleme. Hier werden die 1000 er Punkte falsch gesetzt, bei gerundeten Zahlen funktioniert es. Gibt es hier noch eine Lösung?

              O 1 Reply Last reply Reply Quote 0
              • O
                obakuhl Developer @Pamf last edited by

                @pamf In der Tat wird das nicht berücksichtigt. Du kannst folgendes Skript statt dem bestehenden probieren:

                DigitGrouping = Intl.NumberFormat('de-DE').format(DigitGrouping);
                
                DigitGrouping = DigitGrouping.toString().replace('.', 'x');
                DigitGrouping = DigitGrouping.toString().replace(',', '.');
                DigitGrouping = DigitGrouping.toString().replace('x', ',');
                
                return DigitGrouping;
                

                Folgendes wird gemacht: Der Variable DigitGrouping wurde eine Zahl zugewiesen. Diese wird in das de-DE Format gebracht. Bei mir führt dies aber noch nicht zum gewünschten Format (obwohl in den ioBrokerEinstellungen "Float Teiler Zeichen" auf Komma steht. So wird z.B. nur mit der ersten Zeile im Skript aus 1234.45 -> 1,234.45. Mit der Funktion 'toString' in den Zeilen 2, 3, 4 werden die ',' und '.' ausgetauscht. So wird aus 1234.45 -> 1.234,45. Falls bei dir jetzt doch mit dem ganzen Skript aus 1234.45 -> 1,234.45 werden sollte dann musst du die drei Zeilen

                DigitGrouping = DigitGrouping.toString().replace('.', 'x');
                DigitGrouping = DigitGrouping.toString().replace(',', '.');
                DigitGrouping = DigitGrouping.toString().replace('x', ',');
                

                löschen 😁

                Pamf 1 Reply Last reply Reply Quote 1
                • Pamf
                  Pamf @obakuhl last edited by

                  @obakuhl Danke vor allem für die Erklärung!

                  Leider klappt es bei mir noch nicht.

                  Zahl: 1234.56 = 1.234,56 (check)
                  Zahl 1234.567 = 1.234,567 (check)
                  Zahl 123456 = 123.456 (check)
                  Zahl 1234567 = 1.234,567 falsch
                  Zahl -1234.56 = -1.234,56 (check)

                  Alle Zahlen ab 7 Stellen werden falsch ausgegeben, sowohl positive als auch negative.

                  Hast Du hierzu noch einen Tipp?

                  1 Reply Last reply Reply Quote 0
                  • Hant0r
                    Hant0r last edited by

                    Vielen lieben Dank, der Artikel hat mir sehr weitergeholfen 🙂

                    Im Endeffekt reichte mir eine Javafunktion mit dem Code:

                    DigitGrouping = Intl.NumberFormat('de-DE').format(DigitGrouping);
                    return DigitGrouping;
                    
                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    739
                    Online

                    31.9k
                    Users

                    80.1k
                    Topics

                    1.3m
                    Posts

                    blockly javascript
                    6
                    8
                    1622
                    Loading More Posts
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes
                    Reply
                    • Reply as topic
                    Log in to reply
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                    The ioBroker Community 2014-2023
                    logo