Kolom Format dan Lebar
String formatting mengatur cara nilai ditampilkan sebagai teks. Kamu dapat meratakan kolom tabel, memilih notasi angka, mengatur presisi, dan menyusun pesan yang mudah dibaca. Python menyediakan method str.format() dan f-string untuk pekerjaan ini.
Replacement field dasar berbentuk {field_name:format_spec}. Nilai lebar di dalam spesifikasi format menetapkan ruang minimum. Python tetap menampilkan nilai lengkap saat memerlukan ruang yang lebih besar.
Tipe Format untuk Sistem Bilangan
Penentu format dapat menampilkan satu bilangan bulat dalam sistem bilangan lain. Tabel berikut memuat karakter tipe dan keluaran masing-masing untuk nilai yang sama.
| Tipe format | Simbol | Contoh input | Output | Kegunaan |
|---|---|---|---|---|
| Desimal | d | 45 | 45 | Bilangan bulat desimal |
| Biner | b | 45 | 101101 | Representasi bit |
| Oktal | o | 45 | 55 | Representasi basis delapan |
| Heksadesimal | x/X | 45 | 2d/2D | Basis enam belas dengan huruf kecil atau besar |
# Width control dengan berbagai format
print('|{0:15}|'.format('xxx')) # Output: |xxx |
print('a = {0:6d}'.format(45)) # Output: a = 45
print('a = {0:10b}'.format(45)) # Output: a = 101101
print('a = {0:6x}'.format(45)) # Output: a = 2d
# Width lebih kecil dari string - tidak dipotong
print('|{0:1}|'.format('xxx')) # Output: |xxx|Pengaturan Posisi dan Karakter Pengisi
Lebar field yang tetap memerlukan aturan tentang letak teks dan isi sisanya. Kamu perlu menentukan apakah teks diletakkan di kiri, tengah, atau kanan, dan karakter apa yang dipakai untuk mengisi ruang kosong.
Opsi Perataan
Perataan menempatkan nilai di kiri, kanan, atau tengah bidang, sedangkan karakter pengisi menempati ruang yang tersisa.
| Simbol | Nama | Perilaku | Pilihan bawaan untuk |
|---|---|---|---|
< | Rata kiri | Teks di kiri, padding di kanan | String |
> | Rata kanan | Teks di kanan, padding di kiri | Angka |
^ | Tengah | Teks di tengah, padding merata | - |
Karakter Pengisi dan Format Lanjutan
Karakter pengisi menempati ruang yang tidak terpakai di dalam bidang. Secara bawaan, Python memakai spasi sebagai pengisi. Tulis karakter pengisi tepat sebelum simbol perataan. Pada str.format() dan f-string, karakter literal { atau } tidak dapat dipakai sebagai pengisi.
# Basic alignment
print('|{0:<15}|'.format('xxx')) # Output: |xxx |
print('|{0:>15}|'.format('xxx')) # Output: | xxx|
print('|{0:^15}|'.format('xxx')) # Output: | xxx |
# Custom fill characters
print('|{0:-<15}|'.format('xxx')) # Output: |xxx------------|
print('|{0:*>15}|'.format('xxx')) # Output: |************xxx|
print('|{0:^^15}|'.format('xxx')) # Output: |^^^^^^xxx^^^^^^|
# Decimal formatting
x = 123.98
print('x = {0:12f}'.format(x)) # Output: x = 123.980000
print('x = {0:12e}'.format(x)) # Output: x = 1.239800e+02Cara Merujuk Argumen
Replacement field memilih nilai yang akan dimasukkan ke teks. Pakai indeks untuk memilih argumen posisi, nama untuk memilih argumen kata kunci, atau penomoran otomatis untuk mengambil argumen posisi secara berurutan.
Perbandingan Referensi Argumen
Satu format string dapat menamai argumennya dengan tiga cara. Tabel berikut membandingkan syarat dan batas masing-masing cara.
| Cara | Sintaks | Kelebihan | Batasan |
|---|---|---|---|
| Numbered | {0}, {1} | Kontrol eksplisit, bisa diulang | Setiap indeks yang dirujuk harus tersedia |
| Keyword | {name}, {age} | Setiap nama menunjukkan value yang terkait dan dapat diulang | Nama harus cocok |
| Automatic | {}, {} | Sintaks sederhana | Tidak bisa dicampur dengan numbered |
# Numbered fields - kontrol eksplisit
print('{2} - {0} - {1}'.format('first', 'second', 'third'))
# Output: third - first - second
# Keyword fields - menggunakan nama
print('{name} is {age} years old'.format(name='Alice', age=25))
# Output: Alice is 25 years old
# Automatic numbering - urutan berurutan
print('{} + {} = {}'.format(5, 3, 8))
# Output: 5 + 3 = 8
# Error handling
try:
print('{a} - {b}'.format(a='xxx')) # Akan error
except KeyError as e:
print(f"KeyError: {e}") # Output: KeyError: 'b'
try:
print('{0} - {1}'.format('xxx')) # Akan error
except IndexError as e:
print(f"IndexError: {e}") # Output: IndexError: Replacement index 1 out of range for positional args tupleKontrol Presisi dan Spesifikasi Tanda
Presisi mengatur digit pada teks hasil pemformatan, sedangkan opsi tanda mengatur kemunculan plus, minus, atau spasi. Misalnya, format(12.3, "+.2f") menghasilkan +12.30: tanda + dan dua tempat desimal berasal dari dua opsi yang berbeda.
Presisi untuk Angka Desimal
Arti presisi bergantung pada tipe penyajian. Untuk f dan e, presisi menentukan jumlah digit setelah tanda desimal. Untuk g, presisi menentukan jumlah digit signifikan. Semua baris tabel memakai input 123.98765, sehingga kamu dapat membandingkan perubahan tampilan nilai yang sama.
| Tipe format | Perilaku presisi | Contoh |
|---|---|---|
f/F | Tempat desimal | {:.2f} → 123.99 |
e/E | Tempat desimal dalam eksponensial | {:.2e} → 1.24e+02 |
g/G | Digit signifikan | {:.3g} → 124 |
Opsi Tanda
Pada baris spasi, simbolnya memang satu karakter kosong di dalam format specifier, seperti pada {: d}. Karena karakter itu tidak terlihat, tabel menamainya sebagai spasi literal.
| Simbol | Perilaku | Contoh |
|---|---|---|
+ | Selalu tampilkan tanda | +100, -200 |
- | Hanya tanda negatif secara bawaan | 100, -200 |
| spasi literal | Menyisakan satu spasi sebelum angka positif | ' 100', '-200' |
# Precision control
print('x = {0:.3f}'.format(123.98765)) # Output: x = 123.988
print('x = {0:12.2e}'.format(1.987e-10)) # Output: x = 1.99e-10
print('x = {0:.3g}'.format(1.123456)) # Output: x = 1.12
# Sign specification
numbers = [-100, 200, -300]
print('Default:', ['{:d}'.format(n) for n in numbers])
# Output: Default: ['-100', '200', '-300']
print('Always sign:', ['{:+d}'.format(n) for n in numbers])
# Output: Always sign: ['-100', '+200', '-300']
print('Spasi untuk bilangan positif:', ['{: d}'.format(n) for n in numbers])
# Output: Spasi untuk bilangan positif: ['-100', ' 200', '-300']
# Rounding behavior
print('Tiny number f: {0:12f}'.format(1.1e-10)) # Output: Tiny number f: 0.000000
print('Tiny number g: {0:12g}'.format(1.1e-10)) # Output: Tiny number g: 1.1e-10F Strings dan Template Dinamis
F-string tersedia sejak Python 3.6 dan mengevaluasi ekspresi di dalam replacement field saat baris kode dijalankan. Dalam f"Usia tahun depan: {age + 1}", Python menghitung age + 1 lebih dahulu, lalu memasukkan hasil penjumlahan ke teks.
Template Format Dinamis
Replacement field bertingkat dapat menentukan lebar, karakter pengisi, atau perataan dari nilai lain. Gunakan bentuk ini ketika nilai spesifikasi format baru diketahui saat program berjalan.
# F-strings - sintaks sederhana
name, age = 'Alice', 25
print(f'{name} is {age} years old') # Output: Alice is 25 years old
print(f'Next year: {name} will be {age + 1}') # Output: Next year: Alice will be 26
# Dynamic format templates
value, width, fill, align = 'data', 12, '-', '^'
template = '|{val:{f}{a}{w}}|'
result = template.format(val=value, w=width, f=fill, a=align)
print(result) # Output: |----data----|
# Comparison - same output, different methods
x = 123.456
print('Old style: %8.2f' % x) # Output: Old style: 123.46
print('Format method: {0:8.2f}'.format(x)) # Output: Format method: 123.46
print(f'F-string: {x:8.2f}') # Output: F-string: 123.46
# Complex f-string with format spec
import math
radius = 5.7
print(f'Area: {math.pi * radius**2:.2f} cm²') # Output: Area: 102.07 cm²Membaca Spesifikasi Format
Coba "{nilai:*^+10.2f}".format(nilai=12.3). Hasilnya adalah **+12.30**. Tipe f dengan presisi 2 membentuk 12.30, tanda + menambah satu karakter, lalu empat karakter pengisi melengkapi lebar minimum sepuluh karakter. Perataan ^ membagi empat pengisi itu menjadi dua di kiri dan dua di kanan.
Pemformatan menghasilkan objek string baru. Nilai angka 12.3 tetap sama, sehingga kamu masih dapat memakai angka itu untuk perhitungan berikutnya.