sig/lib/money/money/formatter.rbs
class Money
class Formatter
DEFAULTS: Hash[Symbol, string]
# Creates a formatted price string according to several rules.
#
# @param [Hash] rules The options used to format the string.
#
# @return [String]
#
# @option rules [Boolean, String] :display_free (false) Whether a zero
# amount of money should be formatted of "free" or as the supplied string.
#
# @example
# Money.us_dollar(0).format(display_free: true) #=> "free"
# Money.us_dollar(0).format(display_free: "gratis") #=> "gratis"
# Money.us_dollar(0).format #=> "$0.00"
#
# @option rules [Boolean] :with_currency (false) Whether the currency name
# should be appended to the result string.
#
# @example
# Money.ca_dollar(100).format #=> "$1.00"
# Money.ca_dollar(100).format(with_currency: true) #=> "$1.00 CAD"
# Money.us_dollar(85).format(with_currency: true) #=> "$0.85 USD"
#
# @option rules [Boolean] :rounded_infinite_precision (false) Whether the
# amount of money should be rounded when using {infinite_precision}
#
# @example
# Money.us_dollar(100.1).format #=> "$1.001"
# Money.us_dollar(100.1).format(rounded_infinite_precision: true) #=> "$1"
# Money.us_dollar(100.9).format(rounded_infinite_precision: true) #=> "$1.01"
#
# @option rules [Boolean] :no_cents (false) Whether cents should be omitted.
#
# @example
# Money.ca_dollar(100).format(no_cents: true) #=> "$1"
# Money.ca_dollar(599).format(no_cents: true) #=> "$5"
#
# @option rules [Boolean] :no_cents_if_whole (false) Whether cents should be
# omitted if the cent value is zero
#
# @example
# Money.ca_dollar(10000).format(no_cents_if_whole: true) #=> "$100"
# Money.ca_dollar(10034).format(no_cents_if_whole: true) #=> "$100.34"
#
# @option rules [Boolean, String, nil] :symbol (true) Whether a money symbol
# should be prepended to the result string. The default is true. This method
# attempts to pick a symbol that's suitable for the given currency.
#
# @example
# Money.new(100, "USD") #=> "$1.00"
# Money.new(100, "GBP") #=> "£1.00"
# Money.new(100, "EUR") #=> "€1.00"
#
# # Same thing.
# Money.new(100, "USD").format(symbol: true) #=> "$1.00"
# Money.new(100, "GBP").format(symbol: true) #=> "£1.00"
# Money.new(100, "EUR").format(symbol: true) #=> "€1.00"
#
# # You can specify a false expression or an empty string to disable
# # prepending a money symbol.§
# Money.new(100, "USD").format(symbol: false) #=> "1.00"
# Money.new(100, "GBP").format(symbol: nil) #=> "1.00"
# Money.new(100, "EUR").format(symbol: "") #=> "1.00"
#
# # If the symbol for the given currency isn't known, then it will default
# # to "¤" as symbol.
# Money.new(100, "AWG").format(symbol: true) #=> "¤1.00"
#
# # You can specify a string as value to enforce using a particular symbol.
# Money.new(100, "AWG").format(symbol: "ƒ") #=> "ƒ1.00"
#
# # You can specify a indian currency format
# Money.new(10000000, "INR").format(south_asian_number_formatting: true) #=> "1,00,000.00"
# Money.new(10000000).format(south_asian_number_formatting: true) #=> "$1,00,000.00"
#
# @option rules [Boolean, nil] :symbol_before_without_space (true) Whether
# a space between the money symbol and the amount should be inserted when
# +:symbol_position+ is +:before+. The default is true (meaning no space). Ignored
# if +:symbol+ is false or +:symbol_position+ is not +:before+.
#
# @example
# # Default is to not insert a space.
# Money.new(100, "USD").format #=> "$1.00"
#
# # Same thing.
# Money.new(100, "USD").format(symbol_before_without_space: true) #=> "$1.00"
#
# # If set to false, will insert a space.
# Money.new(100, "USD").format(symbol_before_without_space: false) #=> "$ 1.00"
#
# @option rules [Boolean, nil] :symbol_after_without_space (false) Whether
# a space between the amount and the money symbol should be inserted when
# +:symbol_position+ is +:after+. The default is false (meaning space). Ignored
# if +:symbol+ is false or +:symbol_position+ is not +:after+.
#
# @example
# # Default is to insert a space.
# Money.new(100, "USD").format(symbol_position: :after) #=> "1.00 $"
#
# # If set to true, will not insert a space.
# Money.new(100, "USD").format(symbol_position: :after, symbol_after_without_space: true) #=> "1.00$"
#
# @option rules [Boolean, String, nil] :decimal_mark (true) Whether the
# currency should be separated by the specified character or '.'
#
# @example
# # If a string is specified, it's value is used.
# Money.new(100, "USD").format(decimal_mark: ",") #=> "$1,00"
#
# # If the decimal_mark for a given currency isn't known, then it will default
# # to "." as decimal_mark.
# Money.new(100, "FOO").format #=> "$1.00"
#
# @option rules [Boolean, String, nil] :thousands_separator (true) Whether
# the currency should be delimited by the specified character or ','
#
# @example
# # If a falsey value is specified, no thousands_separator is used.
# Money.new(100000, "USD").format(thousands_separator: false) #=> "1000.00"
# Money.new(100000, "USD").format(thousands_separator: nil) #=> "1000.00"
# Money.new(100000, "USD").format(thousands_separator: "") #=> "1000.00"
#
# # If true is specified, the locale or default thousands_separator is used.
# Money.new(100000, "USD").format(thousands_separator: true) #=> "1,000.00"
#
# # If a string is specified, it's value is used.
# Money.new(100000, "USD").format(thousands_separator: ".") #=> "$1.000.00"
#
# # If the thousands_separator for a given currency isn't known, then it will
# # default to "," as thousands_separator.
# Money.new(100000, "FOO").format #=> "$1,000.00"
#
# @option rules [Boolean] :html (false) Whether the currency should be
# HTML-formatted. Only useful in combination with +:with_currency+.
#
# @example
# Money.ca_dollar(570).format(html: true, with_currency: true)
# #=> "$5.70 <span class=\"currency\">CAD</span>"
#
# @option rules [Boolean] :html_wrap (false) Whether all currency parts should be HTML-formatted.
#
# @example
# Money.ca_dollar(570).format(html_wrap: true, with_currency: true)
# #=> "<span class=\"money-currency-symbol\">$</span><span class=\"money-whole\">5</span><span class=\"money-decimal-mark\">.</span><span class=\"money-decimal\">70</span> <span class=\"money-currency\">CAD</span>"
#
# @option rules [Boolean] :sign_before_symbol (false) Whether the sign should be
# before the currency symbol.
#
# @example
# # You can specify to display the sign before the symbol for negative numbers
# Money.new(-100, "GBP").format(sign_before_symbol: true) #=> "-£1.00"
# Money.new(-100, "GBP").format(sign_before_symbol: false) #=> "£-1.00"
# Money.new(-100, "GBP").format #=> "£-1.00"
#
# @option rules [Boolean] :sign_positive (false) Whether positive numbers should be
# signed, too.
#
# @example
# # You can specify to display the sign with positive numbers
# Money.new(100, "GBP").format(sign_positive: true, sign_before_symbol: true) #=> "+£1.00"
# Money.new(100, "GBP").format(sign_positive: true, sign_before_symbol: false) #=> "£+1.00"
# Money.new(100, "GBP").format(sign_positive: false, sign_before_symbol: true) #=> "£1.00"
# Money.new(100, "GBP").format(sign_positive: false, sign_before_symbol: false) #=> "£1.00"
# Money.new(100, "GBP").format #=> "£+1.00"
#
# @option rules [Boolean] :disambiguate (false) Prevents the result from being ambiguous
# due to equal symbols for different currencies. Uses the `disambiguate_symbol`.
#
# @example
# Money.new(10000, "USD").format(disambiguate: false) #=> "$100.00"
# Money.new(10000, "CAD").format(disambiguate: false) #=> "$100.00"
# Money.new(10000, "USD").format(disambiguate: true) #=> "$100.00"
# Money.new(10000, "CAD").format(disambiguate: true) #=> "C$100.00"
#
# @option rules [Boolean] :html_wrap_symbol (false) Wraps the currency symbol
# in a html <span> tag.
#
# @example
# Money.new(10000, "USD").format(disambiguate: false)
# #=> "<span class=\"currency_symbol\">$100.00</span>
#
# @option rules [Symbol] :symbol_position (:before) `:before` if the currency
# symbol goes before the amount, `:after` if it goes after.
#
# @example
# Money.new(10000, "USD").format(symbol_position: :before) #=> "$100.00"
# Money.new(10000, "USD").format(symbol_position: :after) #=> "100.00 $"
#
# @option rules [Boolean] :translate (true) `true` Checks for custom
# symbol definitions using I18n.
#
# @example
# # With the following entry in the translation files:
# # en:
# # number:
# # currency:
# # symbol:
# # CAD: "CAD$"
# Money.new(10000, "CAD").format(translate: true) #=> "CAD$100.00"
#
# @option rules [Boolean] :drop_trailing_zeros (false) Ignore trailing zeros after
# the decimal mark
#
# @example
# Money.new(89000, :btc).format(drop_trailing_zeros: true) #=> B⃦0.00089
# Money.new(110, :usd).format(drop_trailing_zeros: true) #=> $1.1
#
# @option rules [Boolean] :delimiter_pattern (/(\d)(?=(?:\d{3})+(?:[^\d]{1}|$))/) Regular expression to set the placement
# for the thousands delimiter
#
# @example
# Money.new(89000, :btc).format(delimiter_pattern: /(\d)(?=\d)/) #=> B⃦8,9,0.00
#
# @option rules [String] :format (nil) Provide a template for formatting. `%u` will be replaced
# with the symbol (if present) and `%n` will be replaced with the number.
#
# @example
# Money.new(10000, "USD").format(format: '%u %n') #=> "$ 100.00"
# Money.new(10000, "USD").format(format: '<span>%u%n</span>') #=> "<span>$100.00</span>"
#
# Note that the default rules can be defined through {Money.default_formatting_rules} hash.
#
# @see Money.default_formatting_rules Money.default_formatting_rules for more information.
def initialize: (untyped money, *untyped rules) -> void
def to_s: () -> string
def thousands_separator: () -> string
def decimal_mark: () -> string
alias delimiter thousands_separator
alias separator decimal_mark
private
attr_reader money: Money
attr_reader currency: Currency
attr_reader rules: FormattingRules
def format_number: () -> string
def append_sign: (untyped formatted_number) -> string
def append_currency_symbol: (untyped formatted_number) -> string
def show_free_text?: () -> untyped
def html_wrap: (string string, string class_name) -> ::String
def free_text: () -> (untyped | "free")
def format_whole_part: (untyped value) -> untyped
def extract_whole_and_decimal_parts: () -> Array[string]
def format_decimal_part: (untyped value) -> (nil | string)
def lookup: (Symbol key) -> untyped
def lookup_default: (Symbol key) -> untyped
def symbol_value_from: (Hash[Symbol, untyped] rules) -> (untyped | untyped | "" | untyped)
end
end