【问题标题】:Range with leading zero in ruby红宝石中前导零的范围
【发布时间】:2010-04-21 18:57:30
【问题描述】:

我有一个表单,我的用户可以在其中注册到我的网站。

他们在表格中填写自己的生日:出生年份、出生月份和生日。

所以我使用 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

【问题讨论】:

    标签: ruby-on-rails ruby forms range


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      问题在于数字本身没有前导零(或者,有无数个从不打印的前导零)。要获得前导零,您需要字符串。幸运的是,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 指出这一点。)

      【讨论】:

      • 您可能应该将正确的验证语句添加到您的答案中以确保完整性。 validates_inclusion_of :birthmonth, :in => (1..12).map {|n| "%02d" % n}
      • 当我选择一个以零开头的数字时,它不会验证。以 1 开头的数字虽然有效
      • 添加我在上一条评论中添加的验证行,它应该可以正常工作。您当前的验证与 Chuck 在选择框的答案中输入的值不同。
      • 这似乎适用于验证部分。 (1..12).map {|n| ("%02d" % n).to_s}
      • 看起来是因为所有月份都将转换为字符串。它只验证整数
      【解决方案3】:

      如果只是表示问题,可以构造 [text, value] 对并将它们传递给options_for_select

      给定一个元素响应 first 和 last 的容器(例如二元素数组),“lasts”用作选项值,“firsts”用作选项文本。

      所以,类似:

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

      这样你应该能够保持你的验证逻辑不变。

      【讨论】:

      • +1 可能是最好的答案,虽然有点晚了。
      【解决方案4】:

      我猜使用 rjust 会更容易更漂亮:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 谢谢!我可以在验证中使用它吗?
        • 作为这个hack的结果,你将在结果数组中混合类型,一些元素被转换为字符串,其他元素保留为整数。尽管在这种特殊情况下它可能不会造成任何问题,但这种黑客攻击不应该被视为一种选择,至少在 Ruby 中不应该(这对我来说似乎是 PHP 习惯)。
        猜你喜欢
        • 2017-04-01
        • 2011-02-04
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        相关资源
        最近更新 更多