Fonction hexadécimale pour éponger les zéros

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 outil de test simple pour une imprimante simple), je ne peux pas m’empêcher de penser qu’il y a beaucoup de place à l’amélioration.

Quelles sont les autres approches à ce problème?

Utilisez la nouvelle méthode de chaîne .format() :

 >>> "{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 af } # End of format identifier 

Si vous voulez que les lettres hexadécimales soient en majuscule, mais que le préfixe soit en minuscule «x», vous aurez besoin d’une solution de contournement légère:

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

A partir de Python 3.6, vous pouvez également faire ceci:

 >>> 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 la majuscule

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

Comme suggéré par georg et Ashwini Chaudhary