'Check if a string contains only digits in ruby

I have a string which is passed as a parameter to a function. Here, I want to check if the string contains only numbers. So I had a check like below:

def check_string(string)
  result = false
  if string.to_i.to_s.eql? string
    result =  true
  end
  result
end

But the problem arises when a string starts with 0. In that case, a false is returned.

check_string('123')  #=> true
check_string('0123') #=> false

How can I solve this issue?



Solution 1:[1]

def check_string(str)
  str !~ /\D/
end

check_string '123'
  #=> true
check_string ''
  #=> true
check_string '1a2'
  #=> false

Solution 2:[2]

A number can be negative, or a float. So if these are allowed, consider this solution:

def is_numberic?(str)
    str == "#{str.to_f}" || str == "#{str.to_i}"
end

some input which evaluate to true

pry(main)> is_numberic? '5'
=> true
pry(main)> is_numberic? '58127721'
=> true
pry(main)> is_numberic? '58127721.737673'
=> true
pry(main)> is_numberic? '0'
=> true
pry(main)> is_numberic? '1818'
=> true
pry(main)> is_numberic? '0.1'
=> true
pry(main)> is_numberic? '0.0'
=> true
pry(main)> is_numberic? '11.29'
=> true
pry(main)> is_numberic? '-0.12'
=> true
pry(main)> is_numberic? '-29'
=> true

the input which evaluate to false

pry(main)> is_numberic? '10 years'
=> false
pry(main)> is_numberic? '01'
=> false
pry(main)> is_numberic? '00'
=> false
pry(main)> is_numberic? '0.10'
=> false
pry(main)> is_numberic? ''
=> false

As you can see, there're several cases which probably should be supported, eg '0.10', but are not. In this case, the permitted input is '0.1'.

Solution 3:[3]

this is my proposition for detecting if it's a float number

def check(string)
  scan = string.scan(/\D/)
  scan.size == 0 || (scan.size == 1 && scan.first == ".") # or "," depend on your separator
end

example of use:

check("123") => true
check("12.3") => true
check("12e3") => false
check("12.3.2") => false

Solution 4:[4]

You can use Regexp for it:

def check_string(string)
  raise 'Empty string passed' if string.empty?

  /\A\d+\z/ === string
end

check_string '123'
#=> true
check_string '0123'
#=> true
check_string '0'
#=> true

Solution 5:[5]

We can also use the "match" function to do this.

"1234".match(/\D/)
#=> nil
"1234foo".match(/\D/)
#=> #<MatchData "f">

match (String) - APIdock

Solution 6:[6]

I think we should use the regex to find this.

it will work for the below scenarios
"3.0"
"av3"
"3"

is_numeric = false if option.option.match?(/[^0-9.]/)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Zack Xu
Solution 3 Kaiizer
Solution 4
Solution 5 Tilak M Divakar
Solution 6 Iqbal Khan