ศูนย์ชั้นนำในราง


152

ฉันมีเขตข้อมูลhrและminจำนวนเต็มทั้งสองในใบสมัครของฉัน สำหรับhrฟิลด์หากผู้ใช้ป้อน "1" ฉันต้องการให้ Rails pad อัตโนมัติเป็น "01" ก่อนที่จะบันทึกลงในฐานข้อมูล นอกจากนี้สำหรับminฟิลด์หากผู้ใช้ป้อน "0" ควรใส่เป็น "00"

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


336

มันจะเป็นการดีกว่าถ้าคุณเก็บมันไว้เป็นจำนวนเต็มและแสดงมันตามที่คุณอธิบายไว้ในขณะใช้งานจริง ทุกภาษามีวิธีการของตัวเองเพื่อศูนย์แผ่น - สำหรับ Ruby คุณสามารถใช้String # rjust เมธอดนี้วางสตริง (ชิดขวา) เพื่อให้กลายเป็นความยาวที่กำหนดโดยใช้อักขระ padding ที่กำหนด

str.rjust(integer, padstr=' ') → new_str

หากintegerมีค่ามากกว่าความยาวของstrผลตอบแทนใหม่Stringของความยาวintegerที่มีstrสิทธิธรรมและเบาะกับpadstr; strมิฉะนั้นผลตอบแทน

some_int = 5
some_int.to_s.rjust(2, '0')  # => '05'
some_int.to_s.rjust(5, '0')  # => '00005'

another_int = 150
another_int.to_s.rjust(2, '0') # => '150'
another_int.to_s.rjust(3, '0') # => '150'
another_int.to_s.rjust(5, '0') # => '00150'


20

มันมีประโยชน์มากทีเดียว:

"%.2d" % integer

สตริงผลลัพธ์จะมีอักขระ 2 ตัวและถ้าตัวเลขน้อยกว่า 2 ตัวอักษร 0s จะปรากฏในสตริง


8

คุณไม่สามารถจัดเก็บ01เป็นจำนวนเต็ม มันจะถูกแปลงเป็น1

คุณสามารถเก็บเป็นสตริงหรือคุณสามารถแสดงเป็นสตริง "01"


4
เก็บไว้เป็นจำนวนเต็มและแสดงเป็นสตริง (เบาะด้วย 0) จะเป็นคำแนะนำของฉัน Java StringUtils ของ Apache มีวิธีแพดที่ดีเช่นนั้น พบกระทู้นี้ในการขยาย: ruby-forum.com/topic/82137
McStretch

6

ฉันชอบโอเปอเรเตอร์% แม้ว่าดูเหมือนว่าจะไม่ถูกใจ ...

2.0.0-p247 :001 > '%02i' % 1
 => "01"
2.0.0-p247 :002 > '%2i' % 1
 => " 1"
2.0.0-p247 :003 > '%-2i' % 1
 => "1 "

3

อีกวิธีหนึ่งในการบรรลุเป้าหมายนี้คือการวางจำนวนเต็ม ณ เวลาที่แสดงโดยใช้ sprintf:

f = sprintf '%04d', 49
# f = "0049"

-5

ลองสิ่งนี้และคุณสามารถเปลี่ยนพวกมันให้ตรงกัน

def numeric92(num)
  if num.present?
    if num < 0 && num > -1
      ('-%05d' % num) + '.' + ('%.2f' % num).split('.').last
    else
      ('%06d' % num) + '.' + ('%.2f' % num).split('.').last
    end
  else
    '000000.00'
  end
end

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