Vorkommastellen kürzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Burny4600
User
Beiträge: 2
Registriert: Mittwoch 15. Januar 2025, 18:18

Ich habe leider keine Lösung gefunden wie ich Vorkommastellen kürzen kann.
Nachkommestellen mit %.4f ZB ist kein Thema.

Ich habe eine Hex Zahl die ich in Dezimal umwandle und ergibt die Dezimalzahl 00030000.
Diese Zahl muss ich auf 0003 reduzieren. Auch eine Änderung auf 30000 ist keine Thema, hilft mir aber im konkretem Fall nicht.
Und diese Zahl 0003 wird dann mit %s in Import_kWh umgewandelt.
Ich benötige dies zur Modbus Registerauswertung.

Chris
LG
Chris
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Wenn du aus 30000 3 machen möchteste, teil das doch durch 10000?
nezzcarth
User
Beiträge: 1749
Registriert: Samstag 16. April 2011, 12:47

Integer mit führenden Nullen sind in Python als Literale syntaktisch nicht zulässig. Insofern kannst du diese Ziffernfolge überhaupt nur als String haben. Und hier kannst du dann mit den üblichen Stringoperationen arbeiten. Oder du konvertierst es halt in einen Integer und dividierst; das ist, was ich vmtl. machen würde. Die spätere Darstellung als String mit führenden Nullen ist davon ja unbenommen.

Z.B.

Code: Alles auswählen

>>> f"{int('00030000')//10000:0>4}"
'0003'
…
>>> '00030000'.rstrip('0')
'0003'

Wenn du es flexibler brauchst, musst du bitte ausführlicher werden.
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du machst ziemlich sicher bei der Umwandlung irgendwas falsch, weil Python keine führenden Nullen bei der Umwandlung von einem Hex-String in einen Integer Wert generiert:

Code: Alles auswählen

>>> int('0xfedc', 16)
65244
>>>
Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Oder um ein bisschen Korinthen zu kacken: Ganze Zahlen haben gar keine Dezimalziffern. Die hat nur die Darstellung als Zeichenkette, und wenn *dort* führende 0en stehen, dann muss man explizit etwas gemacht haben, damit die dort stehen. Und *das* muss man dann einfach sein lassen. 😀

Die Darstellung einer 0 als Zeichenkette hat natürlich eine ”führende” 0, aber das Beispiel sieht ja anders aus.

Wobei ich mich gerade Frage ob eventuell auch eine von diesen Varianten gemeint war/ist:

Code: Alles auswählen

In [132]: int("00030000", 16)
Out[132]: 196608

In [133]: int.from_bytes(bytes.fromhex("00030000"), "little")
Out[133]: 768
Aber da müsste Burny4600 wohl mehr verraten was da tatsächlich in was und wie umgewandelt wurde.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
Burny4600
User
Beiträge: 2
Registriert: Mittwoch 15. Januar 2025, 18:18

Es handelt sich um zwei ModBus Register eines Stromzählers bei deren Umsetzung ich ein Problem hatte.
Ich habe aber schon eine Lösung gefunden. Leider dachte ich zu kompliziert.

ModBus Register

Code: Alles auswählen

Adresse      Parameter          Adresse         Valid range
Register                          Hex
463761      Pulse 1 constant     F9 10          0000:  0.001kwh(kvarh)/imp (default) 
                                                0001:  0.01kwh(kvarh)/imp 
                                                0002:  0.1kwh(kvarh)/imp 
                                                0003:  1kwh(kvarh)/imp 
                                                Data Format:Hex(length:2 byte)

												
463776      Measurement mode     F9 20          0001:mode 1(total = import) 
                                                0002:mode 2(total = import + export)  (default) 
                                                0003:mode 3(total = import - export) 
                                                Data Format:Hex(length:2 byte)
Lösung

Code: Alles auswählen

	"h63760" =>	{	# holding register 0xF910
					# Relay 1 Pulse Constant:
					# 00000000=0.001_kWh_or_kVArh/Imp, 00010000=0.01_kWh_or_kVArh/Imp, 00020000=0.1_kWh_or_kVArh/Imp, 00030000=1_kWh_or_kVArh/Imp
					name		=> "Relay1_Pulse Constant",	# internal name of this register in the hardware doc
					reading		=> "Relay1_Pulse_Constant_Imp",	# name of the reading for this value
					map			=> "00000000:0.001, 00010000:0.01, 00020000:0.1, 00030000:1",  # map to convert visible values to internal numbers (for reading and writing)
					hint		=> "0.001,0.01,0.1,1",  	# string for fhemweb to create a selection or slider
					unpack		=> "H*",					# hex pack / unpack code to convert raw values
					format		=> '%s',					# format string for sprintf
					poll		=> "once",					# only poll once after define (or after a set)
#					set			=> 1,						# this value can be set
				},
				
	"h63776" =>	{	# holding register 0xF920
					# Measurement Mode Meter.
					name		=> "Measurement Mode",		# internal name of this register in the hardware doc
					reading		=> "Measurement_Mode",		# name of the reading for this value
					map			=> "00010000:Total_Import, 00020000:Total_Import_plus_Export, 00030000:Total_Import_minus_Export",  # map to convert visible values to internal numbers (for reading and writing)
					hint		=> "Total_Import,Total_Import_plus_Export,Total_Import_minus_Export",  # string for fhemweb to create a selection or slider
					unpack		=> "H*",					# hex pack / unpack code to convert raw values
					format		=> '%s',					# format string for sprintf
					poll		=> "once",					# only poll once after define (or after a set)
					set			=> 1,						# this value can be set
				},
Mit dieser Lösung funktioniert jedenfalls die benötigte Darstellung.
LG
Chris
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ist aber kein Python‽
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten