Cara memformat angka mengambang ke lebar tetap di Python


322

Bagaimana cara memformat angka mengambang ke lebar tetap dengan persyaratan berikut:

  1. Leading nol jika n <1
  2. Tambahkan trailing desimal zero (s) untuk mengisi lebar tetap
  3. Potong digit desimal melewati lebar tetap
  4. Sejajarkan semua poin desimal

Sebagai contoh:

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

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

Outputnya akan seperti

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

Jawaban:


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

cetakan

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

Penentu format di dalam kurung kurawal mengikuti sintaks string format Python . Secara khusus, dalam hal ini, terdiri dari bagian-bagian berikut:

  • The string kosong sebelum sarana usus "mengambil argumen berikutnya diberikan kepada format()" - dalam hal ini xsebagai satu-satunya argumen.
  • Bagian 10.4fsetelah titik dua adalah spesifikasi format .
  • Yang fmenunjukkan notasi titik tetap.
  • Ini 10adalah total lebar bidang yang sedang dicetak, dibiarkan-diisi oleh spasi.
  • Ini 4adalah jumlah digit setelah titik desimal.

12
Jadi saya mengerti bahwa 4f mewakili membatasi desimal ke 4 (dengan trailing nol), tetapi apa artinya 10? Apakah itu berarti pemformatan ini tidak akan berfungsi dengan bilangan bulat yang lebih besar dari 9999999999 (sepuluh 9)? Hanya penasaran.
hobbes3

55
10.4berarti lebar 10 karakter dan ketelitian 4 tempat desimal.
MRAB

13
@ hobbes3: 10adalah lebar bidang minimum, yaitu panjang minimum dari string yang dicetak. Angka-angka secara default disejajarkan dan diisi dengan spasi - lihat dokumentasi untuk detail lebih lanjut.
Sven Marnach

9
Untuk Piton sebelum 2.7:("%0.4f" % x).rjust(10)
Steven Rumbalski

22
@StevenRumbalski: Atau sederhana "%10.4f" % x. Di Python 2.6, Anda juga bisa menggunakan "{0:10.4f}".format(x).
Sven Marnach

88

Sudah beberapa tahun sejak ini dijawab, tetapi pada Python 3.6 ( PEP498 ) Anda bisa menggunakan yang baru f-strings:

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

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

Cetakan:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

2
Perhatikan bahwa lebarnya juga termasuk karakter titik. Jadi, jika Anda menetapkan 9 sebagai lebar, 1 akan digunakan untuk mencetak titik, 8 lainnya untuk mencetak angka dan spasi.
off99555

37

Dalam python3 berikut ini berfungsi:

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

Ini telah berubah dalam 4 tahun terakhir, sekarang %format adalah metode format tertua. Untuk beberapa alasan menggunakan str.formatatau f-stringslebih disukai daripada %. Sebelumnya saat itu sajastr.format , orang memiliki beberapa alasan tetapi f-stringsmemperbaiki lubang itu. format dokumen mini-bahasa , contoh str.format dari docs dan contoh literal f-string dalam dokumen
ninMonkey

10

Lihat sintaks string format 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

6

Anda juga dapat meninggalkan pad dengan nol. Misalnya, jika Anda ingin numbermemiliki panjang 9 karakter, kosongkan dengan nol gunakan:

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

Jadi, jika number = 4.656, outputnya adalah:00004.656

Sebagai contoh, hasilnya akan seperti ini:

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

cetakan:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Salah satu contoh di mana ini mungkin berguna adalah ketika Anda ingin mendaftar nama file dengan benar dalam urutan abjad. Saya perhatikan di beberapa sistem linux, jumlahnya adalah: 1,10,11, .. 2,20,21, ...

Jadi, jika Anda ingin menerapkan urutan numerik yang diperlukan dalam nama file, Anda harus meninggalkan pad dengan jumlah nol yang sesuai.


2

Dalam Python 3.

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

6.1fberarti setelah titik 1 digit menunjukkan jika Anda mencetak 2 digit setelah titik-titik Anda harus hanya %6.2fseperti yang %6.3f3 digit dicetak setelah titik.


0

Saya membutuhkan sesuatu yang mirip untuk array. Itu membantu saya

some_array_rounded=np.around(some_array, 5)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.