Class: Latinum::Formatters::DecimalCurrencyFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/latinum/formatters.rb

Overview

Formats a currency using a standard decimal notation.

Instance Method Summary collapse

Constructor Details

#initialize(**options) ⇒ DecimalCurrencyFormatter

Returns a new instance of DecimalCurrencyFormatter.



46
47
48
49
50
51
52
53
54
# File 'lib/latinum/formatters.rb', line 46

def initialize(**options)
	@symbol = options[:symbol] || '$'
	@separator = options[:separator] || '.'
	@delimiter = options[:delimiter] || ','
	@places = options[:precision] || 2
	@zero = options[:zero] || '0'
	
	@name = options[:name]
end

Instance Method Details

#format(amount, places: @places, **options) ⇒ Object

Formats the amount using the configured symbol, separator, delimiter, and places. e.g. “$5,000.00 NZD”. Rounds the amount to the specified number of decimal places.



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/latinum/formatters.rb', line 71

def format(amount, places: @places, **options)
	# Round to the desired number of places. Truncation used to be the default.
	amount = amount.round(places).to_d
	
	integral, fraction = amount.abs.to_s('F').split(/\./, 2)
	
	# The sign of the number
	sign = '-' if amount < 0
	
	# Decimal places, e.g. the '.00' in '$10.00'
	fraction = fraction[0...places].ljust(places, @zero)
	
	# Grouping, e.g. the ',' in '$10,000.00'
	remainder = integral.size % 3
	groups = integral[remainder..-1].scan(/.{3}/).to_a
	groups.unshift(integral[0...remainder]) if remainder > 0
	
	symbol = options.fetch(:symbol, @symbol)
	value = "#{sign}#{symbol}#{groups.join(@delimiter)}"
	
	name = options.fetch(:name, @name)
	suffix = name ? " #{name}" : ''
	
	if places > 0
		"#{value}#{@separator}#{fraction}#{suffix}"
	else
		"#{value}#{suffix}"
	end
end

#from_integral(amount) ⇒ Object

Converts the amount to a decimal, taking into account the number of specified decimal places.



111
112
113
# File 'lib/latinum/formatters.rb', line 111

def from_integral(amount)
	(amount.to_d / 10**@places)
end

#parse(string) ⇒ Object

Parse a string into an amount using the configured separator and delimiter.



62
63
64
65
66
# File 'lib/latinum/formatters.rb', line 62

def parse(string)
	BigDecimal(
		string.gsub(/[^\-0-9#{@separator}]/, '').gsub(@separator, '.')
	)
end

#round(amount) ⇒ Object



56
57
58
# File 'lib/latinum/formatters.rb', line 56

def round(amount)
	return amount.round(@places)
end

#to_integral(amount) ⇒ Object

Converts the amount directly to an integer, truncating any decimal part, taking into account the number of specified decimal places.



104
105
106
# File 'lib/latinum/formatters.rb', line 104

def to_integral(amount)
	(amount * 10**@places).to_i
end