defmodule Cldr.Number.Symbol do @moduledoc """ Functions to manage the symbol definitions for a locale and number system. """ alias Cldr.Locale alias Cldr.LanguageTag alias Cldr.Number.System defstruct [ :decimal, :group, :exponential, :infinity, :list, :minus_sign, :nan, :per_mille, :percent_sign, :plus_sign, :superscripting_exponent, :time_separator ] @type t :: %__MODULE__{ decimal: String.t(), group: String.t(), 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() } @doc """ Returns a map of `Cldr.Number.Symbol.t` structs of the number symbols for each of the number systems of a locale. ## Arguments * `locale` is any valid locale name returned by `Cldr.known_locale_names/1` or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`. The default is `Cldr.get_locale/1`. * `backend` is any module that includes `use Cldr` and therefore is a `Cldr` backend module ## Example: iex> Cldr.Number.Symbol.number_symbols_for("th", TestBackend.Cldr) { :ok, %{ latn: %Cldr.Number.Symbol{ decimal: %{standard: "."}, exponential: "E", group: %{standard: ","}, infinity: "∞", list: ";", minus_sign: "-", nan: "NaN", per_mille: "‰", percent_sign: "%", plus_sign: "+", superscripting_exponent: "×", time_separator: ":" }, thai: %Cldr.Number.Symbol{ decimal: %{standard: "."}, exponential: "E", group: %{standard: ","}, infinity: "∞", list: ";", minus_sign: "-", nan: "NaN", per_mille: "‰", percent_sign: "%", plus_sign: "+", superscripting_exponent: "×", time_separator: ":" } } } """ @spec number_symbols_for(Locale.locale_reference(), Cldr.backend()) :: {:ok, map()} | {:error, {module(), String.t()}} def number_symbols_for(locale, backend) do Module.concat(backend, Number.Symbol).number_symbols_for(locale) end @doc """ Returns the number symbols for a specific locale and number system. ## Options * `locale` is any valid locale name returned by `Cldr.known_locale_names/1` or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`. The default is `Cldr.get_locale/1`. * `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` * `backend` is any module that includes `use Cldr` and therefore is a `Cldr` backend module ## Example iex> Cldr.Number.Symbol.number_symbols_for("th", "thai", TestBackend.Cldr) { :ok, %Cldr.Number.Symbol{ decimal: %{standard: "."}, exponential: "E", group: %{standard: ","}, infinity: "∞", list: ";", minus_sign: "-", nan: "NaN", per_mille: "‰", percent_sign: "%", plus_sign: "+", superscripting_exponent: "×", time_separator: ":" } } """ @spec number_symbols_for( Locale.locale_reference(), System.system_name(), Cldr.backend() ) :: {:ok, map()} | {:error, {Cldr.NoNumberSymbols, String.t()}} def number_symbols_for(%LanguageTag{} = locale, number_system, backend) do with {:ok, system_name} <- Cldr.Number.System.system_name_from(number_system, locale, backend), {:ok, symbols} <- number_symbols_for(locale, backend) do symbols |> Map.get(system_name) |> symbols_return(locale, number_system) end end def number_symbols_for(locale_name, number_system, backend) do with {:ok, locale} <- Cldr.validate_locale(locale_name, backend) do number_symbols_for(locale, number_system, backend) end end @doc """ Returns a list of all decimal symbols defined by the locales configured in the given backend as a list. ## Arguments * `backend` is any module that includes `use Cldr` and therefore is a `Cldr` backend module """ def all_decimal_symbols(backend) do Module.concat(backend, Number.Symbol).all_decimal_symbols end @doc """ Returns a list of all grouping symbols defined by the locales configured in the given backend as a list. ## Arguments * `backend` is any module that includes `use Cldr` and therefore is a `Cldr` backend module """ def all_grouping_symbols(backend) do Module.concat(backend, Number.Symbol).all_grouping_symbols end @doc """ Returns a list of all decimal symbols defined by the locales configured in the given backend as a string. This string can be used as a character class when builing a regular expression. ## Arguments * `backend` is any module that includes `use Cldr` and therefore is a `Cldr` backend module """ def all_decimal_symbols_class(backend) do Module.concat(backend, Number.Symbol).all_decimal_symbols_class end @doc """ Returns a list of all grouping symbols defined by the locales configured in the given backend as a string. This string can be used as a character class when builing a regular expression. ## Arguments * `backend` is any module that includes `use Cldr` and therefore is a `Cldr` backend module """ def all_grouping_symbols_class(backend) do Module.concat(backend, Number.Symbol).all_grouping_symbols_class end @doc false def 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 @doc false def symbols_return(symbols, _locale, _number_system) do {:ok, symbols} end end