红宝石中前导零的范围

时间:2010-04-21 18:57:30

标签: ruby-on-rails ruby forms range

我有一个表格,我的用户可以在我的网站上注册。

他们以生日,出生月和生日的形式填写他们的出生日期。

所以我使用Range在这样的表单中创建选择:

= f.select(:birthmonth, options_for_select((1..12)))

但是这并没有像我想要的那样以零开始单位数字:01,02,03,04,05,06,07,08,09,10等等。

我甚至试过这个,但它不起作用:

= f.select(:birthmonth, options_for_select((01..12)))

任何知道如何让Range开始使用前导零的人?或者任何其他方式这样做,以便我可以在验证中使用它?:

validates_inclusion_of :birthmonth, :in => 1..12

5 个答案:

答案 0 :(得分:16)

问题在于数字本身没有前导零(或者,有一些永远不会打印的无限数量的前导零)。要获得前导零,您需要字符串。幸运的是,Ruby内置了这种字符串格式化功能。

= f.select(:birthmonth, options_for_select((1..12).map {|n| "%02d" % n}))

%02d是格式化说明符,表示“如果它少于两位数,则用前导零填充它。”

要进行验证,您需要进行相同的转换:

validates_inclusion_of :birthmonth, :in => (1..12).map {|n| "%02d" % n}

(感谢@ r-dub指出那个位。)

答案 1 :(得分:14)

您实际上可以这样做:'01'..'12'

答案 2 :(得分:2)

如果它只是一个表达问题,您可以构建[text,value]对并将它们传递给options_for_select

  

给定一个容器,其中元素响应第一个和最后一个(例如一个双元素数组),“lasts”用作选项值,“firsts”用作选项文本。

所以,比如:

options_for_select((1..12).map {|n| ["%02d" % n, n]})

这样你就可以保持验证逻辑不变。

答案 3 :(得分:2)

使用rjust会让我更容易,更漂亮:

(1..12).collect{ |i| i.to_s.rjust(2,'0') }

答案 4 :(得分:0)

尝试填充小于10的数字,如下所示:

= f.select(:birthmonth, options_for_select((1..12).collect{ |i| i < 10 ? "0#{i}" : i }))