2012-09-28 11 views
32

Ho scritto questo semplice funzione:funzione di Decorazione Hex di zeri pad

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) 

Esempi:

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

Mentre questo è abbastanza chiaro per me e si adatta al mio caso d'uso (un semplice strumento di prova per un stampante semplice) Non posso fare a meno di pensare che c'è molto spazio per migliorare e questo potrebbe essere ridotto a qualcosa di molto conciso.

Quali altri approcci ci sono a questo problema?

risposta

91

utilizzare il nuovo metodo .format() stringa:

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

Spiegazione:

Se si desidera che le cifre lettera esadecimali maiuscola, ma la prefisso con una 'x' minuscola, yo u'll bisogno di una leggera soluzione:

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

A partire da Python 3.6, si può anche fare questo:

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

E 'possibile scrivere questo come una stringa di formato in Python 3.6? –

+0

@RichardNeumann: Sì, l'hai provato? –

+0

Sì, ma senza successo, dal momento che non riesco a capire la sintassi corretta per esso: 'value = 42; imbottitura = 6; f "{value: # 0 {padding} x}" 'genera un errore di sintassi:' File "", riga 1 f "{valore: # 0 {padding} x}" ^ SintassiErrore: sintassi non valida' –

15

ne dite di questo:

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

awesomeness: -) – jon

+8

usa il '*' per passare la larghezza: ''0x% 0 * x'% (4,42) ' –

2

Usa * per passare larghezza e X per maiuscolo

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

Come suggerito da georg e Ashwini Chaudhary

+0

Qual è la ragione per usare * per passare la larghezza? –

+1

@RafaelJ Per renderlo generico, invece di averlo codificato – GabrielOshiro