2009-03-31 13 views
3

Comment formater un nombre comme une chaîne de sorte qu'il prend un certain nombre d'espaces devant lui? Je veux que le plus petit nombre 5 ait suffisamment d'espaces devant lui pour que les espaces plus 5 aient la même longueur que 52500. La procédure ci-dessous fonctionne, mais y a-t-il une manière intégrée de faire ceci?Formater un nombre sous la forme d'une chaîne

a = str(52500) 
b = str(5) 
lengthDiff = len(a) - len(b) 
formatted = '%s/%s' % (' '*lengthDiff + b, a) 
# formatted looks like:'  5/52500' 

Répondre

8

Format operator:

>>> "%10d" % 5 
'   5' 
>>> 

aide * spécifications, la longueur du champ peut être un argument:

>>> "%*d" % (10,5) 
'   5' 
>>> 
+0

C'était exactement ce dont j'avais besoin. – hekevintran

0

Je ne sais pas exactement ce que vous êtes après, mais cela ressemble beaucoup:

>>> n = 50 
>>> print "%5d" % n 
    50 

Si vous voulez être plus dynamique, utilisez quelque chose comme rjust:

>>> big_number = 52500 
>>> n = 50 
>>> print ("%d" % n).rjust(len(str(52500))) 
    50 

Ou même :

>>> n = 50 
>>> width = str(len(str(52500))) 
>>> ('%' + width + 'd') % n 
' 50' 
1

Voir String Formatting Operations:

s = '%5i' % (5,) 

Il vous reste à construire dynamiquement votre chaîne de formatage en incluant la longueur maximale:

fmt = '%%%ii' % (len('52500'),) 
s = fmt % (5,) 
2

Vous pouvez simplement utiliser le formateur %*d pour donner une largeur. int(math.ceil(math.log(x, 10))) vous donnera le nombre de chiffres. Le modificateur * consomme un nombre, ce nombre est un nombre entier qui indique le nombre d'espaces pour l'espace. Donc, en faisant '%*d'% (width, num) `vous pouvez spécifier la largeur ET rendre le nombre sans autre manipulation de chaîne python.

Voici une solution utilisant math.log pour déterminer la longueur du nombre 'outof'.

import math 
num = 5 
outof = 52500 
formatted = '%*d/%d' % (int(math.ceil(math.log(outof, 10))), num, outof) 

Une autre solution consiste à couler le nombre outof comme une chaîne et en utilisant len ​​(), vous pouvez le faire si vous préférez:

num = 5 
outof = 52500 
formatted = '%*d/%d' % (len(str(outof)), num, outof) 
+0

len (str (x)) est environ deux fois plus rapide sur mon système. C'est aussi plus facile à lire :-) –

+0

Oui, mais c'est en supposant que vous savez quel côté de l'équation est le plus long. –

+0

math.ceil (math.log (x, 10)) donne des résultats erronés pour des puissances de 10. –

2

'% * s /% s' % (len (str (a)), b, a)

Questions connexes