I have fields hr
and min
, both integers in my application. For hr
field, if the user enters "1" I would like Rails to automatically pad it to "01" before saving it to the database. Also for the min
field if the user enter "0" it should 开发者_如何学编程put in as "00".
How can I do this?
It'd be better to store it as an integer and just display it as you described on runtime. Every language has its own way to pad zeros - for Ruby you can use String#rjust. This method pads a string (right-justified) so that it becomes a given length, using a given padding character.
str.rjust(integer, padstr=' ') → new_str
If
integer
is greater than the length ofstr
, returns a newString
of lengthinteger
withstr
right justified and padded withpadstr
; otherwise, returnsstr
.
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'
You can transform the integer into a string of that kind with:
result_string = '%02i' % your_integer
This is independent from how it gets saved in the db.
- RDoc Documentation
- Explanation & Examples
This is also quite handy:
"%.2d" % integer
The resultant string will be of 2 characters and if the number is of less than 2 characters, then 0s will be present in the string
You can't store 01
as integer. It will be converted to 1
You can store it as a string, or you can show it as a string "01"
I like the % operator, even though it seems to have gone out of favor...
2.0.0-p247 :001 > '%02i' % 1
=> "01"
2.0.0-p247 :002 > '%2i' % 1
=> " 1"
2.0.0-p247 :003 > '%-2i' % 1
=> "1 "
Another way to achieve this is to pad your integer at display time, using sprintf:
f = sprintf '%04d', 49
# f = "0049"
Try this and you can change them to match
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
精彩评论