Packages
ex_cldr_numbers
1.5.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/number/symbol.ex
defmodule Cldr.Number.Symbol do
@moduledoc """
Functions to manage the symbol definitions for a locale and
number system.
"""
require Cldr
alias Cldr.Number
alias Cldr.Locale
alias Cldr.LanguageTag
defstruct [
:decimal,
:group,
:exponential,
:infinity,
:list,
:minus_sign,
:nan,
:per_mille,
:percent_sign,
:plus_sign,
:superscripting_exponent,
:time_separator
]
@doc """
Returns a map of `Cldr.Number.Symbol.t` structs of the number symbols for each
of the number systems of a locale.
## Options
* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`
or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/1`. The
default is `Cldr.get_current_locale/0`.
## Example:
iex> Cldr.Number.Symbol.number_symbols_for("th")
{:ok, %{
latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
infinity: "∞",
list: ";",
minus_sign: "-",
nan: "NaN",
per_mille: "‰",
percent_sign: "%",
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
},
thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
infinity: "∞",
list: ";",
minus_sign: "-",
nan: "NaN",
per_mille: "‰",
percent_sign: "%",
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
}
}}
"""
@spec number_symbols_for(LanguageTag.t() | Locale.locale_name()) :: Keyword.t()
def number_symbols_for(locale \\ Cldr.get_current_locale())
for locale <- Cldr.Config.known_locale_names() do
symbols =
locale
|> Cldr.Config.get_locale()
|> Map.get(:number_symbols)
|> Enum.map(fn
{k, nil} -> {k, nil}
{k, v} -> {k, struct(@struct, v)}
end)
|> Enum.into(%{})
def number_symbols_for(%LanguageTag{cldr_locale_name: unquote(locale)}) do
{:ok, unquote(Macro.escape(symbols))}
end
end
def number_symbols_for(locale_name) when is_binary(locale_name) do
with {:ok, locale} <- Cldr.validate_locale(locale_name) do
number_symbols_for(locale)
end
end
def number_symbols_for(locale) do
{:error, Locale.locale_error(locale)}
end
@doc """
Returns the number sysbols for a specific locale and number system.
## Options
* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`
or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/1`. The
default is `Cldr.get_current_locale/0`.
* `number_system` is any number system name returned by
`Cldr.known_number_systems/0` or a number system type
returned by `Cldr.known_number_system_types/0`
## Example
iex> Cldr.Number.Symbol.number_symbols_for("th", "thai")
{:ok, %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
infinity: "∞",
list: ";",
minus_sign: "-",
nan: "NaN",
per_mille: "‰",
percent_sign: "%",
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
}}
"""
@spec number_symbols_for(LanguageTag.t() | Locale.locale_name(), System.system_name()) ::
{:ok, Map.t()} | {:error, {Cldr.NoNumberSymbols, String.t()}}
def number_symbols_for(%LanguageTag{} = locale, number_system) do
with {:ok, system_name} <- Number.System.system_name_from(number_system, locale),
{:ok, symbols} <- number_symbols_for(locale) do
symbols
|> Map.get(system_name)
|> symbols_return(locale, number_system)
end
end
def number_symbols_for(locale_name, number_system) when is_binary(locale_name) do
with {:ok, locale} <- Cldr.validate_locale(locale_name) do
number_symbols_for(locale, number_system)
end
end
defp symbols_return(nil, locale, number_system) do
{
:error,
{
Cldr.NoNumberSymbols,
"The locale #{inspect(locale)} does not have " <>
"any symbols for number system #{inspect(number_system)}"
}
}
end
defp symbols_return(symbols, _locale, _number_system) do
{:ok, symbols}
end
end