Debe limpiar la entrada para que los usuarios puedan escribir casi lo que quieran, y obtendrá algo consistente para almacenar en su base de datos. Suponiendo que su modelo se llama "DoughEntry" y su atributo es "amount", y se almacena como un entero.
Aquí hay un método que convierte una entrada de cadena en centavos (si la cadena termina en dos dígitos después de un delímetro, se supone que es centavos). Es posible que desee hacer esto más inteligente, pero aquí está el concepto:
def convert_to_cents(input)
if input =~ /^.*[\.,]\d{2}$/
input.gsub(/[^\d-]/,'').to_i
else
"#{input.gsub(/[^\d-]/,'')}00".to_i
end
end
>> convert_to_cents "12,345"
=> 1234500
>> convert_to_cents "12.345,67"
=> 1234567
>> convert_to_cents "$12.345,67"
=> 1234567
Luego sobrescribe el descriptor de acceso por defecto "cantidad", pasándolo a través de ese método:
class DoughEntry << ActiveRecord::Base
def amount=(input)
write_attribute(:amount, convert_to_cents(input))
end
protected
def convert_to_cents(input)
if input =~ /^.*[\.,]\d{2}$/
input.gsub(/[^\d-]/,'').to_i
else
"#{input.gsub(/[^\d-]/,'')}00".to_i
end
end
end
Ahora que está guardando centavos en el base de datos. El radar tiene la idea correcta para sacarlo de nuevo.
¿Sueles ingresar el, para separar puntajes cuando escribes un número? Yo personalmente nunca. –
No, pero no puedo garantizar que nadie lo haga. Prefiero equivocarme del lado de la felicidad del usuario en lugar de la frustración. Además, si está copiando valores de, por ejemplo, su extracto bancario en línea, es posible que ya tenga el formato $ y, y. y todo tipo de otros personajes. –