Packages

ex_cldr

0.1.1
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 cldr currency.ex
Raw

lib/cldr/currency.ex

defmodule Cldr.Currency do
@moduledoc """
Defines a currency structure and a set of functions to manage the validity of a currency code
and to return metadata for currencies.
"""
@type format :: :standard |
:accounting |
:short |
:long |
:percent |
:scientific
@type code :: String.t
@type t :: %__MODULE__{
code: code,
name: String.t,
tender: boolean,
symbol: String.t,
digits: pos_integer,
rounding: pos_integer,
narrow_symbol: String.t,
cash_digits: pos_integer,
cash_rounding: pos_integer,
count: %{}
}
defstruct [
:code,
:name,
:symbol,
:narrow_symbol,
:digits,
:rounding,
:cash_digits,
:cash_rounding,
:tender,
:count]
@doc """
Returns a list of all known currency codes.
## Example
iex> Cldr.Currency.known_currencies |> Enum.count
298
"""
def known_currencies do
Cldr.get_locale()
|> Cldr.Locale.get_locale
|> get_in([:currencies])
|> Map.keys
end
@doc """
Returns a boolean indicating if the supplied currency code is known.
* `currency_code` is a `binary` or `atom` representing an ISO4217
currency code
## Examples
iex> Cldr.Currency.known_currency? "AUD"
true
iex> Cldr.Currency.known_currency? "GGG"
false
"""
@spec known_currency?(code) :: boolean
def known_currency?(currency_code) when is_binary(currency_code) do
case code_atom = normalize_currency_code(currency_code) do
{:error, {_exception, _message}} -> false
_ -> known_currency?(code_atom)
end
end
def known_currency?(currency_code) when is_atom(currency_code) do
!!Enum.find(known_currencies(), &(&1 == currency_code))
end
@doc """
Returns a normalized currency code if the code is valid or an error tuple if not.
Similar to the function `known_currency/1` but whereas that function returns a
`boolean` result, this function returns the normalized currency code if the
argument is valid.
## Examples
iex> Cldr.Currency.validate_currency_code :usd
:USD
iex> Cldr.Currency.validate_currency_code "usd"
:USD
iex> Cldr.Currency.validate_currency_code "USD"
:USD
iex> Cldr.Currency.validate_currency_code "NOPE"
{:error, {Cldr.UnknownCurrencyError, "Currency \\"NOPE\\" is not known"}}
iex> Cldr.Currency.validate_currency_code :ABC
{:error, {Cldr.UnknownCurrencyError, "Currency :ABC is not known"}}
"""
@spec validate_currency_code(code) :: atom
def validate_currency_code(currency_code) do
case code_atom = normalize_currency_code(currency_code) do
{:error, {_exception, _message}} = error ->
error
_ ->
if known_currency?(code_atom) do
code_atom
else
error_tuple(code_atom)
end
end
end
@doc """
Returns the currency metadata for the requested currency code.
* `currency_code` is a `binary` or `atom` representation of an ISO 4217 currency code.
## Examples
iex> Cldr.Currency.for_code("AUD")
%Cldr.Currency{cash_digits: 2, cash_rounding: 0, code: "AUD",
count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2, name: "Australian Dollar", narrow_symbol: "$",
rounding: 0, symbol: "A$", tender: true}
iex> Cldr.Currency.for_code("THB")
%Cldr.Currency{cash_digits: 2, cash_rounding: 0, code: "THB",
count: %{one: "Thai baht", other: "Thai baht"}, digits: 2,
name: "Thai Baht", narrow_symbol: "฿", rounding: 0, symbol: "THB",
tender: true}
"""
@spec for_code(code, Cldr.locale) :: %{}
def for_code(currency_code, locale \\ Cldr.get_locale()) do
case code = validate_currency_code(currency_code) do
{:error, {_exception, _message}} = error -> error
_ -> for_locale(locale)[code]
end
end
@doc """
Returns the currency metadata for a locale.
"""
@spec for_locale(Cldr.locale) :: %{}
def for_locale(locale) do
Cldr.Locale.get_locale(locale).currencies
end
@doc """
Normalizes the representation of a currency code.
* `currency_code` is any `binary` or `atom` representation of
an ISO4217 currency code.
The normalized form is an ISO4217 code in an upper case atom form.
`binary` forms of `currency_code` are only every converted
to an atom using `String.to_existing_atom/1`. Since all known currencies
are loaded at compile time, we can detect invalid currencies in these
cases - the third example below is one such instance.
Note that `normalize_currency_code` only normalizes the currency
code. For checking the validiting of a currency code, use `known_currency?/1`.
## Examples:
iex> Cldr.Currency.normalize_currency_code "USD"
:USD
iex> Cldr.Currency.normalize_currency_code :usd
:USD
iex> Cldr.Currency.normalize_currency_code "NADA"
{:error, {Cldr.UnknownCurrencyError, "Currency \\"NADA\\" is not known"}}
iex> Cldr.Currency.normalize_currency_code :ABC
:ABC
"""
@spec normalize_currency_code(binary) :: atom
def normalize_currency_code(currency_code) when is_binary(currency_code) do
try do
currency_code
|> String.upcase
|> String.to_existing_atom
rescue ArgumentError ->
error_tuple(currency_code)
end
end
def normalize_currency_code(currency_code) when is_atom(currency_code) do
if known_currency?(currency_code) do
currency_code
else
currency_code
|> Atom.to_string
|> normalize_currency_code
end
end
@doc """
Normalizes the representation of a currency code using `normalize_currency_code/1`
but raises an exception if the code is known to be invalid. Note that this function
does not conclusively detect invalid currency codes and is not intended to.
* `currency_code` is any `binary` or `atom` representation of
an ISO4217 currency code.
The normalized form is an ISO4217 code in an upper case atom form.
## Example:
Cldr.Currency.normalize_currency_code! "ABC"
** (Cldr.UnknownCurrencyError) Currency "ABC" is not known
(ex_cldr) lib/cldr/currency.ex:146: Cldr.Currency.normalize_currency_code!/1
"""
def normalize_currency_code!(currency_code) when is_binary(currency_code) or is_atom(currency_code) do
case code = normalize_currency_code(currency_code) do
{:error, {exception, message}} ->
raise exception, message
_ -> code
end
end
defp error_tuple(currency_code) do
{:error, {Cldr.UnknownCurrencyError, "Currency #{inspect currency_code} is not known"}}
end
end