2012-09-28 20 views
32

me escribió esta función simple:función Decoración Hex a ceros almohadilla

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) 

Ejemplos:

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

Mientras que esto es lo suficientemente claro para mí y se ajusta a mi caso de uso (una herramienta de prueba simple para una impresora simple) No puedo evitar pensar que hay mucho margen de mejora y esto podría reducirse a algo muy conciso.

¿Qué otros enfoques hay para este problema?

Respuesta

91

utilizar el nuevo método .format() cadena:

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

Explicación:

Si desea que los dígitos carta hexagonales mayúsculas pero la prefijo con una 'x' minúscula, yo ua necesitar una ligera solución:

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

A partir de Python 3.6, también se puede hacer esto:

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

¿Es posible escribir esto como una cadena de formato en python 3.6? –

+0

@RichardNeumann: Sí, ¿lo has probado? –

+0

Sí, pero sin éxito, ya que no puedo descifrar la sintaxis correcta para él: 'value = 42; relleno = 6; f "{value: # 0 {padding} x}" 'arroja un error de sintaxis:' File "", línea 1 f "{value: # 0 {padding} x}" ^ SyntaxError: sintaxis inválida' –

15

¿Qué tal esto:

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

awesomeness: -) – jon

+8

use '' 'para pasar ancho:' '0x% 0 * x'% (4,42) ' –

2

Uso * para pasar anchura y X de mayúsculas

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

Como sugerido por georg y Ashwini Chaudhary

+0

¿Cuál es el motivo para usar * para aprobar el ancho? –

+1

@RafaelJ Para hacerlo genérico, en lugar de tenerlo codificado – GabrielOshiro