Tampilkan nomor dengan nol di depan


911

Diberikan:

a = 1
b = 10
c = 100

Bagaimana cara menampilkan nol di depan untuk semua angka dengan kurang dari dua digit?

Ini adalah output yang saya harapkan:

01
10
100

Jawaban:


1060

Dengan Python 2 (dan Python 3) Anda dapat melakukan:

print "%02d" % (1,)

Pada dasarnya % seperti printfatau sprintf(lihat dokumen ).


Untuk Python 3. +, perilaku yang sama juga dapat dicapai dengan format:

print("{:02d}".format(1))

Untuk Python 3.6+ perilaku yang sama dapat dicapai dengan f-string :

print(f"{1:02d}")

8
Contoh: cetak "% 05d"% hasil ['kode pos'] untuk kode pos 5 digit.
Nick Woodhams

2
x = "%02d.txt" % imemunculkan TypeError (tidak dapat menggabungkan objek 'str' dan 'int'), tetapi x = "%02d.txt" % (i,)tidak. Menarik. Saya ingin tahu di mana itu didokumentasikan
theta

@ theta Dalam 2.7.6, saya tidak mendapatkan kesalahan. Mungkin ini adalah bug dalam versi Python tertentu yang sejak itu telah mereka perbaiki?
Jack M.

1
Mungkin. Dalam 2.7.6 tidak ada pengecualian jika nilai format tidak tuple (setidaknya untuk contoh ini). Melihat tanggal komentar saya, saya kira saya menjalankan 2.7.3 saat itu, dan pada saat itu saya tidak tahu bahwa menempatkan variabel tunggal dalam tuple membuat Anda berada di sisi yang aman saat menggunakan %string formater.
theta

1
Untuk menguraikan, dokumen menjelaskan ini di sini: "Ketika tidak ada penyejajaran yang diberikan secara eksplisit, mendahului bidang lebar dengan karakter nol ('0') memungkinkan tanda-padding nol untuk tipe numerik. Ini sama dengan karakter isian dari ' 0 'dengan jenis pelurusan' = '. "
JHS

940

Anda bisa menggunakan str.zfill:

print(str(1).zfill(2))
print(str(10).zfill(2))
print(str(100).zfill(2))

cetakan:

01
10
100

71
Saya suka solusi ini, karena ini membantu tidak hanya ketika mengeluarkan nomor, tetapi ketika Anda perlu menetapkannya ke variabel ... misalnya x = str (datetime.date.today (). Bulan) .zfill (2) akan kembali x sebagai '02' untuk bulan Februari.
EroSan

2
Ini harus menjadi jawaban yang benar, karena "{1:02d}"tidak dapat memiliki variabel di tempat 2(seperti jika Anda membuat fungsi dinamis).
Joshua Varghese

363

Di Python 2.6+ dan 3.0+, Anda akan menggunakan format()metode string:

for i in (1, 10, 100):
    print('{num:02d}'.format(num=i))

atau menggunakan built-in (untuk satu nomor):

print(format(i, '02d'))

Lihat dokumentasi PEP-3101 untuk fungsi pemformatan baru.


29
Berfungsi di Python 2.7.5 juga. Anda juga dapat menggunakan format '{: 02d}' (1) jika Anda tidak ingin menggunakan argumen bernama.
Jason Martens

1
Bekerja dengan baik di 2.7.2, dengan floating point "{0: 04.0f}". Format (1.1) menghasilkan 0001 (: 04 = setidaknya 4 karakter, dalam hal ini memimpin 0's, .0f = floating point tanpa desimal) . Saya menyadari% format tetapi ingin memodifikasi pernyataan .format yang ada tanpa menulis ulang seluruh hal. Terima kasih!
Michael Stimson

129
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

cetakan:

01
10
100

1
Dengan cara ini Anda dapat mengulangi argumen beberapa kali dalam string:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex

2
Hanya kompatibel dengan Python 3. Jika menggunakan Python 2.7, lakukanprint '{:02}'.format(1)
Blairg23

89

Atau ini:

print '{0:02d}'.format(1)


73

Dalam Python> = 3.6 , Anda dapat melakukan ini secara ringkas dengan f-string baru yang diperkenalkan dengan menggunakan:

f'{val:02}'

yang mencetak variabel dengan nama valdengan fillnilai 0dan widthdari2 .

Untuk contoh spesifik Anda, Anda dapat melakukannya dengan baik dalam satu lingkaran:

a, b, c = 1, 10, 100
for val in [a, b, c]:
    print(f'{val:02}')

yang mencetak:

01 
10
100

Untuk informasi lebih lanjut tentang f-string, lihat PEP 498 di mana mereka diperkenalkan.



49

Cara Pythonic untuk melakukan ini:

str(number).rjust(string_width, fill_char)

Dengan cara ini, string asli dikembalikan tidak berubah jika panjangnya lebih besar dari string_width. Contoh:

a = [1, 10, 100]
for num in a:
    print str(num).rjust(2, '0')

Hasil:

01
10
100

33

Atau solusi lain.

"{:0>2}".format(number)

3
Ini akan menjadi cara Python, meskipun saya akan memasukkan parameter untuk kejelasan - "{0:0>2}".format(number), jika seseorang ingin nLeadingZeros mereka harus mencatat mereka juga dapat melakukannya:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan


4

Beginilah cara saya melakukannya:

str(1).zfill(len(str(total)))

Pada dasarnya zfill mengambil jumlah nol terkemuka yang ingin Anda tambahkan, jadi mudah untuk mengambil angka terbesar, mengubahnya menjadi string dan mendapatkan panjangnya, seperti ini:

Python 3.6.5 (default, 11 Mei 2018, 04:00:52) 
[GCC 8.1.0] di linux
Ketik "bantuan", "hak cipta", "kredit" atau "lisensi" untuk informasi lebih lanjut.
>>> total = 100
>>> cetak (str (1) .zfill (len (str (total))))
001
>>> total = 1000
>>> cetak (str (1) .zfill (len (str (total))))
0001
>>> total = 10.000
>>> cetak (str (1) .zfill (len (str (total))))
00001
>>> 

Bukankah ini bertentangan dengan jawaban Datageek ?
Peter Mortensen

1
width = 5
num = 3
formatted = (width - len(str(num))) * "0" + str(num)
print formatted

1

Anda dapat melakukan ini dengan f string .

import numpy as np

print(f'{np.random.choice([1, 124, 13566]):0>8}')

Ini akan mencetak panjang konstan 8, dan menempelkan sisanya dengan memimpin 0.

00000001
00000124
00013566

0

Menggunakan:

'00'[len(str(i)):] + str(i)

Atau dengan mathmodul:

import math
'00'[math.ceil(math.log(i, 10)):] + str(i)


-2

Jika berhadapan dengan angka yang satu atau dua digit:

'0'+str(number)[-2:] atau '0{0}'.format(number)[-2:]

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.