2011-06-30 16 views
8

¿Hay un equivalente de gsub para enteros o decimales? ¿Debería funcionar gsub con enteros? Básicamente, estoy tratando de ingresar el decimal en una forma ruby ​​y lo que el usuario puede usar comas. Por ejemplo, quiero que el usuario pueda ingresar 1,000.99.Comas de separación de enteros o decimales en raíles

He intentado usar

before_save :strip_commas 

def strip_commas 
    self.number = self.number.gsub(",", "")  
end 

pero el siguiente error "método no definido` gsub' de 8: Fixnum", donde '8' es reemplazada por cualquier número que introduzca el usuario.

+0

es el campo de números un flotador? Rails debe encargarse de la conversión para que la coma no esté allí en los datos. – ErsatzRyan

+1

El campo es decimal. Cuando ingreso algo como 2,000 en el campo, obtengo "2" en mi base de datos mysql. – Oakland510

Respuesta

14

Si su campo es un Fixnum, nunca tendrá comas, ya que Rails tendrá que convertir la entrada del usuario en un número para almacenarlo allí.

Sin embargo, lo hará llamando a_i en la cadena de entrada, que no es lo que desea. anulando la incubadora normal a algo así como

def price=(num) 
    num.gsub!(',','') if num.is_a?(String) 
    self[:price] = num.to_i 
end 

No se ha probado, pero algo parecido a esto debería funcionar ...

Es necesario llegar a las comas mientras que la entrada sigue siendo una cadena.

Editar: Como se señala en los comentarios, si desea aceptar los decimales, y crear algo no un entero, se necesita una conversión diferente que String.to_i. Además, los diferentes países tienen diferentes convenciones para la puntuación numérica, por lo que esta no es una solución completa.

+1

¡Funcionó a la perfección! Solo necesito cambiar a_i a to_d desde. Me estaba volviendo loco debido a la falta de comas en un Fixnum. Gracias. – Oakland510

+0

De hecho, me olvidé de que también querías permitir decimales y estamos tratando con Fixnum y no con Integer ... Pero entendiste la idea. Editaré la respuesta. –

+8

Tenga en cuenta que esto podría atraparlo en algún momento, ya que los europeos escribirán cosas como 100,00, que significa 100.00, que interpretará como 10000. Hablo por experiencia. – d11wtq

3

prueba self.number.gsub(/\D/, ''). Es decir, eliminar todo lo que no sea un dígito. Regexen no hace distinción entre enteros, flotantes, decimales, etc. Son todas las cuerdas. Y Rails no lo convertirá correctamente, ya que solo llama al #to_i o #to_f.

EDIT:

realidad: self.number.gsub(/[^\d\.]/, '').to_f: todo lo que no es un dígito o punto decimal, y convertirlo en un flotador.

+3

No necesita escapar del ''.'' porque, cuando está en un rango'' [.] '', Pierde su carácter especial y es automáticamente un literal. Entonces '[^ \ d.]' Es más correcto. Sin embargo, dejarlo escapado está bien porque actúa como un recordatorio visual del comportamiento. –

Cuestiones relacionadas