L10n of numbers?

I need to localize numbers in text fields and have been looking at the
various L10n plugins that claim to have number support. Support seems
to mean that the plugin includes a Number#to_localized_string method,
which isn’t very useful for my purposes.

I figure I could build my own numeric_field helper easy enough; the
question is how I’d go about parsing the input before it reaches
Rails.

Currently I’m thinking along the lines of prefixing the field names
with some string, e.g. ‘numeric_value_’, parsing the (possibly nested)
parameter hash (from a before filter?) looking for these things, and
then adding them back into params as standard English-formatted
numbers without the prefix.

Thoughts/feedback…?

Regards,
Isak

Hey Isak,

I currently working on the same problem. In my last projects I have
workaround with an own setter for the numbers. e.g.

the active-record model
class Article
def price=(value)
self.price = value.to_delocalized_decimal
end
end

and the String-class extension:

class String
def to_delocalized_decimal
return self if !self.is_a?(String) or self.blank?
BigDecimal.new(string.sub(’,’, ‘.’))
end
end

maybe this is usefull for your research-program. But i guess its better
to use extra methods to fill your database-field. In this case the
output would be also localized. e.g.

def localized_price=(value)
self.price = value.to_delocalized_decimal
end
def localized_price
price.to_delocalized_decimal # use another BigDecimal-extension
end

and the premium-version would be an ActiveRecord::Base-extension. Any
suggestions how to build such a plugin?

cheerio
benni

On 2.7.2008, at 12.46, Benjamin M. wrote:

end
maybe this is usefull for your research-program. But i guess its
better
to use extra methods to fill your database-field. In this case the
output would be also localized. e.g.

def localized_price=(value)
self.price = value.to_delocalized_decimal
end
def localized_price
price.to_delocalized_decimal # use another BigDecimal-extension
end

Just curious, but you do realize that to_delocalized_decimal is only
defined in the String class? That has two consequences: any other
object than a string will throw an exception. That’s ok, if you only
ever get strings as values. However, in that case (and anyway since
you’re defining the method in the String class) there’s no idea
checking whether self is a string in the to_delocalized_decimal
method. self.is_a?(String) will always return true when used inside a
method of the String class.

//jarkko


Jarkko L.

http://www.railsecommerce.com
http://odesign.fi

On 2.7.2008, at 21.00, Benjamin M. wrote:

end
def localized_price=(value)
<%= f.text_field :localized_price %>

But I guess, you have a solution more elegant? I’m dreaming of an
ActiveRecordPlugin, so I just have to write …

Sorry, I’ve just used a before_save filter defined in AR::Base. It
would be fairly easy to make a plugin out of that, all it takes is
some metaprogramming skills. If you aren’t familiar with
metaprogramming in Ruby, I highly recommend PragDave’s recent
screencasts
(Pragmatic Bookshelf: By Developers, For Developers
). They’ll cost you $5 a piece, but with the current state of the
dollar that’s not too much asked imho.

Cheers,
//jarkko


Jarkko L.

http://www.railsecommerce.com
http://odesign.fi

Hey Jarkko,
thanks for your comment. I give it another try:

the extensions

class String
def to_delocalized_decimal
BigDecimal.new(self.sub(’,’, ‘.’))
rescue
self
end
end
class BigDecimal
def to_localized_string(precision=2)
("%01.#{precision}f" % self).to_s.sub(’.’, ‘,’)
rescue
self.to_s
end
end

my ActiveRecord-Class

class Article < ActiveRecord::Base
def localized_price=(value)
self.price = value.to_delocalized_decimal unless value.blank?
end
def localized_price
price.to_localized_string if price
end
end

my new.html.erb


Price

<%= f.text_field :localized_price %>

But I guess, you have a solution more elegant? I’m dreaming of an
ActiveRecordPlugin, so I just have to write …

class Article
localized_decimal :price, :tax …
end

… and I got the two setter and getter methods for free. Anyone have an
idea how to make it?

Greetings
Benni