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

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

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

例如

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

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

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

  • Ruby on Rails – validation成本
  • Ruby / Rails – 如何validation小数位?
  • rails中的无效小数变为0.0

您可以借用NumericalityValidator Rails用于validation数字的想法,它使用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 

它还处理以科学记数法书写的符号,hex数字和数字:

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

你可以使用正则表达式。

 !!("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:Ruby正则表达式编辑器和测试器

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

希望这可以帮助。