Ruby on Rails: คุณจะเพิ่มเลขศูนย์หน้าตัวเลขได้อย่างไรถ้ามันต่ำกว่า 10?


110

ฉันต้องการแปลงตัวเลขหลักเดียวเป็นตัวเลขสองหลักดังนี้:

9 ==> 09
5 ==> 05
12 == 12
4 ==> 04

ฉันคิดว่าฉันสามารถใส่คำสั่ง if-else จำนวนหนึ่ง (ถ้าตัวเลขต่ำกว่า 10 ให้ทำ gsub) แต่รูปที่เขียนโค้ดแย่มาก ฉันรู้ว่า Rails มี number_with_precision แต่ฉันเห็นว่ามันใช้กับเลขฐานสิบเท่านั้น มีแนวคิดเกี่ยวกับวิธีการแปลงตัวเลขหลักเดียวเป็นสองหลักหรือไม่?

คำตอบ:


142

คุณหมายถึงsprintf '%02d', n?

irb(main):003:0> sprintf '%02d', 1
=> "01"
irb(main):004:0> sprintf '%02d', 10
=> "10"

คุณอาจต้องการอ้างอิงตารางรูปแบบสำหรับsprintfในอนาคต แต่สำหรับตัวอย่างนี้'%02d'หมายถึงการพิมพ์จำนวนเต็ม ( d) โดยใช้อักขระอย่างน้อย 2 ตัว ( 2) และเว้นวรรคด้านซ้ายด้วยศูนย์แทนช่องว่าง ( 0)


ขอบคุณมาร์ค !! สมบูรณ์แบบ =) ขอบคุณ!
sjsc

คุณอาจจะใช้%02iสำหรับกรณีนี้มันเป็นที่ชัดเจนมากขึ้นว่าการส่งออกและควรจะเป็นจำนวนเต็ม d sprintfง่ายน้อยลงสำหรับคนที่ไม่ได้เป็นคุ้นเคยกับการใช้
SeanJA

คุณสามารถทำได้'%02d'%1โดยไม่ต้อง
Qiushi Huang

194

ผู้คนจำนวนมากใช้sprintf(ซึ่งเป็นสิ่งที่ถูกต้องที่จะทำ) และฉันคิดว่าถ้าคุณต้องการทำสิ่งนี้กับสตริงควรคำนึงถึงrjustและljustวิธีการ:

"4".rjust(2, '0')

นี้จะทำให้"4"สิทธิธรรมโดยมั่นใจว่ามันเป็นอย่างน้อยตัวอักษรและแผ่นด้วย2 ตรงกันข้าม'0'ljust


2
จะดีกว่า sprintf หากคุณต้องการอนุญาตสตริง ไม่เช่นนั้นฉันจะใช้ sprintf เนื่องจากจะมีข้อยกเว้น (ตามที่ควร) หากฉันใช้สตริงโดยไม่ได้ตั้งใจ
Velizar Hristov

หากคุณรู้ว่าคุณเริ่มต้นด้วยการแสดงตัวเลขเป็นสตริงฉันชอบสิ่งนี้ดีกว่า sprintf สำหรับประสิทธิภาพ การใช้rjustเพื่อหลีกเลี่ยงค่าใช้จ่ายในการแยกวิเคราะห์สตริงรูปแบบของ sprintf การแปลงสตริงเป็นตัวเลขและการแปลงตัวเลขนั้นกลับเป็นสตริง นอกจากนี้ยังเป็นเรื่องง่ายสำหรับมนุษย์ที่จะเข้าใจว่าโค้ดกำลังพยายามทำอะไรได้อย่างรวดเร็ว
David Hempy


8

ลองสิ่งนี้ควรใช้งานได้:

abc= 5
puts "%.2i" %abc   >> 05


abc= 5.0
puts "%.2f" %abc   >> 5.00

ยอดเยี่ยมตรงกับสิ่งที่ฉันกำลังมองหา มีเอกสารใดบ้างหรือคุณมาเรียนรู้เกี่ยวกับเรื่องนี้ได้อย่างไร
RajG

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