ведущие нули в рельсах

120

У меня есть поля hr и min, оба целых числа в моем приложении. В поле hr, если пользователь вводит "1", я бы хотел, чтобы Rails автоматически поместил его в "01", прежде чем сохранять его в базе данных. Также для поля min, если пользователь вводит "0", он должен быть введен как "00".

Как я могу это сделать?

Теги:
ruby-on-rails-3

7 ответов

267
Лучший ответ

Лучше сохранить его как целое число и просто отобразить его, как описано во время выполнения. Каждый язык имеет свой собственный путь к нулям - для Ruby вы можете использовать String # 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'
52

Вы можете преобразовать целое число в строку такого типа:

result_string = '%02i' % your_integer

Это не зависит от того, как он сохраняется в db.

15

Это также очень удобно:

"%.2d" % integer

Результирующая строка будет иметь 2 символа, а если число меньше двух символов, то в строке

будет присутствовать 0s.
8

Вы не можете хранить 01 как целое. Он будет преобразован в 1

Вы можете сохранить его как строку или вы можете показать его как строку "01"

  • 4
    Сохраните его как целое число и покажите его как строку (дополненную нулями). Java StringUtils в Apache имеет такой хороший метод pad. Нашел эту ветку на прокладке: ruby-forum.com/topic/82137
4

Мне нравится оператор%, хотя он, кажется, вышел из моды...

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

Еще один способ добиться этого - поместить свое целое число во время отображения, используя sprintf:

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

Попробуйте это, и вы можете изменить их в соответствии с

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 ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню