Packages
ex_cldr_numbers
2.13.0
2.38.3
2.38.2
2.38.1
2.38.0
2.37.0
2.36.0
2.35.2
2.35.1
2.35.0
2.34.1
2.34.0
2.33.6
2.33.5
2.33.4
2.33.3
2.33.2
2.33.1
2.33.0
2.32.4
2.32.3
2.32.2
2.32.1
2.32.0
retired
2.31.3
retired
2.31.2
2.31.1
2.31.0
2.30.1
2.30.0
2.29.0
2.28.0
2.27.3
2.27.2
2.27.1
2.27.0
2.26.0
2.25.2
2.25.1
2.25.0
2.24.0
2.23.3
2.23.2
2.23.1
2.23.0
2.23.0-rc.4
2.23.0-rc.3
2.23.0-rc.2
2.23.0-rc.1
2.23.0-rc.0
2.22.1
2.22.0
2.21.0
2.20.0
2.19.0
2.18.4
2.18.3
2.18.2
2.18.1
2.18.0
2.17.0
2.17.0-rc.1
2.17.0-rc.0
2.16.1
2.16.0
2.16.0-rc.0
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.0
2.13.2
2.13.1
2.13.0
2.13.0-rc.0
2.12.1
2.12.0
2.11.0
2.10.0
2.9.0
2.8.0
2.7.2
2.7.1
2.7.0
2.6.4
2.6.3
2.6.2
2.6.1
2.6.0
2.5.0
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.1
2.1.0
2.0.0
2.0.0-rc.0
1.6.0
1.5.2
1.5.1
1.5.0
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.3.0-rc.1
1.3.0-rc.0
retired
1.2.0
1.1.0
1.0.1
1.0.0
1.0.0-rc.0
retired
0.3.3
0.3.2
retired
0.3.1
retired
0.3.0
retired
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Number and currency localization and formatting functions for the Common Locale Data Repository (CLDR).
Current section
Files
Jump to
Current section
Files
lib/cldr/number/backend/decimal_formatter.ex
defmodule Cldr.Number.Backend.Decimal.Formatter do
@moduledoc false
def define_number_module(config) do
alias Cldr.Number.Formatter.Decimal
backend = config.backend
quote location: :keep do
defmodule Number.Formatter.Decimal do
unless Cldr.Config.include_module_docs?(unquote(config.generate_docs)) do
@moduledoc false
end
alias Cldr.Number.Formatter.Decimal
alias Cldr.Number.Format.Compiler
alias Cldr.Number.Format.Meta
alias Cldr.Number.Format.Options
alias Cldr.Math
@doc """
Formats a number according to a decimal format string.
## Arguments
* `number` is an integer, float or Decimal
* `format` is a format string. See `#{inspect(unquote(backend))}.Number` for further information.
* `options` is a map of options. See `#{inspect(unquote(backend))}.Number.to_string/2`
for further information.
"""
@spec to_string(
Math.number_or_decimal(),
String.t() | Meta.t(),
Keyword.t() | Options.t()
) ::
{:ok, String.t()} | {:error, {module(), String.t()}}
def to_string(number, format, options \\ [])
def to_string(number, format, options) when is_binary(format) and is_list(options) do
with {:ok, options} <- Options.validate_options(number, unquote(backend), options) do
to_string(number, format, options)
end
end
# Precompile the known formats and build the formatting pipeline
# specific to this format thereby optimizing the performance.
unquote(Decimal.define_to_string(backend))
# Other number formatting systems may create the formatting
# metadata by other means (like a printf function) in which
# case we don't do anything except format
def to_string(number, %Meta{} = meta, %Options{} = options) do
meta = Decimal.update_meta(meta, number, unquote(backend), options)
Decimal.do_to_string(number, meta, unquote(backend), options)
end
def to_string(number, %Meta{} = meta, options) do
with {:ok, options} <- Options.validate_options(number, unquote(backend), options) do
to_string(number, meta, options)
end
end
# For formats not precompiled we need to compile first
# and then process. This will be slower than a compiled
# format since we have to (a) compile the format and (b)
# execute the full formatting pipeline.
require Compiler
def to_string(number, format, %Options{} = options) when is_binary(format) do
Compiler.maybe_log_compile_warning(format, unquote(config),
"ex_cldr_numbers: number format #{inspect format} is being compiled. " <>
"For performance reasons please consider adding this format to the " <>
"`precompile_number_formats` list in the backend configuration.")
case Compiler.format_to_metadata(format) do
{:ok, meta} ->
meta = Decimal.update_meta(meta, number, unquote(backend), options)
Decimal.do_to_string(number, meta, unquote(backend), options)
{:error, message} ->
{:error, {Cldr.FormatCompileError, message}}
end
end
end
end
end
end