Преобразование типов в Ruby:" правильный " способ?

Я пытаюсь решить, является ли строка числом в Ruby. Это мой код

whatAmI = "32.3a22"
puts "This is always false " + String(whatAmI.is_a?(Fixnum));
isNum = false;
begin
  Float(whatAmI)
  isNum = true;
rescue Exception => e
  puts "What does Ruby say? " + e
  isNum = false;
end
puts isNum

Я понимаю, что могу сделать это с помощью регулярного выражения, но есть ли стандартный способ сделать это, что я упускаю? Я видел can_convert? метод, но у меня его нет.

есть ли способ добавить can_convert? метод для всех строк? Я понимаю, что это возможно в Ruby. Я также понимаю, что это может быть полностью лишние...

редактировать методы to_f не работают, так как они никогда не выбрасывают исключение, а просто возвращают 0, если это не сработает.

3 ответов


у вас есть правильная идея. Это можно сделать немного компактнее, хотя:

isNum = Float(whatAmI) rescue nil

Inlining "спасение" большая потеха. Заключите в скобки часть, которую вы спасаете, если вы поместите ее в середине больше вещей, например:

if (isNum = Float(whatAmI) rescue nil) && isNum > 20
  ...

Это может показаться чрезмерно критичным, но, основываясь на вашем описании, вы почти наверняка делаете что-то "неправильно"... Зачем вам нужно проверять, является ли строка допустимым представлением Float но на самом деле не конвертировать строку?

это просто догадка, но может быть полезно описать, чего вы пытаетесь достичь. Возможно, есть" лучший " способ.

например, вы можете вставить строку в базу данных и собрать sql оператор, использующий конкатенацию строк. Было бы предпочтительнее преобразовать в Float и использовать подготовленные операторы.

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

возможно, Вам также придется иметь дело с международным вводом, в Европе вместо точки в качестве десятичного разделителя используется запятая, но Ruby Поплавки должны использовать (.).


Я не знаю, о can_convert метод, но обычно класс определяет такие методы, как to_s, to_i, to_hash и так далее. Эти методы возвращают другое представление объекта, например a to_s метод вернет строковое представление объекта.

Что касается фактического преобразования, я уверен, что кто-то другой может ответить на это лучше, чем я.

С другой стороны, если вам интересно, можете ли вы добавить метод ко всем строкам, вы можете. Просто открыть вверх String класс и добавьте его!

class String
  def can_convert?
    ...
  end
end

Edit: строки, содержащие экспоненциальную нотацию, поддерживаются to_f.

>> "6.02e23".to_f
=> 6.02e+23