Подтвердить что ты не робот

Строго преобразовать строку в целое (или ноль)

Для веб-программирования цифры входят в строки. но to_i преобразует "5abc" в 5 и "abc" в 0, как неправильные ответы. Чтобы поймать их, я написал:

def number_or_nil( s )
  number = s.to_i
  number = nil if (number.to_s != s)
  return number
end

Есть ли более аккуратный, более Ruby-естественный способ выполнения этого преобразования и обнаружения того, что строка не была указана как число?

4b9b3361

Ответ 1

Использовать Integer (строка)

Он вызовет ошибку ArgumentError, если строка не может преобразовать в целое число.

Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc"
Integer('5') #=> 5

Вам все равно понадобится ваш метод number_or_nil, если вы хотите, чтобы поведение было таким, что nil возвращается, когда строка не может быть преобразована.

def number_or_nil(string)
  Integer(string || '')
rescue ArgumentError
  nil
end

Вы должны быть осторожны, чтобы избавиться от конкретного исключения. Скрытое спасение (например, "спасательный нуль" ) спасет от любой ошибки, которая наследуется от StandardError и может помешать выполнению вашей программы так, как вы этого не ожидаете. Integer() вызовет ArgumentError, поэтому укажите это.

Если вы предпочитаете не разбираться с исключениями и предпочитаете более короткую версию вашего number_or_nil, вы можете использовать неявные возвращаемые значения и записать их как:

def number_or_nil(string)
  num = string.to_i
  num if num.to_s == string
end

number_or_nil '5' #=> 5
number_or_nil '5abc' #=> nil

Это будет работать так, как вы ожидаете.

Ответ 2

Использовать простое регулярное выражение для проверки str является целым числом.

def number_or_nil(str)
   str.to_i if str[/^-?\d+$/] and str.line.size == 1
end