Packages
localize
0.6.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.41.3
0.41.2
0.41.1
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.1
0.30.0
retired
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
0.1.0-alpha.1
Localization (parsing, formatting) of numbers, dates/time/calendar, units of measure, messages and lists. Includes localized collation.
Current section
Files
Jump to
Current section
Files
lib/localize/number/symbol.ex
defmodule Localize.Number.Symbol do
@moduledoc """
Functions to manage the number symbol definitions for a locale
and number system.
Number symbols define the characters used for decimal separators,
grouping separators, percent signs, and other formatting elements.
Each locale may define symbols for one or more number systems
(e.g., `:latn`, `:arab`, `:thai`).
Symbol data is retrieved at runtime from locale data via the
configured locale provider.
"""
defstruct [
:decimal,
:group,
:exponential,
:infinity,
:list,
:minus_sign,
:nan,
:per_mille,
:percent_sign,
:plus_sign,
:superscripting_exponent,
:time_separator,
:approximately_sign
]
@type t :: %__MODULE__{
decimal: String.t() | map(),
group: String.t() | map(),
exponential: String.t(),
infinity: String.t(),
list: String.t(),
minus_sign: String.t(),
nan: String.t(),
per_mille: String.t(),
percent_sign: String.t(),
plus_sign: String.t(),
superscripting_exponent: String.t(),
time_separator: String.t(),
approximately_sign: String.t()
}
@doc """
Returns a map of `Localize.Number.Symbol.t()` structs of the
number symbols for each number system of a locale.
### Arguments
* `locale` is a locale identifier atom, string, or a
`t:Localize.LanguageTag.t/0` struct.
### Returns
* `{:ok, symbols_map}` where `symbols_map` is a map of
`%{system_name => Localize.Number.Symbol.t()}`.
* `{:error, exception}` if the locale data cannot be loaded.
"""
@spec number_symbols_for(Localize.LanguageTag.t() | atom() | String.t()) ::
{:ok, map()} | {:error, Exception.t()}
def number_symbols_for(locale) do
locale_id = to_locale_id(locale)
Localize.Locale.get(locale_id, [:number_symbols])
end
@doc """
Returns the number symbols for a specific locale and number system.
### Arguments
* `locale` is a locale identifier atom, string, or a
`t:Localize.LanguageTag.t/0` struct.
* `number_system` is a number system name atom or string
(e.g., `:latn`, `:arab`).
### Returns
* `{:ok, Localize.Number.Symbol.t()}` with the symbols for the
requested number system.
* `{:error, exception}` if the locale data cannot be loaded or
no symbols exist for the number system.
"""
@spec number_symbols_for(Localize.LanguageTag.t() | atom() | String.t(), atom() | String.t()) ::
{:ok, t()} | {:error, Exception.t()}
def number_symbols_for(locale, number_system) do
system_name = to_system_atom(number_system)
with {:ok, symbols} <- number_symbols_for(locale) do
case Map.get(symbols, system_name) do
nil ->
locale_id = to_locale_id(locale)
{:error,
Localize.InvalidValueError.exception(
value: number_system,
expected: "a valid number system for locale #{inspect(locale_id)}",
context: "Localize.Number.Symbol.number_symbols_for/2"
)}
symbol ->
{:ok, symbol}
end
end
end
# ── Private helpers ──────────────────────────────────────────
defp to_locale_id(locale), do: Localize.Locale.to_locale_id(locale)
defp to_system_atom(system) when is_atom(system), do: system
defp to_system_atom(system) when is_binary(system), do: String.to_atom(system)
end