แสดงหมายเลขด้วยเลขศูนย์นำหน้า


910

ได้รับ:

a = 1
b = 10
c = 100

ฉันจะแสดงศูนย์นำหน้าสำหรับตัวเลขทั้งหมดที่มีตัวเลขน้อยกว่าสองหลักได้อย่างไร

นี่คือผลลัพธ์ที่ฉันคาดหวัง:

01
10
100

คำตอบ:


1059

ใน Python 2 (และ Python 3) คุณสามารถทำได้:

print "%02d" % (1,)

โดยทั่วไปแล้ว%จะคล้ายprintfหรือsprintf(ดูเอกสาร )


สำหรับ Python 3 + สามารถใช้การทำงานแบบเดียวกันกับformat:

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

สำหรับ Python 3.6+ สามารถใช้พฤติกรรมเดียวกันได้ด้วยf-strings :

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

8
ตัวอย่าง: พิมพ์ "% 05d"% ผลลัพธ์ ['PostalCode'] สำหรับรหัสไปรษณีย์ 5 หลัก
Nick Woodhams

2
x = "%02d.txt" % iยก TypeError (ไม่สามารถเชื่อมต่อวัตถุ 'str' และ 'int') แต่x = "%02d.txt" % (i,)ไม่ได้ น่าสนใจ ฉันสงสัยว่าเอกสารนั้นอยู่ที่ไหน
theta

@theta ใน 2.7.6 ฉันไม่ได้รับข้อผิดพลาด บางทีนี่อาจเป็นข้อผิดพลาดใน Python รุ่นใดรุ่นหนึ่งที่พวกเขาได้แก้ไขแล้ว?
Jack M.

1
อาจจะ. ใน 2.7.6 จะไม่มีข้อยกเว้นหากค่ารูปแบบไม่ใช่สิ่งอันดับ (อย่างน้อยสำหรับตัวอย่างนี้) ดูวันที่ความคิดเห็นของฉันฉันเดาว่าฉันกำลังรัน 2.7.3 แล้วและในเวลานั้นฉันไม่รู้ว่าการใส่ตัวแปรเดี่ยวใน tuple ทำให้คุณปลอดภัยในขณะที่ใช้%formater แบบสตริง
theta

1
ในการทำอย่างละเอียดเอกสารอธิบายที่นี่: "เมื่อไม่มีการจัดตำแหน่งที่ชัดเจนนำหน้าฟิลด์ความกว้างด้วยอักขระศูนย์ ('0') เปิดใช้งานการรับรู้ศูนย์ - แพ็ดดิงชนิดเครื่องหมายตัวเลขซึ่งเทียบเท่ากับอักขระเติมของ ' 0 'ที่มีประเภทการจัดตำแหน่ง' '
JHS

940

คุณสามารถใช้str.zfill:

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

พิมพ์:

01
10
100

71
ฉันชอบโซลูชันนี้เนื่องจากช่วยได้ไม่เพียง แต่เมื่อแสดงผลตัวเลข แต่เมื่อคุณจำเป็นต้องกำหนดให้กับตัวแปร ... เช่น x = str (datetime.date.today (). เดือน) .zfill (2) จะกลับมา x เท่ากับ '02' สำหรับเดือน feb
EroSan

2
นี่ควรเป็นคำตอบที่ถูกต้องเนื่องจาก"{1:02d}"ไม่สามารถมีตัวแปรแทนที่2(เช่นถ้าคุณกำลังสร้างฟังก์ชั่นแบบไดนามิก)
Joshua Varghese

363

ใน Python 2.6+ และ 3.0+ คุณจะต้องใช้format()เมธอด string:

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

หรือใช้ในตัว (สำหรับหมายเลขเดียว):

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

ดูเอกสารประกอบPEP-3101สำหรับฟังก์ชั่นการจัดรูปแบบใหม่


29
ทำงานใน Python 2.7.5 เช่นกัน คุณสามารถใช้ '{: 02d}'. format (1) ถ้าคุณไม่ต้องการใช้อาร์กิวเมนต์ที่มีชื่อ
Jason Martens

1
ทำงานได้ดีใน 2.7.2 โดยมีจุดลอยตัว "{0: 04.0f}". รูปแบบ (1.1) ให้ 0001 (: 04 = อย่างน้อย 4 ตัวอักษรในกรณีนี้นำ 0's, .0f = จุดลอยตัวที่ไม่มีทศนิยม) . ฉันรู้% การจัดรูปแบบ แต่อยากจะปรับเปลี่ยนคำสั่ง .format อยู่โดยไม่ต้องเขียนใหม่ทั้งสิ่ง ขอบคุณ!
Michael Stimson

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

พิมพ์:

01
10
100

1
วิธีนี้ให้คุณทำซ้ำอาร์กิวเมนต์หลาย ๆ ครั้งภายในสตริง:One zero:{0:02}, two zeros: {0:03}, ninezeros: {0:010}'.format(6)
srodriguex

2
เข้ากันได้กับ Python 3 เท่านั้นหากใช้ Python 2.7 ให้ทำprint '{:02}'.format(1)
Blairg23


73

ในPython> = 3.6คุณสามารถทำสิ่งนี้ได้อย่างชัดเจนด้วย f-strings ใหม่ที่ถูกแนะนำโดยใช้:

f'{val:02}'

ซึ่งพิมพ์ตัวแปรที่มีชื่อvalที่มีfillค่าของ0และของwidth2

สำหรับตัวอย่างเฉพาะของคุณคุณสามารถทำได้เป็นอย่างดี:

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

ซึ่งพิมพ์:

01 
10
100

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ f-strings ลองดูที่PEP 498ที่มีการนำมาใช้


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

ผลลัพธ์ใน:

01
10
100

อ่านข้อมูลเพิ่มเติมเกี่ยวกับการจัดรูปแบบสตริงโดยใช้%ในเอกสารประกอบ


9
ตัวอย่างเอกสารประกอบ sucks พวกเขาโยนการทำแผนที่ด้วยตัวอย่างที่เป็นศูนย์นำดังนั้นจึงยากที่จะรู้ว่าสิ่งใดเป็นสิ่งที่นอกจากคุณจะรู้แล้วว่ามันทำงานอย่างไร นั่นคือสิ่งที่นำฉันมาที่นี่จริง ๆ แล้ว
แกรนท์

49

วิธี Pythonic การทำเช่นนี้:

str(number).rjust(string_width, fill_char)

วิธีนี้สตริงต้นฉบับจะถูกส่งคืนไม่เปลี่ยนแปลงถ้าความยาวมากกว่า string_width ตัวอย่าง:

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

ผล:

01
10
100

33

หรือทางออกอื่น

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

3
นี่จะเป็นวิธี Python แม้ว่าฉันจะรวมพารามิเตอร์สำหรับความชัดเจน - "{0:0>2}".format(number)ถ้ามีคนต้องการ nLeadingZeros พวกเขาควรทราบว่าพวกเขาสามารถทำได้:"{0:0>{1}}".format(number, nLeadingZeros + 1)
Jonathan Allan


4

นี่คือวิธีที่ฉันทำ:

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

โดยพื้นฐานแล้ว zfill ใช้จำนวนศูนย์นำที่คุณต้องการเพิ่มดังนั้นจึงง่ายที่จะนำจำนวนที่ใหญ่ที่สุดเปลี่ยนเป็นสตริงและได้ความยาวดังนี้:

Python 3.6.5 (ค่าเริ่มต้น 11 พฤษภาคม 2018 04:00:52) 
[GCC 8.1.0] บน linux
พิมพ์ "ความช่วยเหลือ", "ลิขสิทธิ์", "เครดิต" หรือ "ใบอนุญาต" สำหรับข้อมูลเพิ่มเติม
>>> ทั้งหมด = 100
>>> พิมพ์ (str (1) .zfill (len (str (ทั้งหมด))))
001
>>> ทั้งหมด = 1,000
>>> พิมพ์ (str (1) .zfill (len (str (ทั้งหมด))))
0001
>>> ทั้งหมด = 10,000
>>> พิมพ์ (str (1) .zfill (len (str (ทั้งหมด))))
00001
>>> 

สิ่งนี้ขัดแย้งกับคำตอบของ Datageekหรือไม่?
ปีเตอร์มอร์เทนเซ่น


1

คุณสามารถทำเช่นนี้กับสตริงฉ

import numpy as np

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

นี้จะพิมพ์ความยาวคงที่ของ 8 0และแผ่นส่วนที่เหลือกับผู้นำ

00000001
00000124
00013566



-2

หากจัดการกับตัวเลขที่เป็นหนึ่งหรือสองหลัก:

'0'+str(number)[-2:] หรือ '0{0}'.format(number)[-2:]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.