def number_to_currency_in_words number, options = {}
options.symbolize_keys!
currency_in_words = I18n.translate('number.currency_in_words''number.currency_in_words', :locale => options[:locale], :default => {})
defaults = DEFAULT_CURRENCY_IN_WORDS_VALUES.merge(currency_in_words)
options = defaults.merge!(options)
unless options[:currencies].has_key?(:default)
options[:currencies].merge!(DEFAULT_CURRENCY_IN_WORDS_VALUES[:currencies])
end
format = options.delete(:format)
currency = options.delete(:currency)
currencies = options.delete(:currencies)
options[:currency] = currency && currencies.has_key?(currency) ? currencies[currency] : currencies[:default]
options[:locale] ||= I18n.default_locale
if number.to_f < 0
format = options.delete(:negative_format)
number = number.respond_to?("abs") ? number.abs : number.sub(/^-/, '')
end
options_precision = {
:precision => 2,
:delimiter => '',
:significant => false,
:strip_insignificant_zeros => false,
:separator => '.',
:raise => true
}
begin
rounded_number = number_with_precision(number, options_precision)
rescue ActionView::Helpers::NumberHelper::InvalidNumberError => e
if options[:raise]
raise
else
rounded_number = format.gsub(/%n/, e.number)
return e.number.to_s.html_safe? ? rounded_number.html_safe : rounded_number
end
end
begin
klass = "CurrencyInWords::#{options[:locale].to_s.capitalize}Texterizer".constantize
rescue NameError
if options[:raise]
raise NameError, "Implement a class #{options[:locale].to_s.capitalize}Texterizer to support this locale, please."
else
klass = EnTexterizer
end
end
number_parts = rounded_number.split(options_precision[:separator]).map(&:to_i)
texterizer = CurrencyInWords::Texterizer.new(klass.new, number_parts, options)
texterized_number = texterizer.texterize
format.gsub(/%n/, texterized_number).html_safe
end