95 votes

Fonction hexadécimale décorative pour le remplissage des zéros

J'ai écrit cette simple fonction :

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 suffisamment clair pour moi et corresponde à mon cas d'utilisation (un simple outil de test pour une simple imprimante), je ne peux m'empêcher de penser qu'il y a beaucoup de place pour l'amélioration et que cela pourrait être réduit à quelque chose de très concis.

Quelles sont les autres approches possibles pour résoudre ce problème ?

229voto

Tim Pietzcker Points 146308

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

>>> "{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 majuscules mais que le préfixe comporte un "x" minuscule, vous devrez trouver une solution de rechange :

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

À partir de Python 3.6, vous pouvez également le faire :

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

33voto

georg Points 52691

Que dites-vous de ça ?

print '0x%04x' % 42

20voto

Boris Points 1440
"{:02x}".format(7)   # '07'
"{:02x}".format(27)  # '1b'

  • : est le début de la spécification de formatage pour le premier argument {} à .format()
  • 02 signifie "rembourrer l'entrée de la gauche avec 0 s à la longueur 2 "
  • x signifie "formatage en hexagone avec des lettres minuscules".

Vous pouvez également le faire avec Cordes en F :

f"{7:02x}"   # '07'
f"{27:02x}"  # '1b'

17voto

Xinyi Li Points 74

Si c'est juste pour les zéros de tête, vous pouvez essayer zfill función.

'0x' + hex(42)[2:].zfill(4) #'0x002a'

7voto

GabrielOshiro Points 142

Utilisez * pour passer la largeur et X pour les majuscules

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

Comme le suggère georg y Ashwini Chaudhary

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X