J'ai écrit cette fonction simple:
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)
Exemples:
padded_hex(42,4) # result '0x002a'
hex(15) # result '0xf'
padded_hex(15,1) # result '0xf'
Bien que cela soit assez clair pour moi et corresponde à mon cas d'utilisation (un simple outil de test pour une imprimante simple), je ne peux m'empêcher de penser qu'il y a encore beaucoup à faire pour une amélioration et que cela pourrait être réduit à néant.
Quelles sont les autres approches à ce problème?
Utilisez la nouvelle méthode .format()
string:
>>> "{0:#0{1}x}".format(42,6)
'0x002a'
Explication:
{ # 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 vous souhaitez que les chiffres hexadécimaux soient en majuscule mais que le préfixe soit précédé d'un «x» minuscule, vous aurez besoin d'une solution de contournement légère:
>>> '0x{0:0{1}X}'.format(42,4)
'0x002A'
À partir de Python 3.6, vous pouvez également procéder comme suit:
>>> value = 42
>>> padding = 6
>>> f"{value:#0{padding}x}"
'0x002a'
Que dis-tu de ça:
print '0x%04x' % 42
Utilisez *
pour passer la largeur et X
pour les majuscules
print '0x%0*X' % (4,42) # '0x002A'
Comme suggéré par georg et Ashwini Chaudhary
Si ce n'est que pour les zéros, vous pouvez essayer la fonction zfill
.
'0x' + hex(42)[2:].zfill(4) #'0x002a'