Gliederungszeichen für Zahl in Skript Ausgabe

Allgemeines zur HomeMatic Haussteuerung

Moderator: Co-Administratoren

Antworten
DidiTheE
Beiträge: 102
Registriert: 19.02.2018, 20:52
Wohnort: Waldshut-Tiengen
Hat sich bedankt: 11 Mal
Danksagung erhalten: 7 Mal

Gliederungszeichen für Zahl in Skript Ausgabe

Beitrag von DidiTheE » 09.04.2024, 20:01

Ein HomeMatic Skript fasst mir jeweils um Mitternacht diverse Systemdaten in einem Bericht zusammen und legt diesen in einem Textfile ab.
Bei der Ausgabe von Tahlen lassen sich die Anzahl von Nachkommastellen dabei einfach über die Funktion ToString() formatieren, z.B.

string Text = Zahl1.ToString(1); ! Zahl mit einer Nachkommastelle

Gibt es auch ein Funktion oder einen Trick, um bei größere Zahlen entsprechend Gliederungszeichen zu bekommen, z.B.

anstatt 1234567.8
soll es 1'234'567.8 sein :?:
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker

Tyfys
Beiträge: 556
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 28 Mal
Danksagung erhalten: 125 Mal

Re: Gliederungszeichen für Zahl in Skript Ausgabe

Beitrag von Tyfys » 09.04.2024, 20:54

Trick DIYS:

Code: Alles auswählen

string Dezimalzeichen =",";
string TsdTrenner    =".";
string zahl ="1234567.8";
string zahl_vk = zahl.StrValueByIndex(".", 0);
string zahl_nk = zahl.StrValueByIndex(".", 1);
string index;
integer von= (zahl.Length()-1)*-1;
integer bis =0;
string res ="";
foreach (index,(system.GenerateEnum(von,bis)).Replace("-","")) {
    if  (( index.ToInteger()% 3) == 0) {res =  TsdTrenner # res ;}
   res =  zahl_vk.Substr(index,1) # res ;
}
string Result = res.Trim(TsdTrenner) #Dezimalzeichen # zahl_nk ;
WriteLine("Zahl ohne Tsd-Trenner : \t"#zahl);
WriteLine("Zahl mit Tsd-Trenner :\t"#Result);
Gruß
Harry

DidiTheE
Beiträge: 102
Registriert: 19.02.2018, 20:52
Wohnort: Waldshut-Tiengen
Hat sich bedankt: 11 Mal
Danksagung erhalten: 7 Mal

Re: Gliederungszeichen für Zahl in Skript Ausgabe

Beitrag von DidiTheE » 10.04.2024, 18:38

Vielen Dank, werde ich mal ausprobieren.

Da ich mehrere Zahlen verarbeiten will und Funktionsaufrufe innerhalb von Skripts (meines wissens) nicht möglich sind, wird die praktische Anwendung aber vermutlich zu unhandlich. Am elegantesten wäre es, wenn es im "ToString()" bereits möglich wäre, z.B. "ToString(%'.2)" (ähnlich wie bei printf).

Alternativ habe ich mir eine Formatierung über einen Linux BASH Befehl via system.Exec überlegt:

$ echo "123456789" | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta'

gibt "123,456,789" zurück.
Hier scheue ich mich hier aber vor der, in meinem Fall, Vielzahl von system.Exec aufrufen.

Noch andere Ideen?

PS: Der Linux Befehl $ printf "%'.f\n" 123456789 geht übrigens auf dem HomeMatic System nicht
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker

Tyfys
Beiträge: 556
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 28 Mal
Danksagung erhalten: 125 Mal

Re: Gliederungszeichen für Zahl in Skript Ausgabe

Beitrag von Tyfys » 10.04.2024, 20:26

Ich weiss ja nicht, woher die Zahlen stammen und wohin die Ergebnisse dann gelangen sollen.

Aber das Ganze könnte man natürlich auch in einer Schleife abarbeiten.
Das sind dann ja nur eine paar Zeilen mehr.
Angenommen Quelle und Ziel sind Systemvariablen :

Code: Alles auswählen

!Tausender-  und Dezimaltrennzeichen festlegen
string Dezimalzeichen =",";
string TsdTrenner    =".";

!Diese SystemVariablen sollen ausgelesen werden
string SysVarsIn ="SysVarInName1;SysVarInName2;SysVarInName3;SysVarInName4";
!und in diese formatiert  ausgegeben werden.
string SysVarsOut ="SysVarOutName1;SysVarOutName2;SysVarOutName3;SysVarOutName4";

integer AnzahlVars = web.webGetValueListCount(SysVarsIn).ToInteger() - 1;
string VarIndex = "";
string SysVarName = "";

foreach(VarIndex, system.GenerateEnum(0, AnzahlVars)) {

    !zu formatierende Variable einlesen
    SysVarName = SysVarsIn.StrValueByIndex(";", VarIndex);
    var VarVal = dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName).Value();
    var zahl = VarVal.ToString(1); !Falls schon String kann ToString() entfallen)
    
    !Formatierung
    string zahl_vk = zahl.StrValueByIndex(".", 0);
    string zahl_nk = zahl.StrValueByIndex(".", 1);
    string index;
    integer von = (zahl.Length() - 1) * -1;
    integer bis = 0;
    string res = "";
    foreach(index, (system.GenerateEnum(von, bis)).Replace("-", "")) {
        if ((index.ToInteger() % 3) == 0) {
            res = TsdTrenner # res;
        }
        res = zahl_vk.Substr(index, 1) # res;
    }
    string Result = res.Trim(TsdTrenner) # Dezimalzeichen # zahl_nk;

    !die formatierte Zahl nun in die Ziel-Variable schreiben.
    SysVarName = SysVarsOut.StrValueByIndex(";", VarIndex);
    dom.GetObject(ID_SYSTEM_VARIABLES).Get(SysVarName).State(Result);
}

Gruß
Harry

Antworten

Zurück zu „HomeMatic allgemein“