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 list of the number symbols for all number systems of a locale.
* `locale` is any locale known to `Cldr`. See `Cldr.known_locales()`.
## Example:
iex> Symbol.number_symbols_for(Cldr.Locale.new("th"))
[latn: %{decimal: ".", exponential: "E", group: ",", infinity: "∞", list: ";",
minus_sign: "-", nan: "NaN", per_mille: "‰", percent_sign: "%",
plus_sign: "+", superscripting_exponent: "×", time_separator: ":"},
thai: %{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) :: Keyword.t
def number_symbols_for(locale \\ Cldr.get_current_locale())
for locale <- Cldr.Config.known_locales() do
symbols =
locale
|> Cldr.Config.get_locale
|> Map.get(:number_symbols)
def number_symbols_for(%LanguageTag{cldr_locale_name: unquote(locale)}) do
symbols =
unquote(Macro.escape(symbols))
|> Enum.map(fn
{k, nil} -> {k, nil}
{k, v} -> {k, struct(__MODULE__, v)}
end)
|> Enum.into(%{})
{:ok, symbols}
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.
* `locale` is any locale known to `Cldr`. See `Cldr.known_locales()`.
* `number_system` which defaults to `:default` and is either:
* an `atom` in which case it is interpreted as a `number system type`
in the given locale. Typically this would be either `:default` or
`:native`. See `Cldr.Number.Format.format_types_for/1` for the number
system types available for a given `locale`.
* a `binary` in which case it is used to look up the number system
directly (for exmple `"latn"` which is common for western european
languages). See `Cldr.Number.Format.formats_for/1` for the
available formats for a `locale`.
## Example
iex> Cldr.Number.Symbol.number_symbols_for(Cldr.Locale.new("th"), "thai")
%{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, atom | binary) ::
{:ok, Map.t} | {:no_symbols, String.t} | {:error, 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)
|> get_symbols_return(locale, number_system)
else
{:error, reason} -> {:error, reason}
end
end
defp get_symbols_return(nil, locale, number_system) do
{:no_symbols, "The locale #{inspect locale} does not have " <>
"any symbols for number system #{inspect number_system}"}
end
defp get_symbols_return(symbols, _locale, _number_system) do
{:ok, symbols}
end
end