【问题标题】:Strip all characters except digits in Rails [duplicate]去除Rails中除数字之外的所有字符[重复]
【发布时间】:2023-03-11 09:44:02
【问题描述】:

我的用户正在提供这些输入

123 - 4567 - 5665

123124-124325

但我只需要以数字形式提交它们。我也不能指望用户通过给他们警报来为我做这件事。这对他们来说太不方便了。

所以 DB 中的结果应该是 12345675665

我在 Rails 4.2 上使用 ruby​​。

我应该使用什么过滤器以及在哪里使用?

【问题讨论】:

  • 谢谢。但是我应该把这段代码放在哪里? def raw_phonenumber self.phonenumber end def raw_phonenumber=(s) self.phonenumber=s.gsub(/\D/, '') end

标签: ruby-on-rails ruby filter numbers filtering


【解决方案1】:
class YourModel < ActiveRecord::Base

  before_validation :tweak_my_attribute

  def tweak_my_attribute
     self.my_attribute = my_attribute.to_s.gsub(/\D/, '')
  end

end

【讨论】:

  • 您的答案是正确的,因为它只会处理每个实例的性能并不是一个重要因素,但String#scan 在这些情况下实际上执行得更快,例如my_attribute.to_s.scan(/\d+/).join
  • 非常感谢!它完美地工作。已接受答案!
  • @engineersmnky 之前也看到过,但不知道这次\d+是不是真正的关键?还是我的基准测试错误?我从一张桌子上拿了大约 25,000 个电话号码。 (我很好奇)gist.github.com/phallstrom/c03bd7a1182d5ebdcb18
  • @engineersmnky 在我运行的几个测试中,scan(/\d+/).join 比gsub(/\D+/, '') 慢一点(大约 15%)。使用 scan 的方法必须在创建新字符串之前创建一个新数组,因此它也可能使用更多内存,尽管我没有专门对此进行测试。与往常一样,系统的性能差异很大,因此进行基准测试很重要。
  • Phillip Hallstrom & @WizardofOgz 我觉得这必须是一个系统(并且显然是 ruby​​ 版本)依赖项,因为我的基准测试结果正如我所描述的那样。GitHub Gist 我想这就是为什么基准测试很重要在实际运行应用程序或代码的系统上。在这种情况下,即使超过 100_000 次迭代,差异也非常小,所以我的评论可能只是“你也可以这样做”:)
猜你喜欢
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多