Apa yang dimaksud dengan cara Pythonic untuk mengisi string numerik dengan nol di sebelah kiri, sehingga string numerik memiliki panjang tertentu?
python
string
zero-padding
Nicolas Gervais
sumber
sumber
python >= 2.6
salah. Sintaks itu tidak berfungsipython >= 3
. Anda dapat mengubahnyapython < 3
, tetapi bolehkah saya menyarankan untuk selalu menggunakan tanda kurung dan menghilangkan komentar sama sekali (mendorong penggunaan yang disarankan)?'{:03d} {:03d}'.format(1, 2)
secara implisit memberikan nilai-nilai secara berurutan.print
pernyataan itu, padahal seharusnyaprint
fungsi pada Python 3? Saya mengedit di parens; karena hanya satu hal yang sedang dicetak, ia bekerja secara identik sekarang di Py2 dan Py3.Cukup gunakan metode rjust dari objek string.
Contoh ini akan membuat string sepanjang 10 karakter, padding sesuai kebutuhan.
sumber
Selain itu
zfill
, Anda dapat menggunakan pemformatan string umum:Dokumentasi untuk pemformatan string dan f-string .
sumber
format
sebagai gantinya, dan orang-orang umumnya menafsirkan ini sebagai niat untuk mundur.Untuk Python 3.6+ menggunakan f-string:
Untuk Python 2 hingga Python 3.5:
sumber
jika Anda menginginkan yang sebaliknya:
sumber
str(n).zfill(width)
akan bekerja denganstring
s,int
s,float
s ... dan Python 2. x dan 3. x kompatibel:sumber
Bagi mereka yang datang ke sini untuk mengerti dan bukan hanya jawaban cepat. Saya melakukan ini terutama untuk string waktu:
sumber
str.zfill
secara khusus dimaksudkan untuk melakukan ini:Perhatikan bahwa ini secara khusus dimaksudkan untuk menangani string numerik seperti yang diminta, dan memindahkan a
+
atau-
ke awal string:Inilah bantuan untuk
str.zfill
:Performa
Ini juga yang paling banyak melakukan metode alternatif:
Untuk membandingkan apel dengan apel untuk
%
metode ini (perhatikan bahwa sebenarnya lebih lambat), yang sebaliknya akan melakukan pra-perhitungan:Penerapan
Dengan sedikit penggalian, saya menemukan implementasi
zfill
metode diObjects/stringlib/transmogrify.h
:Mari kita telusuri kode C ini.
Pertama mem-parsing argumen secara posisi, artinya tidak mengizinkan argumen kata kunci:
Itu kemudian memeriksa apakah itu panjang yang sama atau lebih lama, dalam hal ini mengembalikan string.
zfill
panggilanpad
(inipad
fungsi disebut juga denganljust
,rjust
, dancenter
juga). Ini pada dasarnya menyalin konten ke string baru dan mengisi padding.Setelah memanggil
pad
,zfill
pindahkan semua yang awalnya sebelum+
atau-
ke awal string.Perhatikan bahwa untuk string asli menjadi numerik tidak diperlukan:
sumber
+
dan-
, dan saya menambahkan tautan ke dokumen!Lihat dokumentasi cetak untuk semua detail menarik!
Pembaruan untuk Python 3.x (7,5 tahun kemudian)
Baris terakhir itu sekarang adalah:
Yaitu
print()
sekarang fungsi, bukan pernyataan. Perhatikan bahwa saya masih lebih sukaprintf()
gaya Sekolah Lama karena, IMNSHO, bunyinya lebih baik, dan karena, um, saya telah menggunakan notasi itu sejak Januari 1980. Sesuatu ... anjing-anjing tua ... sesuatu yang ... trik-trik baru.sumber
"%0*d" % (width, x)
ditafsirkan oleh python?Saat menggunakan Python
>= 3.6
, cara terbersih adalah menggunakan f-string dengan pemformatan string :Saya lebih suka memformat dengan
int
, karena hanya saat itu tanda ditangani dengan benar:sumber
Untuk kode pos disimpan sebagai bilangan bulat:
sumber
Perbandingan waktu cepat:
Saya telah membuat berbagai tes pengulangan yang berbeda. Perbedaannya tidak besar, tetapi dalam semua tes,
zfill
solusinya paling cepat.sumber
Pendekatan lain adalah dengan menggunakan pemahaman daftar dengan kondisi memeriksa panjang. Di bawah ini adalah demonstrasi:
sumber
Ok juga:
jadi output akan menjadi: "02:07:03"
sumber
Anda juga bisa mengulangi "0", tambahkan dulu
str(n)
dan dapatkan irisan lebar paling kanan. Ekspresi kecil yang cepat dan kotor.sumber