如何判断x.to_i是否真的为0(零)?

时间:2016-02-18 09:43:49

标签: ruby

"0".to_i == 0

也:

"abcdefg".to_i == 0

我想确保我正在解析的字符串确实只是一个数字(包括0)。

5 个答案:

答案 0 :(得分:3)

Integer("0").zero? rescue false
# => true
Integer("1").zero? rescue false
# => false
Integer("abcdefg").zero? rescue false
# => false

答案 1 :(得分:1)

def string_is_integer?(string)
  !string.match(/^(\d)+$/).nil? # \d looks for digits
end

def string_is_float?(string)
  !string.match(/^(\d)+\.(\d)+$/).nil?
end

def string_is_number?(string)
  string_is_integer?(string) || string_is_float?(string)
end

或者,如果你不介意:

def string_is_number?(string)
  begin
    true if Float(string)
  rescue ArgumentError       
  end || false
end

答案 2 :(得分:1)

def is_zero?(string)   
  (Integer(string) rescue 1).zero?
end     

is_zero? "0"           #=> true
is_zero? "00000"       #=> true
is_zero? "0cat"        #=> false
is_zero? "1"           #=> false
is_zero? "-0"          #=> true
is_zero? "0_000"       #=> true
is_zero? "0x00"        #=> true
is_zero? "0b00000000"  #=> true

其中一些例子说明了为什么使用Kernel#Integer而不是正则表达式更为可取。

答案 3 :(得分:0)

首先测试字符串是否为整数然后匹配

def is_i?(x)
   !!(x =~ /\A[-+]?[0-9]+\z/)
end

def is_zero?(x)
  return is_i?(x) && x.to_i == 0
end

# is_zero?("0") will return true
# is_zero?("abcde") will return false 

或者您可以将这些方法放在String类这样的

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

    def is_zero?
        self.is_i? && self.to_i == 0
    end
end

"0".is_zero? # true
"abcde".is_zero? # false

答案 4 :(得分:0)

  

我想确保我解析的字符串确实只是一个数字。

涉及两个步骤:

  1. 解析,即将字符串转换为数字
  2. 验证,即检查字符串实际上是否为数字
  3. 内置转换函数(如IntegerFloat)已执行以下两个步骤:如果字符串有效则返回数值结果,否则会引发错误。

    仅使用这些函数进行验证并丢弃返回值是浪费。相反,使用返回值并处理异常,例如:

    begin
      puts 'Enter a number:'
      number = Float(gets)
    rescue
      puts 'Not a valid number'
      retry
    end
    # do something with number
    

    或类似的东西:

    def parse_number(string)
      Float(string) rescue nil
    end
    
    number = parse_number(some_string)
    if number
      # do something with number
    else
      # not a number
    end