Tengo una cadena, por ejemplo '123'
, y quiero convertirla al número entero 123
.
Sé que simplemente puedes hacerlo some_string.to_i
, pero eso se convierte 'lolipops'
en 0
, que no es el efecto que tengo en mente. Quiero que me explote en la cara cuando trato de convertir algo inválido, con algo agradable y doloroso Exception
. De lo contrario, no puedo distinguir entre un valor válido 0
y algo que simplemente no es un número en absoluto.
EDITAR: Estaba buscando la forma estándar de hacerlo, sin trucos regex.
^
y$
tienen significados sutilmente diferentes como metacars que en la mayoría de los otros sabores regexp. Probablemente quieras usar\A
y en su\Z
lugar.\z
en lugar de,\Z
ya que la descripción para el ancla Z en mayúscula es: "Coincide con el final de la cadena. Si la cadena termina con una nueva línea, coincide justo antes de la nueva línea" - ruby-doc.org/core-2.1.1/Regexp .htmlTambién tenga en cuenta los efectos que la solución actual aceptada puede tener al analizar números hexadecimales, octales y binarios:
En Ruby, los números que comienzan con
0x
o0X
son hexadecimales,0b
o0B
son binarios, y solo0
son octales. Si este no es el comportamiento deseado, es posible que desee combinarlo con algunas de las otras soluciones que verifican si la cadena coincide primero con un patrón. Como las/\d+/
expresiones regulares, etc.fuente
Otro comportamiento inesperado con la solución aceptada (con 1.8, 1.9 está bien):
así que si no está seguro de lo que se está pasando, asegúrese de agregar un
.to_s
.fuente
Me gusta la respuesta de Myron, pero sufre la enfermedad de Ruby de "Ya no uso Java / C #, así que nunca volveré a usar la herencia" . Abrir cualquier clase puede estar lleno de peligros y debe usarse con moderación, especialmente cuando es parte de la biblioteca principal de Ruby. No digo que nunca lo use, pero generalmente es fácil de evitar y que hay mejores opciones disponibles, por ejemplo
Luego, cuando desee usar una cadena que podría ser un número, está claro lo que está haciendo y no golpea ninguna clase central, por ejemplo
Puede agregar todo tipo de otras comprobaciones en la inicialización, como verificar números binarios, etc. Sin embargo, lo principal es que Ruby es para las personas y ser para las personas significa claridad . Nombrar un objeto a través de su nombre de variable y su nombre de clase hace las cosas mucho más claras.
fuente
Tuve que lidiar con esto en mi último proyecto, y mi implementación fue similar, pero un poco diferente:
fuente
Probablemente no sea la forma más limpia de hacerlo, pero debería funcionar.
fuente
Re: la respuesta de Chris
Su implementación deja pasar cosas como "1a" o "b2". ¿Qué tal esto en su lugar:
Esto produce:
fuente
\z
en lugar de,\Z
ya que la descripción para el ancla Z en mayúscula es: "Coincide con el final de la cadena. Si la cadena termina con una nueva línea, coincide justo antes de la nueva línea" - ruby-doc.org/core-2.1.1/Regexp .html