【问题标题】:How do I determine if a string is numeric?如何确定字符串是否为数字?
【发布时间】:2014-09-26 14:08:55
【问题描述】:

我认为这会更容易找到,但我很惊讶它不是。

到底如何测试字符串是否是模型之外的数字(包括小数)?

例如

is_number("1") # true
is_number("1.234") # true
is_number("-1.45") # true
is_number("1.23aw") #false

在 PHP 中,有 is_numeric,但我似乎在 Ruby(或 Rails)中找不到等价物。

到目前为止,我已经阅读了以下答案,但还没有进一步了解:

【问题讨论】:

  • @JustinWood 那里的解决方案不适用于字符串
  • 你为什么不只使用正则表达式?
  • 什么例外? value.to_f 永远不应该抛出异常...
  • @JustinWood 不幸的是,使用 to_f 您无法区分非数字字符串和零:'0'.to_f # => 0.0'foo'.to_f # => 0.0

标签: ruby-on-rails ruby


【解决方案1】:

你可以借鉴NumericalityValidator Rails 用来验证数字的想法,它使用Kernel.Float 方法:

def numeric?(string)
  # `!!` converts parsed number to `true`
  !!Kernel.Float(string) 
rescue TypeError, ArgumentError
  false
end

numeric?('1')   # => true
numeric?('1.2') # => true
numeric?('.1')  # => true
numeric?('a')   # => false

它还处理符号、十六进制数字和以科学记数法书写的数字:

numeric?('-10')   # => true
numeric?('0xFF')  # => true
numeric?('1.2e6') # => true

【讨论】:

  • 那么我必须定义这个方法,对吧? (即它不是内置的)
  • 是的,没有用于此目的的内置或库函数。
【解决方案2】:

你可以使用正则表达式。

!!("1" =~ /\A[-+]?[0-9]+(\.[0-9]+)?\z/) # true
!!("1.234" =~ /\A[-+]?[0-9]+(\.[0-9]+)?\z/) # true
!!("-1.45" =~ /\A[-+]?[0-9]+(\.[0-9]+)?\z/) # true
!!("1.23aw" =~ /\A[-+]?[0-9]+(\.[0-9]+)?\z/) # false

你可以像这样使用它或者在模块中创建一个方法或者在String类中添加这个

class String
  def is_number?
    !!(self =~ /\A[-+]?[0-9]+(\.[0-9]+)?\z/)
  end
end

你可以使用这个网站来测试你的表情:Rubular: a Ruby regular expression editor and tester

如果需要,我可以解释更多的表达式。

希望这会有所帮助。

【讨论】:

  • 这会失败,因为基数大于 10,例如 0xdeadbeef
  • 为什么要投反对票? OP 没有表示他要测试特定的基数或 10 以外的基数。并且可以更改正则表达式,因此答案仍然有效。
  • @FredPerrin 我支持你
猜你喜欢
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2012-01-05
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多