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
Gliederungszeichen für Zahl in Skript Ausgabe
Moderator: Co-Administratoren
-
- 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
- Raspberry 3B (Charly)
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker
-
- Beiträge: 566
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 28 Mal
- Danksagung erhalten: 130 Mal
Re: Gliederungszeichen für Zahl in Skript Ausgabe
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
Harry
-
- 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
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
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
- 121 Geräten mit insgesamt 493 Kanälen, 1 HmIP-HAP als Repeater
- 2 separate Raspberry mit jeweils Historian und ioBroker
-
- Beiträge: 566
- Registriert: 17.04.2021, 17:12
- System: CCU
- Hat sich bedankt: 28 Mal
- Danksagung erhalten: 130 Mal
Re: Gliederungszeichen für Zahl in Skript Ausgabe
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 :
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
Harry