ฉันจะส่งออกศูนย์นำหน้าในรูบีได้อย่างไร


238

ฉันกำลังส่งชุดไฟล์ที่มีหมายเลขจากสคริปต์ Ruby ตัวเลขมาจากการเพิ่มตัวนับ แต่เพื่อให้เรียงลำดับได้ดีในสารบบฉันต้องการใช้เลขศูนย์นำหน้าในชื่อไฟล์ ในคำอื่น ๆ

file_001 ...

แทน

file_1

มีวิธีง่าย ๆในการเพิ่มศูนย์นำหน้าเมื่อแปลงตัวเลขเป็นสตริงหรือไม่? (ฉันรู้ว่าฉันสามารถทำ "ถ้าน้อยกว่า 10 .... ถ้าน้อยกว่า 100")

คำตอบ:


281

หากทราบจำนวนหลักสูงสุดในตัวนับ (เช่น n = 3 สำหรับตัวนับ 1..876) คุณสามารถทำได้

str = "file_" + i.to_s.rjust(n, "0")

8
Heh heh ไม่ใช่คำตอบที่ดีที่สุด แต่ฉันไม่รู้เรื่อง rjust และฉันใช้ทับทิมมาหลายปี ไชโย!
pauliephonic

ต้องโหวตสิ่งนี้เพราะดูเหมือนว่าแผ่น% 03s พร้อมช่องว่างด้วยเหตุผลแปลก ๆ (% 03d ดูเหมือนจะทำงานได้ดี) ฉันจะได้สาบาน C เบาะด้วยศูนย์ทั้งสองกรณี
Nerdmaster

ในที่สุดก็เปลี่ยนสิ่งนี้เป็นคำตอบที่ยอมรับได้เพราะมันเป็นวิธีที่ง่ายที่สุดและง่ายที่สุดในการจดจำ %ทำงานได้ แต่มีวัตถุประสงค์ทั่วไปมากกว่า
Nathan Long

ไม่คาดคิด แต่ง่ายที่สุด
akostadinov

1
มาที่นี่สำหรับวิธีการรองหมายเลข 36 ฐาน สิ่งนี้ใช้ได้ผลในขณะที่% ดูเหมือนว่าจะไม่เป็นเช่นนั้น ขอบคุณ!
อีธานคามินสกี

344

ใช้%โอเปอเรเตอร์กับสตริง:

irb(main):001:0> "%03d" % 5
=> "005"

ด้านซ้ายเป็นสตริงรูปแบบ printf และทางด้านขวาอาจเป็นรายการค่าดังนั้นคุณสามารถทำสิ่งต่าง ๆ เช่น:

irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23]
=> "dirname/filename.0023.txt"

นี่คือแผ่นโกงรูปแบบ printf ที่คุณอาจพบว่ามีประโยชน์ในการขึ้นรูปสตริงของคุณ รูปแบบ printf นั้นมาจากCฟังก์ชั่นprintfแต่ฟังก์ชั่นการจัดรูปแบบที่คล้ายกันมีให้ใน perl, ruby, python, java, php และอื่น ๆ


1
ที่ดี! ดังนั้น "% s" หมายถึง "แทนที่ค่า Nth ที่นี่" และ "% 03d" หมายถึง "แทนที่ตัวเลขที่นี่โดยเพิ่มเลขศูนย์มากเท่าที่จำเป็นเพื่อให้เป็นตัวเลข 3 หลัก?" (ฉันเดาว่า d หมายถึง "ตัวเลข") ฉันเห็นเอกสารเกี่ยวกับเรื่องนี้ในขณะนี้ ( ruby-doc.org/core/classes/String.html#M000770 ) แต่มันกระชับและฉันต้องการรายละเอียดเพิ่มเติมเล็กน้อย .
นาธานลอง

1
ฉันเพิ่มลิงค์ไปยังแผ่นโกงรูปแบบ printf "s" หมายถึง "สตริง", "d" หมายถึง "ตัวเลขทศนิยม" "03" หมายถึง "pad ถึง 3 ตัวอักษรที่มีศูนย์"; "% 3d" จะเหยียบด้านซ้ายด้วยช่องว่าง
Daniel Martin

2
BTW - นี่คือการโทรที่เหมือนกันKernel#sprintfซึ่งมีเอกสารไว้ที่นี่: ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
Nathan Long

เพิ่มความคิดเห็น @ NathanLong sprintf("%03d", 5)ของตัวอย่างแรกในคำตอบนี้จะได้รับการเขียนเป็น
Dennis

นี่ควรเป็นคำตอบที่เลือก
Dan Barron

50

คุณไม่สามารถใช้การจัดรูปแบบสตริงของค่าก่อนที่คุณจะต่อท้ายชื่อไฟล์?

"%03d" % number

ฉันคิดว่าคำตอบนี้ไม่ได้เพิ่มอะไรกับคำตอบของ
@Daniel

3
เขาตอบในนาทีเดียวกับ Daniel Martin ดังนั้นอาจจะไม่รู้ถึงความซ้ำซ้อน
Kurt Peek

นี่เหมาะสำหรับ utc_offset
Abel

30

ใช้String#nextเป็นเคาน์เตอร์

>> n = "000"
>> 3.times { puts "file_#{n.next!}" }
file_001
file_002
file_003

next ค่อนข้าง 'ฉลาด' หมายถึงคุณสามารถไปได้

>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003

ขอบคุณที่ชี้นำสิ่งนี้ นี่เป็นวิธีที่ยอดเยี่ยม
Weston Ganger

9

ตามที่ระบุไว้โดยคำตอบอื่น ๆ"%03d" % numberทำงานได้ดี แต่มันไปกับคู่มือ rubocop ruby style :

ใช้ประโยชน์จาก sprintf และรูปแบบนามแฝงเหนือเมธอด String #% ที่ค่อนข้างเป็นความลับ

เราสามารถได้ผลลัพธ์เดียวกันในวิธีที่อ่านง่ายขึ้นโดยใช้สิ่งต่อไปนี้:

format('%03d', number)

1
formatถ้าเป้าหมายของคุณคือการเรียนรู้คุณลักษณะภาษาทับทิมปิดบังแล้วใช้นามแฝง หากเป้าหมายของคุณคือทำให้โค้ดของคุณเข้าใจง่ายคุณควรใช้sprintfเพราะเป็นส่วนหนึ่งของ C-library มาตรฐาน ชื่อนี้ใช้ข้ามภาษาการเขียนโปรแกรม วิธีที่ผู้คนมากขึ้นเข้าใจสิ่งที่sprintfไม่เมื่อเทียบกับจำนวนที่รู้ว่าformatเป็นนามแฝงสำหรับมัน เพียงเพราะสิ่งที่เป็นส่วนหนึ่งของ RuboCop ไม่ได้ทำให้มันถูกหรือผิดโดยเนื้อแท้ เลือกกฎที่เหมาะสมที่สุดสำหรับโครงการของคุณ '%03d' % numberอ่านง่ายยิ่งขึ้น
Tilo

1
ฉันผ่านการวนซ้ำเดียวกันนี้เปลี่ยน"%02d" % numไปsprintf(...)เป็นformat(...)ตามคำแนะนำของ RuboCop ฉันตัดสินใจแล้วว่าsprintfมันเป็นแบบดั้งเดิมมากกว่าformatrubocop.yml ที่อัปเดตแล้วด้วยStyle/FormatString: EnforcedStyle: sprintfและตอนนี้ฉันนอนหลับสนิทในเวลากลางคืน
David Hempy

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