Current section

Files

Jump to
ex_cldr_numbers lib number symbol.ex
Raw

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