Преобразования типов в Ruby: «правильный» путь? - PullRequest
7 голосов
/ 27 января 2009

Я пытаюсь решить, является ли строка числом в 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

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

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

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

Ответы [ 3 ]

9 голосов
/ 27 января 2009

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

isNum = Float(whatAmI) rescue nil

Включение «спасения» - это очень весело. Поставьте в скобки ту часть, которую вы спасаете, если вы поместите ее в середину других вещей, например:

if (isNum = Float(whatAmI) rescue nil) && isNum > 20
  ...
4 голосов
/ 27 января 2009

Это может показаться чрезмерно критичным, но исходя из вашего описания, вы почти наверняка делаете что-то «не так» ... Зачем вам нужно проверять, является ли String действительным представлением Float, но на самом деле не конвертировать Строка?

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

Например, вы можете вставить String в базу данных и собрать SQL-оператор, используя конкатенацию строк. Было бы предпочтительнее конвертировать в Float и использовать подготовленные операторы.

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

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

3 голосов
/ 27 января 2009

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

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

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

class String
  def can_convert?
    ...
  end
end

Редактировать: Строки, содержащие экспоненциальные обозначения, поддерживаются to_f.

>> "6.02e23".to_f
=> 6.02e+23
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...