2012-09-28 15 views
32

Ich schrieb diese einfache Funktion:Dekorieren Hex Funktion Pad Nullen

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' 

Während dies für mich klar genug ist und paßt meinen Anwendungsfall (ein einfaches Testwerkzeug für ein einfacher Drucker) Ich kann mir nicht helfen zu denken, dass es viel Raum für Verbesserungen gibt, und das könnte zu etwas sehr prägnant zusammengequetscht werden.

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

Antwort

91

Verwenden Sie den neuen .format() String-Methode:

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

Erläuterung:

Wenn Sie die Buchstaben hexadezimalen Ziffern Großbuchstaben wollen, aber die Präfix mit einem Kleinbuchstaben 'x', yo u wird brauchen eine leichte Abhilfe:

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

mit Python 3.6 starten, können Sie auch dies tun:

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

Ist es möglich, dies als eine Formatzeichenfolge in Python 3.6 zu schreiben? –

+0

@RichardNeumann: Ja, hast du es probiert? –

+0

Ja, aber ohne Erfolg, da ich die korrekte Syntax dafür nicht herausfinden kann: 'value = 42; Auffüllen = 6; f "{value: # 0 {padding} x}" 'löst einen Syntaxfehler aus:' Datei "", Zeile 1 f "{wert: # 0 {padding} x}" ^ SyntaxError: ungültige Syntax' –

15

Wie wäre es damit:

print '0x%04x' % 42 
+0

awesomeness: -) – jon

+8

Verwenden Sie das '*' um die Breite zu übergeben: ''0x% 0 * x'% (4,42) ' –

2

Verwenden * Breite passieren und X für Groß

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

Wie vorgeschlagen von georg und Ashwini Chaudhary

+0

Was ist der Grund, um * Breite zu übergeben? –

+1

@RafaelJ Um es generisch zu machen, anstatt es hardcoded zu haben – GabrielOshiro