librelist archives

« back to archive

I18n de campos float

I18n de campos float

From:
Juan Schwindt
Date:
2011-01-05 @ 22:12
Tenemos una aplicación Rails 3 con un formulario que tiene que aceptar
valores en punto flotante (un precio, básicamente) y queremos que en base a
los locales de I18n seteados, acepte el formato que corresponda, es decir
1,234.56 o 1.234,56. ¿Cuál es la solución más transparente pare esto? Para
la situación inversa, es decir, para generar la salida en las vistas, lo
tengo clarísimo, pero el ingreso de datos no encontré a priori la forma
correcta.

Agradezco de antemano la ayuda.

Saludos,
Juan Schwindt.

Re: [rubysur] I18n de campos float

From:
Alvaro
Date:
2011-01-06 @ 19:52
El día 5 de enero de 2011 20:12, Juan Schwindt <juan@schwindt.org> escribió:
> Tenemos una aplicación Rails 3 con un formulario que tiene que aceptar
> valores en punto flotante (un precio, básicamente) y queremos que en base a
> los locales de I18n seteados, acepte el formato que corresponda, es decir
> 1,234.56 o 1.234,56. ¿Cuál es la solución más transparente pare esto? Para
> la situación inversa, es decir, para generar la salida en las vistas, lo
> tengo clarísimo, pero el ingreso de datos no encontré a priori la forma
> correcta.
> Agradezco de antemano la ayuda.
> Saludos,
> Juan Schwindt.

Buena pregunta :)

Si tenes persistido en tu base de datos que local tiene el usuario que
esta creando el registro y a su vez ese registro esta vinculado al
usuario podes usar un proc y despues limpiar la entrada para que
guarde el tipo de dato que pretendes. Asumiendo que estas usando
active record...

class Gift < ActiveRecord::Base
  belongs_to :user

  validates_format_of :amount, :with => RegExp.new(/es_money_format/),
:if => proc.new {|gift| gift.user.local == "es"}
  validates_format_of :amount, :with => RegExp.new(/en_money_format/),
:if => proc.new {|gift| gift.user.local == "en"}
end

Ahora si el locale depende de un request o no tenes como llegar al
local desde el registro que vas a guardar la cosa se complica
un poco mas, en ese caso deberias hacer la validacion desde el
controller, de hecho podrias hacerla aunque tuvieras acceso al user
y su local, de alguna manera estamos haciendo trampa al hacerlo en el
modelo, porque lo que vas a validar no va a ser lo que vas
a guardar, a no ser que quieras guardar strings como tipo de dato.

Ahora mismo se me ocurrieron esas dos, alguien ya debe haber tenido
este tipo de problema y por ahi tiene una solucion mas limpia, suerte
con eso!

-- 
Alvaro

Re: [rubysur] I18n de campos float

From:
Alvaro
Date:
2011-01-06 @ 20:58
El día 6 de enero de 2011 17:52, Alvaro <zevarito@gmail.com> escribió:
> El día 5 de enero de 2011 20:12, Juan Schwindt <juan@schwindt.org> escribió:
>> Tenemos una aplicación Rails 3 con un formulario que tiene que aceptar
>> valores en punto flotante (un precio, básicamente) y queremos que en base a
>> los locales de I18n seteados, acepte el formato que corresponda, es decir
>> 1,234.56 o 1.234,56. ¿Cuál es la solución más transparente pare esto? Para
>> la situación inversa, es decir, para generar la salida en las vistas, lo
>> tengo clarísimo, pero el ingreso de datos no encontré a priori la forma
>> correcta.
>> Agradezco de antemano la ayuda.
>> Saludos,
>> Juan Schwindt.
>
> Buena pregunta :)
>
> Si tenes persistido en tu base de datos que local tiene el usuario que
> esta creando el registro y a su vez ese registro esta vinculado al
> usuario podes usar un proc y despues limpiar la entrada para que
> guarde el tipo de dato que pretendes. Asumiendo que estas usando
> active record...
>
> class Gift < ActiveRecord::Base
>  belongs_to :user
>
>  validates_format_of :amount, :with => RegExp.new(/es_money_format/),
> :if => proc.new {|gift| gift.user.local == "es"}
>  validates_format_of :amount, :with => RegExp.new(/en_money_format/),
> :if => proc.new {|gift| gift.user.local == "en"}
> end
>
> Ahora si el locale depende de un request o no tenes como llegar al
> local desde el registro que vas a guardar la cosa se complica
> un poco mas, en ese caso deberias hacer la validacion desde el
> controller, de hecho podrias hacerla aunque tuvieras acceso al user
> y su local, de alguna manera estamos haciendo trampa al hacerlo en el
> modelo, porque lo que vas a validar no va a ser lo que vas
> a guardar, a no ser que quieras guardar strings como tipo de dato.
>
> Ahora mismo se me ocurrieron esas dos, alguien ya debe haber tenido
> este tipo de problema y por ahi tiene una solucion mas limpia, suerte
> con eso!
>
> --
> Alvaro
>

Juan, pensando un poco mas en esto, creo que lo mejor es resolverlo
client-side, osea resolverlo con javascript, simplemente agregar una
clase .float a cada elemento que necesites y bindear eventos para
formatearlo y submitearlo correctamente, despues de todo a nivel de
backend los float se resuelven con un "." independientemente del local
que estes usando.

Por otra parte estarias atacando el problema en un solo lugar en forma
de -presenter-, porque aunque hicieras algo en el modelo para validar,
cuando vas a presentar datos necesitas presentarlos correctamente y
eso te lleva a algun tipo de duplicacion.

-- 
Alvaro