số không hàng đầu trong đường ray


152

Tôi có các trường hrmin, cả hai số nguyên trong ứng dụng của tôi. Đối với hrtrường, nếu người dùng nhập "1", tôi muốn Rails tự động đệm nó thành "01" trước khi lưu nó vào cơ sở dữ liệu. Ngoài ra đối với mintrường nếu người dùng nhập "0" thì nên đặt thành "00".

Tôi có thể làm cái này như thế nào?

Câu trả lời:


336

Sẽ tốt hơn nếu lưu trữ nó dưới dạng một số nguyên và chỉ hiển thị nó như bạn mô tả trong thời gian chạy. Mỗi ngôn ngữ có cách riêng để đệm số không - đối với Ruby, bạn có thể sử dụng Chuỗi # rjust . Phương thức này đệm một chuỗi (được chứng minh đúng) để nó trở thành một độ dài nhất định, sử dụng một ký tự đệm cho trước.

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

Nếu integerlớn hơn chiều dài str, trả về một Stringchiều dài mới integervới strquyền được chứng minh và được đệm bằng padstr; nếu không, trả lại 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

Điều này cũng khá tiện dụng:

"%.2d" % integer

Chuỗi kết quả sẽ có 2 ký tự và nếu số lượng ít hơn 2 ký tự thì 0 sẽ xuất hiện trong chuỗi


8

Bạn không thể lưu trữ 01dưới dạng số nguyên. Nó sẽ được chuyển đổi thành1

Bạn có thể lưu trữ dưới dạng chuỗi hoặc bạn có thể hiển thị chuỗi dưới dạng chuỗi "01"


4
Lưu trữ nó dưới dạng một số nguyên và hiển thị nó dưới dạng một chuỗi (được đệm bằng 0) sẽ là đề xuất của tôi. StringUtils Java của Apache đã có một phương thức pad đẹp như thế. Tìm thấy chủ đề này trên phần đệm: ruby-forum.com/topic/82137
McStretch

6

Tôi thích toán tử%, mặc dù có vẻ như đã hết ưu tiên ...

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

Một cách khác để đạt được điều này là đệm số nguyên của bạn tại thời điểm hiển thị, sử dụng sprintf:

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

-5

Hãy thử điều này và bạn có thể thay đổi chúng cho phù hợp

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
Chính xác if num < 0 && num > -1là gì?
Francisco Quintero
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.