web-dev-qa-db-fra.com

Décorer la fonction Hex pour compléter 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 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?

44
jon

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'
123
Tim Pietzcker

Que dis-tu de ça:

print '0x%04x' % 42
20
georg

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

3
GabrielOshiro

Si ce n'est que pour les zéros, vous pouvez essayer la fonction zfill.

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