Packages

ex_cldr

0.0.5
2.47.5 2.47.4 2.47.3 2.47.2 2.47.1 2.47.0 2.46.0 2.45.2 2.45.1 2.45.0 2.44.1 2.44.0 2.43.2 2.43.1 2.43.0 2.42.0 2.41.1 2.41.0 2.40.4 2.40.3 2.40.2 2.40.1 2.40.0 2.39.2 2.39.1 2.39.0 2.38.1 2.38.0 2.37.5 2.37.4 2.37.3 retired 2.37.2 2.37.1 2.37.0 2.36.0 2.35.1 2.35.0 retired 2.34.2 2.34.1 2.34.0 2.33.2 2.33.1 2.33.1-rc.0 2.33.0 2.32.1 2.32.0 2.31.0 2.30.0 2.29.0 2.28.0 2.27.1 2.27.0 retired 2.26.3 2.26.2 2.26.1 2.26.0 2.25.0 2.24.2 2.24.1 2.24.0 2.24.0-rc.6 2.24.0-rc.5 2.24.0-rc.4 2.24.0-rc.3 2.24.0-rc.2 2.24.0-rc.1 2.24.0-rc.0 2.23.2 2.23.1 2.23.0 2.22.1 2.22.0 2.21.0 2.20.0 2.20.0-rc.3 2.20.0-rc.2 2.20.0-rc.1 2.20.0-rc.0 2.19.1 2.19.0 2.18.2 2.18.1 2.18.0 2.18.0-rc.0 2.17.2 2.17.1 2.17.0 2.16.2 2.16.1 2.16.1-rc.0 2.16.0 2.15.0 2.14.1 2.14.0 2.14.0-rc.0 2.13.0 2.12.1 2.12.0 2.11.1 2.11.0 2.10.2 2.10.1 2.10.0 retired 2.9.0 2.8.1 2.8.0 2.7.2 2.7.1 2.7.0 2.6.2 2.6.1 2.6.0 2.5.0 2.4.3 2.4.2 2.4.1 2.4.0 2.3.2 2.3.1 2.3.0 2.2.7 2.2.6 2.2.5 2.2.4 2.2.3 2.2.2 2.2.1 2.2.0 2.1.0 2.0.4 2.0.3 2.0.2 2.0.1 2.0.0 2.0.0-rc.3 retired 2.0.0-rc.2 retired 2.0.0-rc.1 retired 2.0.0-rc.0 retired 1.8.2 1.8.1 1.8.0 1.7.1 1.7.0 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.2 1.5.1 1.5.0 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 retired 1.4.0-rc.3 retired 1.4.0-rc.2 retired 1.4.0-rc.1 retired 1.4.0-rc.0 retired 1.3.2 1.3.1 1.3.0 1.2.0 1.1.0 1.0.0 1.0.0-rc.3 retired 1.0.0-rc.2 retired 1.0.0-rc.1 retired 1.0.0-rc.0 retired 0.13.1 0.13.0 0.12.2 retired 0.12.1 retired 0.12.0 retired 0.11.0 retired 0.10.0 retired 0.9.0 retired 0.8.3 retired 0.8.2 retired 0.8.1 retired 0.8.0 retired 0.7.0 retired 0.6.2 retired 0.6.1 retired 0.6.0 retired 0.5.2 retired 0.5.1 retired 0.5.0 retired 0.4.2 retired 0.4.1 retired 0.4.0 retired 0.3.0 retired 0.2.1 retired 0.2.0 retired 0.1.3 retired 0.1.2 retired 0.1.1 retired 0.1.0 retired 0.0.20 retired 0.0.19 retired 0.0.18 retired 0.0.17 retired 0.0.16 retired 0.0.15 retired 0.0.14 retired 0.0.13 retired 0.0.12 retired 0.0.11 retired 0.0.10 retired 0.0.8 retired 0.0.7 retired 0.0.6 retired 0.0.5 retired 0.0.4 retired 0.0.3 retired

Common Locale Data Repository (CLDR) functions for Elixir to localize and format numbers, dates, lists, messages, languages, territories and units with support for over 700 locales for internationalized (i18n) and localized (L10N) applications.

Retired package: Deprecated

Current section

Files

Jump to
ex_cldr lib mix support normalize normalize_number.ex
Raw

lib/mix/support/normalize/normalize_number.ex

defmodule Cldr.Normalize.Number do
@moduledoc """
Takes the `number` part of the locale map and transforms the formats
into a more easily processable structure
"""
alias Cldr.Number
@doc """
Normalize decimal formats for a locale.
* `locale` is the full locale map from CLDR. The map is transformed and
returned so that further processing may occur
"""
def normalize(content, locale) do
content
|> normalize_formats(locale)
|> normalize_symbols(locale)
end
def normalize_formats(content, _locale) do
numbers = get_in(content, ["numbers"])
number_systems = number_system_names_from(numbers)
number_formats = Enum.reduce number_systems, %{}, fn (number_system, formats) ->
decimal_formats = numbers["decimal_formats_number_system_#{number_system}"]
currency_formats = numbers["currency_formats_number_system_#{number_system}"]
scientific_formats = numbers["scientific_formats_number_system_#{number_system}"]
percent_formats = numbers["percent_formats_number_system_#{number_system}"]
decimal_long_format = get_in(decimal_formats, ["long", "decimal_format"])
decimal_short_format = get_in(decimal_formats, ["short", "decimal_format"])
currency_short_format = get_in(currency_formats, ["short", "standard"])
locale_formats = %Number.Format{
standard: decimal_formats["standard"],
decimal_long: normalize_short_format(decimal_long_format),
decimal_short: normalize_short_format(decimal_short_format),
currency: currency_formats["standard"],
currency_short: normalize_short_format(currency_short_format),
currency_long: currency_long_format(currency_formats),
accounting: currency_formats["accounting"],
scientific: scientific_formats["standard"],
percent: percent_formats["standard"],
currency_spacing: currency_formats["currency_spacing"],
}
Map.put(formats, number_system, locale_formats)
end
content = Map.put(content, "minimum_grouping_digits",
String.to_integer(numbers["minimum_grouping_digits"]))
Map.put(content, "number_formats", Enum.into(number_formats, %{}))
end
def normalize_symbols(content, _locale) do
numbers = get_in(content, ["numbers"])
number_systems = number_system_names_from(numbers)
symbols = Enum.reduce number_systems, %{}, fn (number_system, number_symbols) ->
symbols = get_in(numbers, ["symbols_number_system_#{number_system}"])
Map.put(number_symbols, number_system, symbols)
end
Map.put(content, "number_symbols", symbols)
end
def number_system_names_from(numbers) do
default = numbers["default_numbering_system"]
others = Map.values(numbers["other_numbering_systems"])
([default] ++ others)
|> Enum.uniq
end
@spec normalize_short_format(Map.t) :: List.t
def normalize_short_format(nil) do
nil
end
def normalize_short_format(format) do
format
|> Enum.group_by(fn {range, _rules} -> List.first(String.split(range,"_")) end)
|> Enum.map(fn {range, rules} -> {String.to_integer(range), rules} end)
|> Enum.map(&flatten_short_formats/1)
|> Enum.sort
end
@doc false
@spec flatten_short_formats({binary, [] | String.t}) :: tuple
def flatten_short_formats({range, rules}) when is_list(rules) do
formats = Enum.map rules, fn {name, format} ->
plural_type = name
|> String.split("_")
|> Enum.reverse
|> List.first
{plural_type, format}
end
[range, Enum.into(formats, %{})]
end
@doc false
def flatten_short_formats(formats) do
formats
end
# Here we get the entire currency format section but we only want
# the section that is marked as a set of "unitPattern-count-___".
@doc false
@pattern_count "unit_pattern_count_"
@pattern_regex Regex.compile!(@pattern_count)
def currency_long_format(nil), do: nil
def currency_long_format(formats) do
formats
|> Enum.filter(fn {k, _v} -> Regex.match?(@pattern_regex, k) end)
|> Enum.map(fn {k, v} ->
@pattern_count <> count = k
{count, v}
end)
|> Enum.into(%{})
end
end