Packages
ex_cldr_numbers
1.4.3
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/rbnf.ex
defmodule Cldr.Rbnf do
@moduledoc """
Functions to implement Rules Based Number Formatting (rbnf)
During compilation RBNF rules are extracted and generated
as function bodies by `Cldr.Rbnf.Ordinal`, `Cldr.Rbnf.Cardinal`
and `Cldr.Rbnf.NumberSystem`.
The functions in this module would not normally be of common
use outside of supporting the compilation phase.
"""
@doc """
Returns the list of locales that that have RBNF defined
This list is the set of known locales for which
there are rbnf rules defined.
"""
require Cldr
alias Cldr.Locale
alias Cldr.LanguageTag
def known_locale_names do
Cldr.known_rbnf_locale_names()
end
@doc """
Returns {:ok, rbnf_rules} for a `locale` or `{:error, {Cldr.NoRbnf, info}}`
* `locale` is any locale name returned by `Cldr.Rbnf.known_locale_names/0`.
or a `Cldr.LanguageTag`
"""
@spec for_locale(Locale.t()) :: %{} | nil
def for_locale(locale \\ Cldr.get_current_locale())
def for_locale(%LanguageTag{rbnf_locale_name: nil} = language_tag) do
{:error, rbnf_locale_error(language_tag)}
end
def for_locale(%LanguageTag{rbnf_locale_name: rbnf_locale_name}) do
rbnf_data =
rbnf_locale_name
|> Cldr.Config.get_locale()
|> Map.get(:rbnf)
{:ok, rbnf_data}
end
def for_locale(locale) when is_binary(locale) do
with {:ok, language_tag} <- Cldr.Locale.canonical_language_tag(locale) do
for_locale(language_tag)
end
end
@doc """
Returns rbnf_rules for a `locale` or raises an exception if
there are no rules.
* `locale` is any locale name returned by `Cldr.Rbnf.known_locale_names/0`.
or a `Cldr.LanguageTag`
"""
def for_locale!(locale) do
case for_locale(locale) do
{:ok, rules} -> rules
{:error, {exception, reason}} -> raise exception, reason
end
end
@doc """
Returns a map that merges all rules by the primary dimension of
RuleGroup, within which rbnf rules are keyed by locale.
This function is primarily intended to support compile-time generation
of functions to process rbnf rules.
"""
@spec for_all_locales :: %{}
def for_all_locales do
Enum.map(known_locale_names(), fn locale_name ->
locale = Locale.new!(locale_name)
Enum.map(for_locale!(locale), fn {group, sets} ->
{group, %{locale_name => sets}}
end)
|> Enum.into(%{})
end)
|> Cldr.Map.merge_map_list()
end
def rbnf_locale_error(locale_name) when is_binary(locale_name) do
{Cldr.Rbnf.NotAvailable, "RBNF is not available for the locale #{inspect(locale_name)}"}
end
def rbnf_rule_error(
%LanguageTag{rbnf_locale_name: nil, cldr_locale_name: cldr_locale_name},
_format
) do
{Cldr.Rbnf.NotAvailable, "RBNF is not available for the locale #{inspect(cldr_locale_name)}"}
end
def rbnf_rule_error(%LanguageTag{rbnf_locale_name: rbnf_locale_name}, format) do
{
Cldr.Rbnf.NoRule,
"Locale #{inspect(rbnf_locale_name)} does not define an rbnf ruleset #{inspect(format)}"
}
end
if Mix.env() == :test do
# Returns all the rules in rbnf without any tagging for rulegroup or set.
# This is helpful for testing only.
@doc false
def all_rules do
# Get sets from groups
# Get rules from set
# Get the list of rules
known_locale_names()
|> Enum.map(&Cldr.Locale.new!/1)
|> Enum.map(&for_locale!/1)
|> Enum.flat_map(&Map.values/1)
|> Enum.flat_map(&Map.values/1)
|> Enum.flat_map(& &1.rules)
end
# Returns a list of unique rule definitions. Used for testing.
@doc false
def all_rule_definitions do
all_rules()
|> Enum.map(& &1.definition)
|> Enum.uniq()
end
end
end