Packages
ex_money
6.1.0
6.1.1
6.1.0
6.0.0
6.0.0-rc.0
5.24.2
5.24.1
5.24.0
retired
5.23.0
5.22.0
5.21.0
5.20.0
5.19.2
5.19.1
5.19.0
5.18.0
5.17.2
5.17.1
5.17.0
5.16.1
5.16.0
5.15.4
5.15.3
5.15.2
5.15.1
5.15.0
5.14.1
5.13.0
5.12.4
5.12.3
5.12.2
5.12.1
5.12.0
5.11.0
5.10.0
5.9.0
5.8.0
5.7.4
5.7.3
5.7.2
5.7.1
5.7.0
5.6.0
5.5.5
5.5.4
5.5.3
5.5.2
5.5.1
5.5.0
5.4.1
5.4.0
5.4.0-rc.0
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.0
5.0.2
5.0.1
5.0.0
retired
4.4.3
4.4.2
retired
4.4.1
4.4.0
4.3.0
4.2.2
4.2.1
4.2.0
4.1.0
4.0.0
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.1
3.3.0
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.0
3.0.0
2.12.2
2.12.1
retired
2.12.0
retired
2.11.0
2.10.0
2.9.1
2.9.0
2.8.0
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.0
2.3.0
2.2.2
2.2.1
2.2.0
2.1.0
2.1.0-rc.1
retired
2.1.0-rc.0
retired
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.3
1.1.2
1.1.1
retired
1.1.0
1.0.0
1.0.0-rc.0
retired
0.9.0
retired
0.8.5
retired
0.8.4
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.3
retired
0.5.2
retired
0.5.1
retired
0.5.0
retired
0.4.3
retired
0.4.2
retired
0.4.1
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.7
retired
0.1.6
retired
0.1.5
retired
0.1.4
retired
0.1.3
retired
0.1.2
retired
0.1.1
retired
0.1.0
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.9
retired
0.0.7
retired
0.0.6
retired
0.0.5
retired
0.0.4
retired
0.0.3
retired
0.0.2
retired
Money functions for operations on and localization of a money data type with support for ISO 4217 currencies and ISO 24165 digial tokens (crypto currencies).
Current section
Files
Jump to
Current section
Files
lib/money/sigil.ex
defmodule Money.Sigil do
@doc ~S"""
Implements the sigil `~M` for Money
The lower case `~m` variant does not exist as interpolation and excape
characters are not useful for Money sigils.
## Example
iex> import Money.Sigil
iex> ~M[1000]usd
Money.new(:USD, "1000")
iex> ~M[1000.34]usd
Money.new(:USD, "1000.34")
"""
@spec sigil_M(binary, list(char)) :: Money.t() | {:error, {module(), String.t()}}
def sigil_M(amount, [_ | _] = currency) do
Money.new(to_decimal(amount), atomize(currency))
end
defp to_decimal(string) do
string
|> String.replace("_", "")
|> Decimal.new()
end
defp atomize(currency) do
currency
|> List.to_string()
|> validate_currency!
end
def validate_currency!(currency) do
case Money.validate_currency(currency) do
{:ok, currency} ->
currency
{:error, {_exception, reason}} ->
store_running? = Process.whereis(Money.Currency.Store) != nil
raise Money.UnknownCurrencyError, unknown_currency_message(currency, reason, store_running?)
end
end
@doc false
# Builds the error message raised when a `~M` sigil names an unknown
# currency. Custom and private currencies are registered at runtime, so a
# tailored message is produced to explain why one may be unavailable. The
# `store_running?` argument distinguishes a compile-time use (the currency
# store is not running, e.g. the sigil is in a module attribute) from a
# runtime use where the currency simply has not been registered.
@spec unknown_currency_message(String.t(), String.t(), boolean()) :: String.t()
def unknown_currency_message(currency, default_reason, store_running?) do
cond do
not Money.Currency.private_or_custom_code?(currency) ->
default_reason
store_running? ->
"The currency #{inspect(currency)} looks like a private or custom currency but is not " <>
"registered. Register it at application start with the :custom_currencies configuration " <>
"key or with Money.Currency.new/2 before use."
true ->
"The currency #{inspect(currency)} looks like a private or custom currency. Currencies " <>
"added at runtime with Money.Currency.new/2 are not available in a compile-time position " <>
"such as a module attribute, a defstruct default or a module body. Declare it in the " <>
":custom_currencies configuration to use it here, or move the sigil into a function body."
end
end
end