Estoy haciendo una calculadora simple usando Ruby como práctica. Todo está bien, excepto cómo identifico si un carácter/símbolo que ingresé es un número o si no uso la declaración if-else .
Por ejemplo:
Enter first number: a Error: Enter correct number Enter first number: - Error: Enter correct number Enter first number: 1 Enter second number:b Error: Enter correct number Enter second number: 2 Choose operator (+-*/): * The product is: 2Este es el código que ingresé primero:
print "Enter first number: " x = gets.to_i print "Enter second number: " y = gets.to_i print "Choose operator (+-*/): " op = gets.chomp.to_sUsaré la declaración if-else para identificar si el número ingresado es un número o no
Si desea probar si la cadena representa un número entero o flotante, use Kernel#Integer o Kernel#Float con el segundo argumento opcional (un hash) que tiene el valor de la clave :exception igual a false .
Por ejemplo,
Integer('-123', exception: false) #=> -123 Integer("0xAa", exception: false) #=> 170 Integer('12.3', exception: false) #=> nil, Integer('12a3', exception: false) #=> nil Float('123', exception: false) #=> 123.0 Float("1.2e3", exception: false) #=> 1200.0 Float('12a3', exception: false) #=> nil, Float('1.2.3', exception: false) #=> nilNota
Integer("123\n", exception: false) #=> 123 muestra que no tiene que chomp antes de probar si la cadena representa un número entero (similar a Float ).
Algunos de los ejemplos ilustran una limitación o complicación al usar una expresión regular para probar si una cadena representa un número entero o flotante.
Crear un nuevo método de cadena
irb(main):001:0> class String irb(main):002:1> def number? irb(main):003:2> Float(self) != nil rescue false irb(main):004:2> end irb(main):005:1> end irb(main):012:0> x = gets 1 => 1 irb(main):013:0> x.number? => true irb(main):009:0> x = gets s => "s\n" irb(main):010:0> x.number? => falseEsta forma típica de hacer esto sería combinarlo con una expresión regular:
x = gets.chomp if x.match?(/^\d+$/) puts "#{x} is a number" else puts "#{x} is not a number" end Esto prueba si la cadena dada coincide con el patrón ^\d+$ , lo que significa "comienzo de línea, uno o más dígitos, luego final de línea". Tenga en cuenta que esto no coincidirá con caracteres como "," o "." - solo una cadena de dígitos 0-9. ¿Cadena #coincidencia? devolverá un valor booleano que indica si la cadena coincide o no con el patrón dado.