def format(*rules)
rules = normalize_formatting_rules(rules)
rules = localize_formatting_rules(rules)
if cents == 0
if rules[:display_free].respond_to?(:to_str)
return rules[:display_free]
elsif rules[:display_free]
return "free"
end
end
symbol_value =
if rules.has_key?(:symbol)
if rules[:symbol] === true
symbol
elsif rules[:symbol]
rules[:symbol]
else
""
end
elsif rules[:html]
currency.html_entity == '' ? currency.symbol : currency.html_entity
else
symbol
end
formatted = rules[:no_cents] ? "#{self.to_s.to_i}" : self.to_s
if rules[:no_cents_if_whole] && cents % currency.subunit_to_unit == 0
formatted = "#{self.to_s.to_i}"
end
symbol_position =
if rules.has_key?(:symbol_position)
rules[:symbol_position]
elsif currency.symbol_first?
:before
else
:after
end
if symbol_value && !symbol_value.empty?
formatted = if symbol_position == :before
"#{symbol_value}#{formatted}"
else
symbol_space = rules[:symbol_after_without_space] ? "" : " "
"#{formatted}#{symbol_space}#{symbol_value}"
end
end
if rules.has_key?(:decimal_mark) and rules[:decimal_mark] and
rules[:decimal_mark] != decimal_mark
formatted.sub!(decimal_mark, rules[:decimal_mark])
end
thousands_separator_value = thousands_separator
if rules.has_key?(:thousands_separator)
thousands_separator_value = rules[:thousands_separator] || ''
end
regexp_decimal = Regexp.escape(decimal_mark)
regexp_format = if formatted =~ /#{regexp_decimal}/
/(\d)(?=(?:\d{3})+(?:#{regexp_decimal}))/
else
/(\d)(?=(?:\d{3})+(?:[^\d]{1}|$))/
end
formatted.gsub!(regexp_format, "\\1#{thousands_separator_value}")
if rules[:with_currency]
formatted << " "
formatted << '<span class="currency">' if rules[:html]
formatted << currency.to_s
formatted << '</span>' if rules[:html]
end
formatted
end