format python
Decorando la funciĆ³n hexagonal para rellenar los ceros. (4)
Qué tal esto:
print ''0x%04x'' % 42
Escribí esta simple función:
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''
Si bien esto es lo suficientemente claro para mí y se adapta a mi estuche de uso (una herramienta de prueba simple para una impresora simple) no puedo dejar de pensar que hay mucho margen de mejora y esto podría reducirse a algo muy conciso.
¿Qué otros enfoques hay para este problema?
Si solo para los ceros zfill
, puedes probar la función zfill
.
''0x'' + hex(42)[2:].zfill(4) #''0x002a''
Usa *
para pasar ancho y X
para mayúsculas
print ''0x%0*X'' % (4,42) # ''0x002A''
Según lo sugerido por georg y Ashwini Chaudhary
Use el nuevo método de cadena .format()
:
>>> "{0:#0{1}x}".format(42,6)
''0x002a''
Explicación:
{ # 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
Si desea que los dígitos hexadecimales de las letras estén en mayúsculas, pero el prefijo con una ''x'' en minúsculas, necesitará una pequeña solución:
>>> ''0x{0:0{1}X}''.format(42,4)
''0x002A''
A partir de Python 3.6, también puedes hacer esto:
>>> value = 42
>>> padding = 6
>>> f"{value:#0{padding}x}"
''0x002a''