#ruby #regex #ruby-on-rails-3
#ruby
Вопрос:
У меня есть поля hr
и min
, оба целых числа в моем приложении. Для hr
поля, если пользователь вводит «1», я бы хотел, чтобы Rails автоматически добавлял к нему «01» перед сохранением в базе данных. Также для min
поля, если пользователь вводит «0», оно должно быть введено как «00».
Как я могу это сделать?
Ответ №1:
Было бы лучше сохранить это как целое число и просто отобразить его, как вы описали во время выполнения. У каждого языка есть свой способ заполнения нулей — для Ruby вы можете использовать строку#rjust. Этот метод дополняет строку (по правому краю) так, чтобы она приобрела заданную длину, используя заданный символ заполнения.
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'
Ответ №2:
Вы можете преобразовать целое число в строку такого типа с помощью:
result_string = 'i' % your_integer
Это не зависит от того, как они сохраняются в базе данных.
Ответ №3:
Это тоже довольно удобно:
"%.2d" % integer
Результирующая строка будет состоять из 2 символов, и если число меньше 2 символов, то в строке будут присутствовать 0
Ответ №4:
Вы не можете сохранить 01
как целое число. Он будет преобразован в 1
Вы можете сохранить это как строку, или вы можете отобразить это как строку «01»
Комментарии:
1. Моей рекомендацией было бы сохранить его как целое число и отобразить в виде строки (дополненной 0). В Java StringUtils от Apache был подобный хороший метод заполнения. Нашел эту тему в padding: ruby-forum.com/topic/82137
Ответ №5:
Мне нравится оператор%, хотя, похоже, он вышел из моды…
2.0.0-p247 :001 > 'i' % 1
=> "01"
2.0.0-p247 :002 > '%2i' % 1
=> " 1"
2.0.0-p247 :003 > '%-2i' % 1
=> "1 "
Ответ №6:
Другой способ добиться этого — дополнить целое число во время отображения с помощью sprintf:
f = sprintf 'd', 49
# f = "0049"
Ответ №7:
Попробуйте это, и вы сможете изменить их, чтобы они соответствовали
def numeric92(num)
if num.present?
if num < 0 amp;amp; num > -1
('-d' % num) '.' ('%.2f' % num).split('.').last
else
('d' % num) '.' ('%.2f' % num).split('.').last
end
else
'000000.00'
end
end
Комментарии:
1. Что именно
if num < 0 amp;amp; num > -1
такое?