如何确定字符串是否为数字?

时间:2014-09-26 14:08:55

标签: ruby-on-rails ruby

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

我如何在地球上测试一个字符串是否是模型外的数字(包括小数)?

e.g。

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

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

到目前为止,我已经阅读了以下答案,并且没有更接近:

2 个答案:

答案 0 :(得分:7)

您可以借用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

答案 1 :(得分:4)

您可以使用正则表达式。

!!("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

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

希望这有帮助。