Số hiển thị với số không hàng đầu


910

Được:

a = 1
b = 10
c = 100

Làm cách nào để hiển thị số 0 đứng đầu cho tất cả các số có ít hơn hai chữ số?

Đây là đầu ra mà tôi mong đợi:

01
10
100

Câu trả lời:


1059

Trong Python 2 (và Python 3) bạn có thể làm:

print "%02d" % (1,)

Về cơ bản % là như printfhoặc sprintf(xem tài liệu ).


Đối với Python 3. +, hành vi tương tự cũng có thể đạt được với format:

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

Đối với Python 3.6+, hành vi tương tự có thể đạt được với chuỗi f :

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

8
Ví dụ: in "% 05d"% result ['PostalCode'] cho mã bưu chính gồm 5 chữ số.
Nick Woodhams

2
x = "%02d.txt" % ităng TypeError (không thể ghép các đối tượng 'str' và 'int'), nhưng x = "%02d.txt" % (i,)không. Hấp dẫn. Tôi tự hỏi tài liệu đó ở đâu
theta

@theta Trong 2.7.6, tôi không gặp lỗi. Có lẽ đây là một lỗi trong một phiên bản Python cụ thể mà họ đã sửa?
Jack M.

1
Có lẽ. Trong 2.7.6, không có ngoại lệ nếu giá trị định dạng không tuple (ít nhất là cho ví dụ này). Nhìn vào ngày nhận xét của tôi, tôi đoán rằng tôi đã chạy 2.7.3 trở lại, và tại thời điểm đó tôi không biết rằng việc đặt một biến duy nhất trong một tuple sẽ giúp bạn an toàn trong khi sử dụng công cụ định dạng %chuỗi.
theta

1
Để giải thích, các tài liệu giải thích điều này ở đây: "Khi không có căn chỉnh rõ ràng nào được đưa ra, trước trường độ rộng bằng ký tự zero ('0') cho phép đệm không nhận biết ký hiệu cho các loại số. Điều này tương đương với ký tự điền của ' 0 'với loại căn chỉnh là' = '. "
JHS

940

Bạn có thể sử dụng str.zfill:

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

in:

01
10
100

71
Tôi thích giải pháp này, vì nó không chỉ giúp khi xuất số, mà khi bạn cần gán nó cho một biến ... ví dụ: x = str (datetime.date.today (). Tháng) .zfill (2) sẽ trả về x là '02' cho tháng của feb.
EroSan

2
Đây phải là câu trả lời đúng, vì "{1:02d}"không thể có các biến thay thế 2(như nếu bạn đang tạo một hàm động).
Joshua Varghese

363

Trong Python 2.6+ và 3.0+, bạn sẽ sử dụng format()phương thức chuỗi:

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

hoặc sử dụng tích hợp (cho một số duy nhất):

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

Xem tài liệu PEP-3101 để biết các chức năng định dạng mới.


29
Hoạt động trong Python 2.7.5 là tốt. Bạn cũng có thể sử dụng định dạng '{: 02d}'. (1) nếu bạn không muốn sử dụng các đối số được đặt tên.
Jason Martens

1
Hoạt động tốt trong 2.7.2, với định dạng dấu phẩy động "{0: 04.0f}". . Tôi biết về định dạng% nhưng muốn sửa đổi một câu lệnh .format hiện có mà không cần viết lại toàn bộ . Cảm ơn!
Michael Promotionson

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

in:

01
10
100

1
Cách này cho phép bạn lặp lại đối số nhiều lần trong chuỗi:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex

2
Chỉ tương thích với Python 3. Nếu sử dụng Python 2.7, hãy làmprint '{:02}'.format(1)
Blairg23


73

Trong Python> = 3.6 , bạn có thể thực hiện việc này một cách cô đọng với chuỗi f mới được giới thiệu bằng cách sử dụng:

f'{val:02}'

trong đó in biến với tên valvới một fillgiá trị 0widthcủa2 .

Ví dụ cụ thể của bạn, bạn có thể làm điều này độc đáo trong một vòng lặp:

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

bản in nào:

01 
10
100

Để biết thêm thông tin về chuỗi f, hãy xem PEP 498 nơi chúng được giới thiệu.


56
x = [1, 10, 100]
for i in x:
    print '%02d' % i

kết quả trong:

01
10
100

Đọc thêm thông tin về định dạng chuỗi bằng% trong tài liệu.


9
Các ví dụ tài liệu hút. Họ đưa ra ánh xạ với mẫu số 0 hàng đầu, vì vậy thật khó để biết đó là mẫu nào trừ khi bạn đã biết nó hoạt động như thế nào. Đó là những gì đã đưa tôi đến đây, thực sự.
Cấp

49

Cách Pythonic để làm điều này:

str(number).rjust(string_width, fill_char)

Bằng cách này, chuỗi gốc được trả về không thay đổi nếu độ dài của nó lớn hơn chuỗi_ thong. Thí dụ:

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

Các kết quả:

01
10
100

33

Hoặc một giải pháp khác.

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

3
Đây sẽ là cách của Python, mặc dù tôi sẽ bao gồm tham số cho rõ ràng - "{0:0>2}".format(number), nếu ai đó muốn nLeadZeros họ nên lưu ý họ cũng có thể làm:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan


4

Đây là cách tôi làm điều đó:

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

Về cơ bản, zfill lấy số lượng số 0 hàng đầu bạn muốn thêm, vì vậy thật dễ dàng để lấy số lớn nhất, biến nó thành một chuỗi và lấy độ dài, như thế này:

Python 3.6.5 (mặc định, ngày 11 tháng 5 năm 2018, 04:00:52) 
[GCC 8.1.0] trên linux
Nhập "trợ giúp", "bản quyền", "tín dụng" hoặc "giấy phép" để biết thêm thông tin.
>>> tổng = 100
>>> in (str (1) .zfill (len (str (tổng))))
001
>>> tổng = 1000
>>> in (str (1) .zfill (len (str (tổng))))
0001
>>> tổng = 10000
>>> in (str (1) .zfill (len (str (tổng))))
00001
>>> 

Điều này có mâu thuẫn với câu trả lời của Datageek không?
Peter Mortensen

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

1

Bạn có thể làm điều này với chuỗi f .

import numpy as np

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

Điều này sẽ in chiều dài không đổi 8, và phần còn lại với hàng đầu 0.

00000001
00000124
00013566

0

Sử dụng:

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

Hoặc với mathmô-đun:

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


-2

Nếu xử lý các số có một hoặc hai chữ số:

'0'+str(number)[-2:] hoặc là '0{0}'.format(number)[-2:]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.