Шаг 47.
Python: сборник рецептов.
Числа, даты и время. Форматирование чисел для вывода

    На этом шаге мы рассмотрим различные способы форматирования чисел.

Задача

    Вам нужно отформатировать число для вывода, контролируя количество знаков, выравнивание, включение разделителя для разрядов и т. д.

Решение

    Чтобы отформатировать одно число для вывода, используйте встроенную функцию format(). Например:

>>> x = 1234.56789
>>> # Два десятичных знака точности 
>>> format(x, '0.2f')
'1234.57'
>>> # Выравнивание по правому краю в 10 символов, один знак точности 
>>> format(x, '>10.1f')
'    1234.6'
>>> # Выравнивание по левому краю 
>>> format(x, '<10.1f')
'1234.6    '
>>> # Выравнивание по центру 
>>> format(x, '^10.1f')
'  1234.6  '
>>> # Включение разделителя разрядов 
>>> format(x, ',')
'1,234.56789'
>>> format(x, '0,.1f')
'1,234.6'
>>>

    Если вы хотите использовать экспоненциальную нотацию, измените f на e или E (в зависимости от регистра, который вы хотите использовать для обозначения экспоненты). Например:

>>> format(x, 'e')
'1.234568e+03'
>>> format(x, '0.2E')
'1.23E+03'
>>>

    Общая форма ширины и точности в обоих случаях такова: '[<>^]?width[,]?(.digits)?', где width и digits - целые числа, а ? обозначает необязательные части. Тот же формат используется в строковом методе format(). Например:

>>> 'The value is {:0,.2f}'.format(x)
'The value is 1,234.57'
>>>


Обсуждение

    Форматирование чисел для вывода обычно вполне бесхитростно. Прием, показанный выше, работает и для чисел с плавающей точкой, и для экземпляров Decimal из модуля decimal.

    Когда количество знаков ограничено, значения округляются таким же образом, как и при использовании функции round(). Например:

>>> x 
1234.56789
>>> format(x, '0.1f')
'1234.6'
>>> format(-x, '0.1f')
'-1234.6'
>>>

    Обычное форматирование значений с добавлением разделителя разрядов ничего не знает о принятых в конкретных странах традициях форматирования тысячных разрядов. Если вам нужно принять во внимание эти традиции, обратите внимание на функции модуля locale. Вы также можете заменить символ разделителя разрядов, используя строковый метод translate(). Например:

>>> swap_separators = {ord('.'):',', ord(','):'.'}
>>> format(x, ',').translate(swap_separators)
'1.234,56789'
>>> 

    В мире все еще очень много кода, использующего форматирование чисел на основе оператора %. Например:

>>> '%0.2f' % x
'1234.57'
>>> '%10.1f' % x
'    1234.6'
>>> '%-10.1f' % x
'1234.6    '
>>> 

    Это форматирование все еще приемлемо, но обладает меньшими возможностями, нежели современный метод format(). Например, форматирование с помощью оператора % не поддерживает добавление разделителя разрядов.

    На следующем шаге мы рассмотрим работу с бинарными, восьмеричными и шестнадцатеричными целыми числами.




Предыдущий шаг Содержание