Як відформатувати плаваюче число до фіксованої ширини в Python


322

Як відформатувати плаваюче число до фіксованої ширини, дотримуючись наступних вимог:

  1. Провідний нуль, якщо n <1
  2. Для заповнення фіксованої ширини додайте десятковий нульовий проміжок
  3. Обрізати десяткові цифри минулої фіксованої ширини
  4. Вирівняйте всі десяткові крапки

Наприклад:

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

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

Вихід був би як

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

Відповіді:


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

відбитки

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

Специфікатор формату всередині фігурних дужок слід за синтаксисом рядка формату Python . Зокрема, у цьому випадку він складається з таких частин:

  • Порожній рядок перед засобами двокрапки «прийняти наступне при умови аргументу format()» - в даному випадку в xякості єдиного аргументу.
  • 10.4fЧастина після двокрапки є специфікацією формату .
  • В fпозначає нотації з фіксованою точкою.
  • 10Це загальна ширина поля друкується, lefted-прокладений пробілами.
  • 4Ця кількість цифр після коми.

12
Тож я розумію, що 4f являє собою обмеження десяткових знаків до 4 (із задніми нулями), але що означає 10? Чи означає це, що це форматування не працюватиме з цілими числами, більшими за 9999999999 (десять 9)? Просто цікаво.
hobbes3

55
10.4означає ширину 10 символів і точність 4 знаків після коми.
MRAB

13
@ hobbes3: 10мінімальна ширина поля, тобто мінімальна довжина друкованого рядка. Номери за замовчуванням вирівнюються правою міткою та пробілами - детальну інформацію див. У документації .
Свен Марнах

9
Для пітонів до 2.7:("%0.4f" % x).rjust(10)
Стівен Румбальський

22
@StevenRumbalski: Або просто "%10.4f" % x. У Python 2.6 ви також можете використовувати "{0:10.4f}".format(x).
Свен Марнах

88

Минуло декілька років з моменту, коли на це відповіли, але щодо Python 3.6 ( PEP498 ) ви можете використовувати нове f-strings:

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

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

Друкує:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

2
Зауважте, що ширина також включає крапковий символ. Отже, якщо ви задаєте 9 для ширини, 1 буде використовуватися для друку крапки, інші 8 - для друку цифр та пробілів.
off99555

37

У python3 такі роботи:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4

Це змінилося за останні 4 роки, зараз %форматування - найдавніший метод форматування. З кількох причин використання str.formatабо f-stringsє кращим %. Раніше, коли це було тільки str.format, люди мали деякі причини, але f-stringsвиправили цю дірку. форматування міні-мовних документів , прикладів str.format з docs та f-string
Literals


6

Можна також залишити колодку з нулями. Наприклад, якщо ви хочете numberмати довжину 9 символів, ліворуч залите нулями:

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

Таким чином, якщо number = 4.656, вихід:00004.656

Для вашого прикладу вихід буде виглядати приблизно так:

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

відбитки:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Один із прикладів, коли це може бути корисним, - це коли ви хочете правильно перелічити назви файлів у алфавітному порядку. Я помітив у деяких системах Linux, число: 1,10,11, .. 2,20,21, ...

Таким чином, якщо ви хочете забезпечити необхідне числове порядок у назви файлів, вам потрібно залишити панель з відповідною кількістю нулів.


2

У Python 3.

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

6.1fозначає, що після крапки з 1 крапкою відображається, якщо ви друкуєте 2 цифри після крапок, ви повинні бути лише %6.2fтакими, що %6.3fпісля цифри друкуються 3 цифри.


0

Мені було потрібно щось подібне для масивів. Це мені допомогло

some_array_rounded=np.around(some_array, 5)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.