Python memiliki metode pemformatan (formatting) yang powerful. Ada dua cara atau style formatting di Python, yaitu dengan style lama dan dengan style baru. Style lama menggunakan tanda persen %
, sedangkan style baru menggunakan metode format()
. Di artikel ini, Anda akan menjumpai formatting string dan bilangan lengkap yang mencakup penggunaan format cara lama dan baru disertai dengan contoh – contohnya.
Tabel konten
- Formatting Dasar
- Konversi Nilai
- Padding dan Perataan String
- Pemotongan String Panjang
- Bilangan
- Padding Bilangan
- Bilangan Bertanda
- Placeholder Bernama
- Getitem dan Getattr
- Datetime
- Format Berparameter
- Objek Kustomasi
Formatting Dasar
Formatting posisi kemungkinan adalah hal yang paling sering kita jumpai. Kita menggunakannya pada saat urutan dari argumen tidak ingin diubah, dan hanya ada sedikit elemen yang akan digabungkan. Metode formatting ini cocoknya adalah untuk memformat elemen yang jumlahnya sedikit.
Old | '%s %s' % ('one', 'two') |
New | '{} {}'.format('one', 'two') |
Output | one two |
Old | '%d %d' % (1, 2) |
New | '{} {}'.format(1, 2) |
Output | 1 2 |
Dengan style performatan yang baru, kita bisa menggunakan indeks untuk mempertukarkan posisi dua buah penampung (placeholder). Contohnya adalah seperti berikut.
Operasi berikut tidak tersedia pada style formatting lama
New | '{1} {0}'.format('one', 'two') |
Output | two one |
Konversi Nilai
Style pemformatan yang baru secara default memanggil metode __format__()
dari objek untuk ditampilkan. Jika kita hanya ingin menampilkan output dari str()
atau repr()
, kita bisa menggunakan flag konversi !s
atau !r
.
Pada style formatting lama, kita menggunakan %s
untuk mewakili string, dan %r
digunakan untuk metode repr()
Setup
class Data(object): def __str__(self): return 'str' def __repr__(self): return 'repr'
Old | '%s %r' % (Data(), Data()) |
New | '{0!s} {0!r}'.format(Data()) |
Output | str repr |
Di Python 3, ada flag konversi tambahan yang menggunakan output dari repr()
tapi menggunakan ascii()
Setup
class Data(object): def __repr__(self): return 'repr'
Old | '%r %a' % (Data(), Data()) |
New | '{0!r} {0!a}'.format(Data()) |
Output | repr r\xe4pr |
Padding dan Perataan String
Normalnya, nilai yang diformat mengambil lebar sebanyak karakter yang akan direpresentasikannya. Akan tetapi, kita bisa mengatur sendiri berapa lebar yang kita inginkan.
Cara meratakan string berbeda antara style lama dan yang baru. Style yang lama defaultnya adalah rata kanan, sedangkan style baru defaultnya adalah rata kiri.
Rata kanan:
Old | '%10s' % ('test',) |
New | '{:>10}'.format('test') |
Output | test |
Rata kiri:
Old | '%-10s' % ('test',) |
New | '{:10}'.format('test') |
Output | test |
Style formatting yang baru memiliki beberapa fitur untuk mengatur bagaimana padding dan perataan dilakukan, yaitu sebagai berikut:
- Kita bisa menyesuaikan karakter padding
Operasi berikut tidak tersedia pada style formatting lama
New | '{:_<10}'.format('test') |
Output | test______ |
- Kita bisa mengatur rata tengah
Operasi berikut tidak tersedia pada style formatting lama
New | '{:^10}'.format('test') |
Output | test |
- Selain itu, penggunaan rata tengah dimana panjang stringnya tidak tepat dibagi dua, maka karakter ekstra akan ditambahkan di sebelah kanan.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:^6}'.format('zip') |
Output | zip |
Pemotongan String Panjang
Berbeda dengan padding yang menambahkan lebar pada string, kita juga bisa melakukan pemotongan (truncating) untuk memotong jumlah karakter yang ada pada string.
Angka yang di belakang tanda .
di dalam spesifikasi format digunakan untuk mengatur presisi dari output. Artinya string tersebut akan dipotong menjadi sepanjang angka tersebut.
Old | '%.5s' % ('pythonindo',) |
New | '{:.5}'.format('pythonindo') |
Output | pytho |
Menggabungkan Pemotongan dan Padding
Kita juga bisa menggabungkan antara pemotongan dengan padding
Old | '%-10.5s' % ('pythonindo',) |
New | '{:10.5}'.format('pythonindo') |
Output | pytho |
Bilangan
Kita juga bisa memformat bilangan seperti halnya string.
Integer:
Old | '%d' % (42,) |
New | '{:d}'.format(42) |
Output | 42 |
Float:
Old | '%f' % (3.141592653589793,) |
New | '{:f}'.format(3.141592653589793) |
Output | 3.141593 |
Padding Bilangan
Sama halnya dengan string, bilangan juga bisa dibuat dengan panjang tertentu.
Old | '%4d' % (42,) |
New | '{:4d}'.format(42) |
Output | 42 |
Selain itu, bilangan juga bisa dipotong dengan jumlah desimal tertentu. Kita juga bisa menggabungkan antara pemotongan dengan padding. Untuk bilangan float, nilai padding menunjukkan panjang dari total panjang output.
Pada contoh berikut, kita menginginkan output terdiri dari 6 karakter dengan 2 angka di belakang koma.
Old | '%06.2f' % (3.141592653589793,) |
New | '{:06.2f}'.format(3.141592653589793) |
Output | 003.14 |
Pada integer, menambahkan presisi tidak akan berguna dan tidak dianjurkan pada style formatting yang baru (dapat menyebabkan ValueError
)
Old | '%04d' % (42,) |
New | '{:04d}'.format(42) |
Output | 0042 |
Bilangan Bertanda
Normalnya, bilangan negatif diawali dengan tanda. Tentu saja ini bisa disesuaikan sesuai dengan kebutuhan kita.
Old | '%+d' % (42,) |
New | '{:+d}'.format(42) |
Output | +42 |
Penggunaan tanda spasi dalam format, dan tanda minus diikuti spasi di depan bilangan, digunakan untuk menunjukkan bahwa bilangan tersebut adalah negatif.Sedangkan penggunaan tanda spasi tanpa diikuti tanda apapun, menunjukkan bahwa bilangan tersebut adalah positif. Contohnya adalah seperti berikut.
Old | '% d' % ((- 23),) |
New | '{: d}'.format((- 23)) |
Output | -23 |
Old | '% d' % (42,) |
New | '{: d}'.format(42) |
Output | 42 |
Style formatting yang baru juga bisa mengatur posisi dari tanda relatif terhadap padding.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:=5d}'.format((- 23)) |
Output | - 23 |
New | '{:=+5d}'.format(23) |
Output | + 23 |
Placeholder Bernama
Baik style formatting yang lama maupun yang baru, keduanya mendukung penampung (placeholder) bernama.
Setup
data = {'firts': 'Hello', 'last': 'Hello!'}
Old | '%(first)s %(last)s' % data |
New | '{first} {last}'.format(**data) |
Output | Hello Hello! |
Metode format()
juga menerima argumen kata kunci.
Operasi berikut tidak tersedia pada style formatting lama
New | '{first} {last}'.format(first='Hello', last='Hello!') |
Output | Hello Hello! |
Getitem dan Getattr
Style formatting yang baru memberikan fleksibilitas untuk mengakses struktur data bercabang. Style ini mendukung pengaksesan dictionary maupun list.
Operasi berikut tidak tersedia pada style formatting lama
Setup
person = {'firts': 'Budi', 'last': 'Santoso'}
New | '{p[first]} {p[last]}'.format(p=person) |
Output | Budi Santoso |
Setup
data = [4, 8, 15, 17, 20, 45]
New | '{d[4]} {d[5]}'.format(d=data) |
Output | 20 45 |
Kita juga bisa mengakses objek via getattr()
Operasi berikut tidak tersedia pada style formatting lama
Setup
class Plant(object): type = 'tree'
New | '{p.type}'.format(p=Plant()) |
Output | tree |
Operasi berikut tidak tersedia pada style formatting lama
Setup
class Plant(object): type = 'tree' kinds = [{'name': 'mahoni'}, {'name': 'apel'}]
New | '{p.type}: {p.kinds[0][name]}'.format(p=Plant()) |
Output | tree: mahoni |
Datetime
Style formatting yang baru juga bisa digunakan untuk memformat objek seperti datetime
. Datetime ini adalah objek Python yang berhubungan dengan waktu dan tanggal.
Operasi berikut tidak tersedia pada style formatting lama
Setup
from datetime import datetime
New | '{:%Y-%m-%d %H:%M}'.format(datetime(2017, 8, 3, 4, 5)) |
Output | 2017-08-03 04:05 |
Format Berparameter
Kita juga bisa memasukkan spesifikasi format yang kita inginkan di dalam metode format()
. Format berparameter di letakkan di dalam tanda kurung kurawal setelah tanda titik dua.
Style lama juga mendukung parameterisasi, tapi terbatas hanya untuk mengatur lebar dan presisi dari output.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:{align}{width}}'.format('test', align='^', width='10') |
Output | test |
- Menggunakan parameter presisi
Old | '%.*s = %.*f' % (3, 'Eksponen', 3, 2.7182) |
New | '{:.{prec}} = {:.{prec}f}'.format('Eksponen', 2.7182, prec=3) |
Output | Eks = 2.718 |
- Menggunakan parameter lebar dan presisi
Old | '%*.*f' % (5, '2', 2.7182) |
New | '{:.{width}.{prec}f}'.format(2.7182, width=5, prec=3) |
Output | = 2.72 |
Format bersarang bisa digunakan untuk menggantikan sembarang bagian dari spesifikasi format. Oleh karena itu, contoh di atas bisa ditulis ulang dengan cara berikut:
Operasi berikut tidak tersedia pada style formatting lama
New | '{:{prec}} = {:{prec}}'.format('Eksponen', 2.7182, prec='.3') |
Output | Eks = 2.72 |
Komponen – komponen datetime juga bisa ditulis terpisah.
Operasi berikut tidak tersedia pada style formatting lama
Setup
from datetime import datetime dt = datetime(2017, 8, 3, 4, 5)
New | '{:{dfmt} {tfmt}}'.format(dt, dfmt='%Y-%m-%d', tfmt='%H:%M') |
Output | 2017-08-03 04:05 |
Format bersarang bisa digunakan sebagai argumen posisi. Posisi tergantung pada urutan dari tanda kurung kurawal.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:{}{}{}.{}}'.format(2.7182818284, '>', '+', 10, 3) |
Output | +2.72 |
Argumen kata kunci juga bisa dicampur ke dalam format
New | '{:{}{sign}{}.{}}'.format(2.7182818284, '>', 10, 3, sign='+') |
Output | +2.72 |
Objek Kustomasi
Contoh di atas yang menggunakan metode magic __format__()
pada objek di Python. Kita bisa mendefinisikan sendiri format untuk menangani objek yang kita buat untuk menangani metode __format__()
ini. Dengan begitu, kita bisa mengatur sintaks yang digunakan.
Setup
class HAL9000(object): def __format__(self, format): if (format == 'open-the-pod-bay-doors'): return "I'm afraid I can't do that." return 'HAL9000'
New | '{:open-the-pod-bay-doors}'.format(HAL9000()) |
Output | I'm afraid I can't do that. |
Source: pyformat.info