Dekorieren der Hex-Funktion zum Auffüllen von Nullen


72

Ich habe diese einfache Funktion geschrieben:

def padded_hex(i, l):
    given_int = i
    given_len = l

    hex_result = hex(given_int)[2:] # remove '0x' from beginning of str
    num_hex_chars = len(hex_result)
    extra_zeros = '0' * (given_len - num_hex_chars) # may not get used..

    return ('0x' + hex_result if num_hex_chars == given_len else
            '?' * given_len if num_hex_chars > given_len else
            '0x' + extra_zeros + hex_result if num_hex_chars < given_len else
            None)

Beispiele:

padded_hex(42,4) # result '0x002a'
hex(15) # result '0xf'
padded_hex(15,1) # result '0xf'

Obwohl dies für mich klar genug ist und zu meinem Anwendungsfall passt (ein einfaches Testwerkzeug für einen einfachen Drucker), kann ich nicht anders, als zu glauben, dass es viel Raum für Verbesserungen gibt, und dies könnte auf etwas sehr Prägnantes reduziert werden.

Welche anderen Ansätze gibt es für dieses Problem?

Antworten:


179

Verwenden Sie die neue .format()Zeichenfolgenmethode:

>>> "{0:#0{1}x}".format(42,6)
'0x002a'

Erläuterung:

{   # Format identifier
0:  # first parameter
#   # use "0x" prefix
0   # fill with zeroes
{1} # to a length of n characters (including 0x), defined by the second parameter
x   # hexadecimal number, using lowercase letters for a-f
}   # End of format identifier

Wenn Sie möchten, dass der Buchstabe hexadezimal in Großbuchstaben geschrieben wird, das Präfix jedoch ein Kleinbuchstaben 'x' enthält, benötigen Sie eine leichte Problemumgehung:

>>> '0x{0:0{1}X}'.format(42,4)
'0x002A'

Ab Python 3.6 können Sie außerdem Folgendes tun:

>>> value = 42
>>> padding = 6
>>> f"{value:#0{padding}x}"
'0x002a'

Ist es möglich, dies als Formatzeichenfolge in Python 3.6 zu schreiben?
Richard Neumann

Ja, aber ohne Erfolg, da ich die richtige Syntax dafür nicht herausfinden kann: value = 42; padding = 6; f"{value:#0{padding}x}"löst einen Syntaxfehler aus: `Datei" <stdin> ", Zeile 1 f" {Wert: # 0 {padding} x} "^ SyntaxError: ungültig Syntax`
Richard Neumann

Dies funktioniert bei Python 3.6.4. Stellen import sys; print(sys.version)Sie sicher, dass Sie den richtigen Interpreter verwenden.
Tim Pietzcker



6

Wenn nur für führende Nullen, können Sie die zfillFunktion ausprobieren .

'0x' + hex(42)[2:].zfill(4) #'0x002a'

4

Was ich brauchte war

"{:02x}".format(7)   # '07'
"{:02x}".format(27)  # '1b'

Wo :ist der Start der Formatierung Spezifikation für das erste Argument {}zu .format(), dann 02bedeutet „Pad , um die Eingabe von links mit 0s auf Länge 2“ und xbedeutet „Format als hexadezimale mit Kleinbuchstabe“.

Das Obige kann auch mit F-Strings gemacht werden:

f"{7:02x}"   # '07'
f"{27:02x}"  # '1b'

1

Angenommen, Sie möchten führende Nullen für die Hexadezimalzahl haben, zum Beispiel möchten Sie eine 7-stellige Zahl, auf die Ihre Hexadezimalzahl geschrieben werden soll. Sie können dies folgendermaßen tun:

hexnum = 0xfff
str_hex =  hex(hexnum).rstrip("L").lstrip("0x") or "0"
'0'* (7 - len(str_hexnum)) + str_hexnum

Dies ergibt als Ergebnis:

'0000fff'

1
'%0*x' % (7,0xfff)
Jon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.