2009-01-27 6 views
6

Estoy tratando de decidir si una cadena es un número en Ruby. Este es mi códigoConversiones de tipo en Ruby: ¿la forma "correcta"?

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 

Soy consciente de que puedo hacerlo con una expresión regular, pero ¿hay alguna forma estándar de hacerlo que me falta? He visto un can_convert? método, pero parece que no lo tengo.

¿Hay alguna manera de agregar un can_convert? método para todas las cadenas? Entiendo que es posible en Ruby. También entiendo que esto puede ser totalmente innecesario ...

Editar Los métodos to_f no funcionan, ya que nunca arrojan una excepción sino que simplemente devuelven 0 si no funciona.

Respuesta

9

Tiene la idea correcta. Sin embargo, se puede hacer un poco más compactamente:

isNum = Float(whatAmI) rescue nil 

Inlining "rescue" es muy divertido. Un paréntesis la parte que está rescatando si lo pones en medio de más cosas, como:

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

¡agradable! eso es lo que necesitaba. –

3

no sé sobre el método can_convert, pero por lo general una clase definirá métodos como to_s, to_i, to_hash y así sucesivamente. Estos métodos devuelven una representación diferente del objeto, por ejemplo, un método to_s devolverá una representación de cadena de un objeto.

En cuanto a la conversión real, estoy seguro de que alguien más puede responder mejor que yo.

En otra nota, si se está preguntando si puede agregar un método a todas las cadenas, puede hacerlo. ¡Solo abre la clase String y agrégala!

class String 
    def can_convert? 
    ... 
    end 
end 

Editar: Strings contienen notación exponencial son apoyados por to_f.

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

Acepto el método to_i. También hay un método to_f. La última 'nota', acerca de la extensión de cadena, se llama Monkey Patching, ¡y se recomienda encarecidamente que no se aplique! – xtofl

+0

Sí, pensé que había otra forma de modificar String ... pero podría ser solo una instancia de String que se pueda modificar. –

+0

Puede agregar un método singleton a String o un objeto de cadena si lo desea. – dylanfm

4

Esto puede sonar demasiado crítico, pero en base a su descripción, que está casi seguro que hacer algo "malo". ¿Por qué necesitarías comprobar si una cadena es una representación válida de Float pero no convertir realmente la cadena?

Esto es sólo una corazonada, pero puede ser útil describir lo que está tratando de lograr. Probablemente haya una "mejor" manera.

Por ejemplo, es posible que desee insertar la cadena en una base de datos y armar una declaración sql utilizando la concatenación de cadenas. Sería preferible convertir a Float y usar declaraciones preparadas.

Si solo tiene que inspeccionar la "forma" de la cadena, sería preferible usar una expresión regular, porque, como Dylan señaló, una Float se puede representar de muchas maneras que pueden o no ser apropiado

También puede tener que tratar con la entrada internacional, en Europa, se utiliza una coma en lugar de un punto como separador decimal, pero Ruby Floats tiene que usar el (.).

+1

La pregunta surgió de algo simple que haré con un RegEx, solo para comprobar si el String es un int (que significa un ID) o no (una acción, como "iniciar sesión"). Pero luego me puse curioso ... –

+0

Gracias por la respuesta. Creo que tienes razón sobre la expresión regular, y definitivamente tienes razón en que esto probablemente no sea necesario. –

Cuestiones relacionadas