Como formatar um número flutuante para largura fixa em Python

322

Como formatar um número flutuante para uma largura fixa com os seguintes requisitos:

  1. Zero à esquerda se n <1
  2. Adicione zero (s) decimal (s) à direita para preencher a largura fixa
  3. Truncar dígitos decimais após a largura fixa
  4. Alinhar todos os pontos decimais

Por exemplo:

% formatter something like '{:06}'
numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print formatter.format(number)

A saída seria como

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
hobbes3
fonte

Respostas:

500
for x in numbers:
    print "{:10.4f}".format(x)

impressões

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

O especificador de formato dentro das chaves segue a sintaxe da string de formato Python . Especificamente, neste caso, consiste nas seguintes partes:

  • A cadeia vazia antes dos dois pontos significa "levar o próximo argumento fornecido format()" - nesse caso, o xcomo o único argumento.
  • A 10.4fparte após os dois pontos é a especificação de formato .
  • Os fdenota notação de ponto fixo.
  • A 10é a largura total do campo que está sendo impresso, preenchido por espaços preenchidos com a esquerda.
  • O 4é o número de dígitos após o ponto decimal.
Sven Marnach
fonte
12
Então, eu entendo que o 4f representa limitar os decimais a 4 (com zeros à direita), mas o que os 10 significam? Isso significa que essa formatação não funcionará com números inteiros maiores que 9999999999 (dez 9's)? Apenas curioso.
precisa saber é o seguinte
55
10.4significa uma largura de 10 caracteres e uma precisão de 4 casas decimais.
MRAB 16/01/12
13
@ hobbes3: 10é a largura mínima do campo, ou seja, o comprimento mínimo da sequência impressa. Por padrão, os números estão alinhados à direita e preenchidos com espaços - consulte a documentação para obter mais detalhes.
Sven Marnach
9
Para Pythons anteriores a 2.7:("%0.4f" % x).rjust(10)
Steven Rumbalski
22
@StevenRumbalski: Ou simplesmente "%10.4f" % x. No Python 2.6, você também pode usar "{0:10.4f}".format(x).
Sven Marnach
88

Faz alguns anos desde que isso foi respondido, mas a partir do Python 3.6 ( PEP498 ) você poderia usar o novo f-strings:

numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print(f'{number:9.4f}')

Impressões:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
artomason
fonte
2
Observe que a largura também inclui caracteres de ponto. Portanto, se você especificar 9 como largura, 1 será usado para imprimir o ponto, os outros 8 serão para impressão de dígitos e espaços.
off99555
37

Em python3, o seguinte funciona:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4
Scott Roberts
fonte
Isso mudou nos últimos 4 anos, agora a %formatação é o método mais antigo de formatação. Por várias razões, usar str.formatou f-stringsé preferível a %. Anteriormente, quando era apenas str.format, as pessoas tinham alguns motivos, mas f-stringsconsertaram esse buraco. mini-linguagem formato docs , exemplos str.format de docs e literais exemplos f cordas em docs
ninMonkey
10

Consulte Sintaxe de cadeia de caracteres no formato Python 3.x :

IDLE 3.5.1   
numbers = ['23.23', '.1233', '1', '4.223', '9887.2']

for x in numbers:  
    print('{0: >#016.4f}'. format(float(x)))  

     23.2300
      0.1233
      1.0000
      4.2230
   9887.2000
readyleader
fonte
6

Você também pode deixar o teclado com zeros. Por exemplo, se você quiser numberter 9 caracteres de comprimento, preenchido à esquerda com zeros use:

print('{:09.3f}'.format(number))

Portanto, se number = 4.656a saída for:00004.656

Para o seu exemplo, a saída será assim:

numbers  = [23.2300, 0.1233, 1.0000, 4.2230, 9887.2000]
for x in numbers: 
    print('{:010.4f}'.format(x))

impressões:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Um exemplo em que isso pode ser útil é quando você deseja listar corretamente os nomes de arquivos em ordem alfabética. Notei em alguns sistemas linux, o número é: 1,10,11, .. 2,20,21, ...

Portanto, se você deseja impor a ordem numérica necessária nos nomes de arquivos, é necessário deixar o teclado à esquerda com o número apropriado de zeros.

elcymon
fonte
2

No Python 3.

GPA = 2.5
print(" %6.1f " % GPA)

6.1fmeio após os pontos 1 dígitos mostrar se imprimir 2 dígitos após os pontos que você só deve %6.2ftal que %6.3f3 dígitos de impressão após o ponto.

Usman Zia
fonte
0

Eu precisava de algo semelhante para matrizes. Isso me ajudou

some_array_rounded=np.around(some_array, 5)
Anton
fonte