Cách định dạng số nổi thành chiều rộng cố định trong Python


322

Làm cách nào để định dạng số nổi thành chiều rộng cố định với các yêu cầu sau:

  1. Dẫn đầu 0 nếu n <1
  2. Thêm số thập phân 0 (s) để điền vào chiều rộng cố định
  3. Cắt các chữ số thập phân qua chiều rộng cố định
  4. Căn chỉnh tất cả các dấu thập phân

Ví dụ:

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

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

Đầu ra sẽ như thế nào

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

Câu trả lời:


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

in

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

Trình xác định định dạng bên trong dấu ngoặc nhọn tuân theo cú pháp chuỗi định dạng Python . Cụ thể, trong trường hợp này, nó bao gồm các phần sau:

  • Chuỗi rỗng trước dấu hai chấm có nghĩa là "đưa đối số được cung cấp tiếp theo format()" - trong trường hợp này xlà đối số duy nhất.
  • Phần 10.4fsau dấu hai chấm là đặc tả định dạng .
  • Các fký hiệu điểm cố định.
  • Các 10là tổng chiều rộng của lĩnh vực này được in, lefted-đệm bằng dấu cách.
  • Các 4là số chữ số sau dấu thập phân.

12
Vì vậy, tôi hiểu rằng 4f đại diện cho việc giới hạn số thập phân thành 4 (với các số 0 ở cuối), nhưng số 10 có nghĩa là gì? Điều đó có nghĩa là định dạng này sẽ không hoạt động với số nguyên lớn hơn 9999999999 (mười 9 giây)? Chỉ tò mò thôi.
hobbes3

55
10.4có nghĩa là chiều rộng 10 ký tự và độ chính xác là 4 chữ số thập phân.
MRAB

13
@ hobbes3: 10là chiều rộng trường tối thiểu, nghĩa là độ dài tối thiểu của chuỗi in. Các số theo mặc định được căn phải và được đệm bằng khoảng trắng - xem tài liệu để biết thêm chi tiết.
Sven Marnach

9
Đối với Pythons trước 2.7:("%0.4f" % x).rjust(10)
Steven Rumbalski

22
@StevenRumbalski: Hoặc đơn giản "%10.4f" % x. Trong Python 2.6, bạn cũng có thể sử dụng "{0:10.4f}".format(x).
Sven Marnach

88

Đã một vài năm kể từ khi điều này được trả lời, nhưng kể từ Python 3.6 ( PEP498 ), bạn có thể sử dụng cái mới f-strings:

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

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

Bản in:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

2
Lưu ý rằng chiều rộng cũng bao gồm ký tự dấu chấm. Vì vậy, nếu bạn chỉ định 9 là chiều rộng, 1 sẽ được sử dụng để in dấu chấm, 8 số còn lại sẽ dành cho in chữ số và dấu cách.
off99555

37

Trong python3 các công việc sau:

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

Điều này đã thay đổi trong 4 năm qua, bây giờ %định dạng là phương pháp định dạng lâu đời nhất. Đối với một số lý do sử dụng str.formathoặc f-stringsđược ưa thích hơn %. Trước đây khi chỉ là str.format, mọi người có một số lý do nhưng đã f-stringssửa lỗ hổng đó. định dạng tài liệu ngôn ngữ nhỏ , ví dụ str.format từ tài liệuví dụ văn học chuỗi f trong tài liệu
ninMonkey


6

Bạn cũng có thể để lại pad với số không. Ví dụ: nếu bạn muốn numbercó độ dài 9 ký tự, bên trái được đệm bằng số không sử dụng:

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

Do đó, nếu number = 4.656, đầu ra là:00004.656

Ví dụ của bạn, đầu ra sẽ như thế này:

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

in:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Một ví dụ trong đó điều này có thể hữu ích là khi bạn muốn liệt kê đúng tên tệp theo thứ tự bảng chữ cái. Tôi nhận thấy trong một số hệ thống linux, số lượng là: 1,10,11, .. 2,20,21, ...

Do đó, nếu bạn muốn thực thi thứ tự số cần thiết trong tên tệp, bạn cần phải để lại phần đệm với số không thích hợp.


2

Trong Python 3.

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

6.1fcó nghĩa là sau khi các chấm 1 chữ số hiển thị nếu bạn in 2 chữ số sau các dấu chấm, bạn chỉ nên %6.2fsao cho %6.3f3 chữ số in sau điểm.


0

Tôi cần một cái gì đó tương tự cho mảng. Điều đó đã giúp tôi

some_array_rounded=np.around(some_array, 5)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.