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?

jon
quelle

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'
Tim Pietzcker
quelle
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
27

Wie wäre es damit:

print '0x%04x' % 42
georg
quelle
8
Verwenden Sie die *, um Breite zu übergeben:'0x%0*x' % (4,42)
Ashwini Chaudhary
7

Verwenden Sie *diese Option , um die Breite und den XGroßbuchstaben zu übergeben

print '0x%0*X' % (4,42) # '0x002A'

Wie von Georg und Ashwini Chaudhary vorgeschlagen

GabrielOshiro
quelle
Was ist der Grund, * zu verwenden, um die Breite zu übergeben?
tartaruga_casco_mole
3
@ RafaelJ Um es generisch zu machen, anstatt es fest codieren zu lassen
GabrielOshiro
6

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

'0x' + hex(42)[2:].zfill(4) #'0x002a'
Xinyi Li
quelle
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'
Boris
quelle
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'
SENHAJI RHAZI Hamza
quelle
1
'%0*x' % (7,0xfff)
Jon