defmodule Moeda do @moduledoc """ Documentation for Moeda. """ defstruct [:nome, :simbolo, :codigo, :codigo_iso, :expoente] @typedoc """ Type that represents `Moeda` struct with: :nome as String.t that represents the name of the currency. :simbolo as String.t that represents symbol of the currency. :codigo as String.t that represents the ISO 4217 code. :codigo_iso as integer that represents the country code. :expoente as integer that represents the exponent of the currency. """ @type t :: %Moeda{ nome: String.t(), simbolo: String.t(), codigo: String.t(), codigo_iso: integer, expoente: integer } @moedas %{ AED: %{nome: "UAE Dirham", simbolo: [], codigo: "AED", codigo_iso: 784, expoente: 2}, AFN: %{nome: "Afghani", simbolo: [1547], codigo: "AFN", codigo_iso: 971, expoente: 2}, ALL: %{nome: "Lek", simbolo: [76, 101, 107], codigo: "ALL", codigo_iso: 008, expoente: 2}, AMD: %{nome: "Armenian Dram", simbolo: [], codigo: "AMD", codigo_iso: 051, expoente: 2}, ANG: %{ nome: "Netherlands Antillean Guilder", simbolo: [402], codigo: "ANG", codigo_iso: 532, expoente: 2 }, AOA: %{nome: "Kwanza", simbolo: [], codigo: "AOA", codigo_iso: 973, expoente: 2}, ARS: %{nome: "Argentine Peso", simbolo: [36], codigo: "ARS", codigo_iso: 032, expoente: 2}, AUD: %{nome: "Australian Dollar", simbolo: [36], codigo: "AUD", codigo_iso: 036, expoente: 2}, AWG: %{nome: "Aruban Florin", simbolo: [402], codigo: "AWG", codigo_iso: 533, expoente: 2}, AZN: %{nome: "Azerbaijan Manat", simbolo: [8380], codigo: "AZN", codigo_iso: 944, expoente: 2}, BAM: %{ nome: "Convertible Mark", simbolo: [75, 77], codigo: "BAM", codigo_iso: 977, expoente: 2 }, BBD: %{nome: "Barbados Dollar", simbolo: [36], codigo: "BBD", codigo_iso: 052, expoente: 2}, BDT: %{nome: "Taka", simbolo: [], codigo: "BDT", codigo_iso: 050, expoente: 2}, BGN: %{ nome: "Bulgarian Lev", simbolo: [1083, 1074], codigo: "BGN", codigo_iso: 975, expoente: 2 }, BHD: %{nome: "Bahraini Dinar", simbolo: [], codigo: "BHD", codigo_iso: 048, expoente: 3}, BIF: %{nome: "Burundi Franc", simbolo: [], codigo: "BIF", codigo_iso: 108, expoente: 0}, BMD: %{nome: "Bermudian Dollar", simbolo: [36], codigo: "BMD", codigo_iso: 060, expoente: 2}, BND: %{nome: "Brunei Dollar", simbolo: [36], codigo: "BND", codigo_iso: 096, expoente: 2}, BOB: %{nome: "Boliviano", simbolo: [36, 98], codigo: "BOB", codigo_iso: 068, expoente: 2}, BOV: %{nome: "Mvdol", simbolo: [], codigo: "BOV", codigo_iso: 984, expoente: 2}, BRL: %{nome: "Brazilian Real", simbolo: [82, 36], codigo: "BRL", codigo_iso: 986, expoente: 2}, BSD: %{nome: "Bahamian Dollar", simbolo: [36], codigo: "BSD", codigo_iso: 044, expoente: 2}, BTN: %{nome: "Ngultrum", simbolo: [], codigo: "BTN", codigo_iso: 064, expoente: 2}, BWP: %{nome: "Pula", simbolo: [80], codigo: "BWP", codigo_iso: 072, expoente: 2}, BYN: %{ nome: "Belarusian Ruble", simbolo: [66, 114], codigo: "BYN", codigo_iso: 933, expoente: 2 }, BZD: %{ nome: "Belize Dollar", simbolo: [66, 90, 36], codigo: "BZD", codigo_iso: 084, expoente: 2 }, CAD: %{nome: "Canadian Dollar", simbolo: [36], codigo: "CAD", codigo_iso: 124, expoente: 2}, CDF: %{nome: "Congolese Franc", simbolo: [], codigo: "CDF", codigo_iso: 976, expoente: 2}, CHE: %{nome: "WIR Euro", simbolo: [], codigo: "CHE", codigo_iso: 947, expoente: 2}, CHF: %{ nome: "Swiss Franc", simbolo: [67, 72, 70], codigo: "CHF", codigo_iso: 756, expoente: 2 }, CHW: %{nome: "WIR Franc", simbolo: [], codigo: "CHW", codigo_iso: 948, expoente: 2}, CLF: %{nome: "Unidad de Fomento", simbolo: [], codigo: "CLF", codigo_iso: 990, expoente: 4}, CLP: %{nome: "Chilean Peso", simbolo: [36], codigo: "CLP", codigo_iso: 152, expoente: 0}, CNY: %{nome: "Yuan Renminbi", simbolo: [165], codigo: "CNY", codigo_iso: 156, expoente: 2}, COP: %{nome: "Colombian Peso", simbolo: [36], codigo: "COP", codigo_iso: 170, expoente: 2}, COU: %{nome: "Unidad de Valor Real", simbolo: [], codigo: "COU", codigo_iso: 970, expoente: 2}, CRC: %{ nome: "Costa Rican Colon", simbolo: [8353], codigo: "CRC", codigo_iso: 188, expoente: 2 }, CUC: %{nome: "Peso Convertible", simbolo: [], codigo: "CUC", codigo_iso: 931, expoente: 2}, CUP: %{nome: "Cuban Peso", simbolo: [8369], codigo: "CUP", codigo_iso: 192, expoente: 2}, CVE: %{nome: "Cabo Verde Escudo", simbolo: [], codigo: "CVE", codigo_iso: 132, expoente: 2}, CZK: %{nome: "Czech Koruna", simbolo: [75, 269], codigo: "CZK", codigo_iso: 203, expoente: 2}, DJF: %{nome: "Djibouti Franc", simbolo: [], codigo: "DJF", codigo_iso: 262, expoente: 0}, DKK: %{nome: "Danish Krone", simbolo: [107, 114], codigo: "DKK", codigo_iso: 208, expoente: 2}, DOP: %{ nome: "Dominican Peso", simbolo: [82, 68, 36], codigo: "DOP", codigo_iso: 214, expoente: 2 }, DZD: %{nome: "Algerian Dinar", simbolo: [], codigo: "DZD", codigo_iso: 012, expoente: 2}, EGP: %{nome: "Egyptian Pound", simbolo: [163], codigo: "EGP", codigo_iso: 818, expoente: 2}, ERN: %{nome: "Nakfa", simbolo: [], codigo: "ERN", codigo_iso: 232, expoente: 2}, ETB: %{nome: "Ethiopian Birr", simbolo: [], codigo: "ETB", codigo_iso: 230, expoente: 2}, EUR: %{nome: "Euro", simbolo: [8364], codigo: "EUR", codigo_iso: 978, expoente: 2}, FJD: %{nome: "Fiji Dollar", simbolo: [36], codigo: "FJD", codigo_iso: 242, expoente: 2}, FKP: %{ nome: "Falkland Islands Pound", simbolo: [163], codigo: "FKP", codigo_iso: 238, expoente: 2 }, GBP: %{nome: "Pound Sterling", simbolo: [163], codigo: "GBP", codigo_iso: 826, expoente: 2}, GEL: %{nome: "Lari", simbolo: [], codigo: "GEL", codigo_iso: 981, expoente: 2}, GHS: %{nome: "Ghana Cedi", simbolo: [162], codigo: "GHS", codigo_iso: 936, expoente: 2}, GIP: %{nome: "Gibraltar Pound", simbolo: [163], codigo: "GIP", codigo_iso: 292, expoente: 2}, GMD: %{nome: "Dalasi", simbolo: [], codigo: "GMD", codigo_iso: 270, expoente: 2}, GNF: %{nome: "Guinean Franc", simbolo: [], codigo: "GNF", codigo_iso: 324, expoente: 0}, GTQ: %{nome: "Quetzal", simbolo: [81], codigo: "GTQ", codigo_iso: 320, expoente: 2}, GYD: %{nome: "Guyana Dollar", simbolo: [36], codigo: "GYD", codigo_iso: 328, expoente: 2}, HKD: %{nome: "Hong Kong Dollar", simbolo: [36], codigo: "HKD", codigo_iso: 344, expoente: 2}, HNL: %{nome: "Lempira", simbolo: [76], codigo: "HNL", codigo_iso: 340, expoente: 2}, HRK: %{nome: "Kuna", simbolo: [107, 11], codigo: "HRK", codigo_iso: 191, expoente: 2}, HTG: %{nome: "Gourde", simbolo: [], codigo: "HTG", codigo_iso: 332, expoente: 2}, HUF: %{nome: "Forint", simbolo: [70, 116], codigo: "HUF", codigo_iso: 348, expoente: 2}, IDR: %{nome: "Rupiah", simbolo: [82, 112], codigo: "IDR", codigo_iso: 360, expoente: 2}, ILS: %{ nome: "New Israeli Sheqel", simbolo: [8362], codigo: "ILS", codigo_iso: 376, expoente: 2 }, INR: %{nome: "Indian Rupee", simbolo: [], codigo: "INR", codigo_iso: 356, expoente: 2}, IQD: %{nome: "Iraqi Dinar", simbolo: [], codigo: "IQD", codigo_iso: 368, expoente: 3}, IRR: %{nome: "Iranian Rial", simbolo: [65020], codigo: "IRR", codigo_iso: 364, expoente: 2}, ISK: %{ nome: "Iceland Krona", simbolo: [107, 114], codigo: "ISK", codigo_iso: 352, expoente: 0 }, JMD: %{ nome: "Jamaican Dollar", simbolo: [74, 36], codigo: "JMD", codigo_iso: 388, expoente: 2 }, JOD: %{nome: "Jordanian Dinar", simbolo: [], codigo: "JOD", codigo_iso: 400, expoente: 3}, JPY: %{nome: "Yen", simbolo: [165], codigo: "JPY", codigo_iso: 392, expoente: 0}, KES: %{nome: "Kenyan Shilling", simbolo: [], codigo: "KES", codigo_iso: 404, expoente: 2}, KGS: %{nome: "Som", simbolo: [1083, 1074], codigo: "KGS", codigo_iso: 417, expoente: 2}, KHR: %{nome: "Riel", simbolo: [6107], codigo: "KHR", codigo_iso: 116, expoente: 2}, KMF: %{nome: "Comorian Franc ", simbolo: [], codigo: "KMF", codigo_iso: 174, expoente: 0}, KPW: %{nome: "North Korean Won", simbolo: [8361], codigo: "KPW", codigo_iso: 408, expoente: 2}, KRW: %{nome: "Won", simbolo: [8361], codigo: "KRW", codigo_iso: 410, expoente: 0}, KWD: %{nome: "Kuwaiti Dinar", simbolo: [], codigo: "KWD", codigo_iso: 414, expoente: 3}, KYD: %{ nome: "Cayman Islands Dollar", simbolo: [36], codigo: "KYD", codigo_iso: 136, expoente: 2 }, KZT: %{nome: "Tenge", simbolo: [1083, 1074], codigo: "KZT", codigo_iso: 398, expoente: 2}, LAK: %{nome: "Lao Kip", simbolo: [8365], codigo: "LAK", codigo_iso: 418, expoente: 2}, LBP: %{nome: "Lebanese Pound", simbolo: [163], codigo: "LBP", codigo_iso: 422, expoente: 2}, LKR: %{nome: "Sri Lanka Rupee", simbolo: [8360], codigo: "LKR", codigo_iso: 144, expoente: 2}, LRD: %{nome: "Liberian Dollar", simbolo: [36], codigo: "LRD", codigo_iso: 430, expoente: 2}, LSL: %{nome: "Loti", simbolo: [], codigo: "LSL", codigo_iso: 426, expoente: 2}, LYD: %{nome: "Libyan Dinar", simbolo: [], codigo: "LYD", codigo_iso: 434, expoente: 3}, MAD: %{nome: "Moroccan Dirham", simbolo: [], codigo: "MAD", codigo_iso: 504, expoente: 2}, MDL: %{nome: "Moldovan Leu", simbolo: [], codigo: "MDL", codigo_iso: 498, expoente: 2}, MGA: %{nome: "Malagasy Ariary", simbolo: [], codigo: "MGA", codigo_iso: 969, expoente: 2}, MKD: %{ nome: "Denar", simbolo: [1076, 1077, 1085], codigo: "MKD", codigo_iso: 807, expoente: 2 }, MMK: %{nome: "Kyat", simbolo: [], codigo: "MMK", codigo_iso: 104, expoente: 2}, MNT: %{nome: "Tugrik", simbolo: [8366], codigo: "MNT", codigo_iso: 496, expoente: 2}, MOP: %{nome: "Pataca", simbolo: [], codigo: "MOP", codigo_iso: 446, expoente: 2}, MRU: %{nome: "Ouguiya", simbolo: [], codigo: "MRU", codigo_iso: 929, expoente: 2}, MUR: %{nome: "Mauritius Rupee", simbolo: [8360], codigo: "MUR", codigo_iso: 480, expoente: 2}, MVR: %{nome: "Rufiyaa", simbolo: [], codigo: "MVR", codigo_iso: 462, expoente: 2}, MWK: %{nome: "Malawi Kwacha", simbolo: [], codigo: "MWK", codigo_iso: 454, expoente: 2}, MXN: %{nome: "Mexican Peso", simbolo: [36], codigo: "MXN", codigo_iso: 484, expoente: 2}, MXV: %{ nome: "Mexican Unidad de Inversion (UDI)", simbolo: [], codigo: "MXV", codigo_iso: 979, expoente: 2 }, MYR: %{ nome: "Malaysian Ringgit", simbolo: [82, 77], codigo: "MYR", codigo_iso: 458, expoente: 2 }, MZN: %{ nome: "Mozambique Metical", simbolo: [77, 84], codigo: "MZN", codigo_iso: 943, expoente: 2 }, NAD: %{nome: "Namibia Dollar", simbolo: [36], codigo: "NAD", codigo_iso: 516, expoente: 2}, NGN: %{nome: "Naira", simbolo: [8358], codigo: "NGN", codigo_iso: 566, expoente: 2}, NIO: %{nome: "Cordoba Oro", simbolo: [67, 36], codigo: "NIO", codigo_iso: 558, expoente: 2}, NOK: %{ nome: "Norwegian Krone", simbolo: [107, 114], codigo: "NOK", codigo_iso: 578, expoente: 2 }, NPR: %{nome: "Nepalese Rupee", simbolo: [8360], codigo: "NPR", codigo_iso: 524, expoente: 2}, NZD: %{nome: "New Zealand Dollar", simbolo: [36], codigo: "NZD", codigo_iso: 554, expoente: 2}, OMR: %{nome: "Rial Omani", simbolo: [65020], codigo: "OMR", codigo_iso: 512, expoente: 3}, PAB: %{nome: "Balboa", simbolo: [66, 47, 46], codigo: "PAB", codigo_iso: 590, expoente: 2}, PEN: %{nome: "Sol", simbolo: [83, 47, 46], codigo: "PEN", codigo_iso: 604, expoente: 2}, PGK: %{nome: "Kina", simbolo: [], codigo: "PGK", codigo_iso: 598, expoente: 2}, PHP: %{nome: "Philippine Piso", simbolo: [8369], codigo: "PHP", codigo_iso: 608, expoente: 2}, PKR: %{nome: "Pakistan Rupee", simbolo: [8360], codigo: "PKR", codigo_iso: 586, expoente: 2}, PLN: %{nome: "Zloty", simbolo: [122, 322], codigo: "PLN", codigo_iso: 985, expoente: 2}, PYG: %{nome: "Guarani", simbolo: [71, 115], codigo: "PYG", codigo_iso: 600, expoente: 0}, QAR: %{nome: "Qatari Rial", simbolo: [65020], codigo: "QAR", codigo_iso: 634, expoente: 2}, RON: %{ nome: "Romanian Leu", simbolo: [108, 101, 105], codigo: "RON", codigo_iso: 946, expoente: 2 }, RSD: %{ nome: "Serbian Dinar", simbolo: [1044, 1080, 1085, 46], codigo: "RSD", codigo_iso: 941, expoente: 2 }, RUB: %{nome: "Russian Ruble", simbolo: [8381], codigo: "RUB", codigo_iso: 643, expoente: 2}, RWF: %{nome: "Rwanda Franc", simbolo: [], codigo: "RWF", codigo_iso: 646, expoente: 0}, SAR: %{nome: "Saudi Riyal", simbolo: [65020], codigo: "SAR", codigo_iso: 682, expoente: 2}, SBD: %{ nome: "Solomon Islands Dollar", simbolo: [36], codigo: "SBD", codigo_iso: 090, expoente: 2 }, SCR: %{nome: "Seychelles Rupee", simbolo: [8360], codigo: "SCR", codigo_iso: 690, expoente: 2}, SDG: %{nome: "Sudanese Pound", simbolo: [], codigo: "SDG", codigo_iso: 938, expoente: 2}, SEK: %{ nome: "Swedish Krona", simbolo: [107, 114], codigo: "SEK", codigo_iso: 752, expoente: 2 }, SGD: %{nome: "Singapore Dollar", simbolo: [36], codigo: "SGD", codigo_iso: 702, expoente: 2}, SHP: %{ nome: "Saint Helena Pound", simbolo: [163], codigo: "SHP", codigo_iso: 654, expoente: 2 }, SLL: %{nome: "Leone", simbolo: [], codigo: "SLL", codigo_iso: 694, expoente: 2}, SOS: %{nome: "Somali Shilling", simbolo: [83], codigo: "SOS", codigo_iso: 706, expoente: 2}, SRD: %{nome: "Surinam Dollar", simbolo: [36], codigo: "SRD", codigo_iso: 968, expoente: 2}, SSP: %{nome: "South Sudanese Pound", simbolo: [], codigo: "SSP", codigo_iso: 728, expoente: 2}, STN: %{nome: "Dobra", simbolo: [], codigo: "STN", codigo_iso: 930, expoente: 2}, SVC: %{nome: "El Salvador Colon", simbolo: [36], codigo: "SVC", codigo_iso: 222, expoente: 2}, SYP: %{nome: "Syrian Pound", simbolo: [163], codigo: "SYP", codigo_iso: 760, expoente: 2}, SZL: %{nome: "Lilangeni", simbolo: [], codigo: "SZL", codigo_iso: 748, expoente: 2}, THB: %{nome: "Baht", simbolo: [3647], codigo: "THB", codigo_iso: 764, expoente: 2}, TJS: %{nome: "Somoni", simbolo: [], codigo: "TJS", codigo_iso: 972, expoente: 2}, TMT: %{ nome: "Turkmenistan New Manat", simbolo: [], codigo: "TMT", codigo_iso: 934, expoente: 2 }, TND: %{nome: "Tunisian Dinar", simbolo: [], codigo: "TND", codigo_iso: 788, expoente: 3}, TOP: %{nome: "Pa’anga", simbolo: [], codigo: "TOP", codigo_iso: 776, expoente: 2}, TRY: %{nome: "Turkish Lira", simbolo: [], codigo: "TRY", codigo_iso: 949, expoente: 2}, TTD: %{ nome: "Trinidad and Tobago Dollar", simbolo: [84, 84, 36], codigo: "TTD", codigo_iso: 780, expoente: 2 }, TWD: %{ nome: "New Taiwan Dollar", simbolo: [78, 84, 36], codigo: "TWD", codigo_iso: 901, expoente: 2 }, TZS: %{nome: "Tanzanian Shilling", simbolo: [], codigo: "TZS", codigo_iso: 834, expoente: 2}, UAH: %{nome: "Hryvnia", simbolo: [8372], codigo: "UAH", codigo_iso: 980, expoente: 2}, UGX: %{nome: "Uganda Shilling", simbolo: [], codigo: "UGX", codigo_iso: 800, expoente: 0}, USD: %{nome: "US Dollar", simbolo: [36], codigo: "USD", codigo_iso: 840, expoente: 2}, USN: %{nome: "US Dollar (Next day)", simbolo: [], codigo: "USN", codigo_iso: 997, expoente: 2}, UYI: %{ nome: "Uruguay Peso en Unidades Indexadas (URUIURUI)", simbolo: [], codigo: "UYI", codigo_iso: 940, expoente: 0 }, UYU: %{nome: "Peso Uruguayo", simbolo: [36, 85], codigo: "UYU", codigo_iso: 858, expoente: 2}, UZS: %{ nome: "Uzbekistan Sum", simbolo: [1083, 1074], codigo: "UZS", codigo_iso: 860, expoente: 2 }, VEF: %{nome: "Bolívar", simbolo: [66, 115], codigo: "VEF", codigo_iso: 937, expoente: 2}, VND: %{nome: "Dong", simbolo: [8363], codigo: "VND", codigo_iso: 704, expoente: 0}, VUV: %{nome: "Vatu", simbolo: [], codigo: "VUV", codigo_iso: 548, expoente: 0}, WST: %{nome: "Tala", simbolo: [], codigo: "WST", codigo_iso: 882, expoente: 2}, XAF: %{nome: "CFA Franc BEAC", simbolo: [], codigo: "XAF", codigo_iso: 950, expoente: 0}, XCD: %{ nome: "East Caribbean Dollar", simbolo: [36], codigo: "XCD", codigo_iso: 951, expoente: 2 }, XOF: %{nome: "CFA Franc BCEAO", simbolo: [], codigo: "XOF", codigo_iso: 952, expoente: 0}, XPF: %{nome: "CFP Franc", simbolo: [], codigo: "XPF", codigo_iso: 953, expoente: 0}, YER: %{nome: "Yemeni Rial", simbolo: [65020], codigo: "YER", codigo_iso: 886, expoente: 2}, ZAR: %{nome: "Rand", simbolo: [82], codigo: "ZAR", codigo_iso: 710, expoente: 2}, ZMW: %{nome: "Zambian Kwacha", simbolo: [], codigo: "ZMW", codigo_iso: 967, expoente: 2}, ZWL: %{nome: "Zimbabwe Dollar", simbolo: [], codigo: "ZWL", codigo_iso: 932, expoente: 2} } @spec find(String.t() | atom) :: map | nil @doc """ Return a map from an atom or string that represents an ISO 4217 code. ## Examples iex> Moeda.find(:BRL) %{nome: "Brazilian Real", simbolo: 'R$', codigo: "BRL", codigo_iso: 986, expoente: 2} iex> Moeda.find("BRL") %{nome: "Brazilian Real", simbolo: 'R$', codigo: "BRL", codigo_iso: 986, expoente: 2} iex> Moeda.find("") nil Its function ignore case sensitive. ## Examples iex> Moeda.find(:brl) %{nome: "Brazilian Real", simbolo: 'R$', codigo: "BRL", codigo_iso: 986, expoente: 2} iex> Moeda.find("brl") %{nome: "Brazilian Real", simbolo: 'R$', codigo: "BRL", codigo_iso: 986, expoente: 2} Is possible to work with no official ISO currency code adding it in the system Mix config. ## Examples iex> Moeda.find(:XBT) nil iex> moedas = %{ XBT: %{nome: "Bitcoin", simbolo: '฿', codigo: "XBT", codigo_iso: 0, expoente: 8} } iex> Application.put_env(:ex_dinheiro, :unofficial_currencies, moedas) iex> Moeda.find("xbt") %{nome: "Bitcoin", simbolo: '฿', codigo: "XBT", codigo_iso: 0, expoente: 8} Is possible to override some official ISO currency code adding it in the system Mix config. ## Examples iex> Moeda.find(:BRL) %{nome: "Brazilian Real", simbolo: 'R$', codigo: "BRL", codigo_iso: 986, expoente: 2} iex> moedas = %{ BRL: %{nome: "Moeda do Brasil", simbolo: 'BR$', codigo: "BRL", codigo_iso: 986, expoente: 4}, USD: %{nome: "Moeda do EUA", simbolo: 'US$', codigo: "USD", codigo_iso: 986, expoente: 3} } iex> Application.put_env(:ex_dinheiro, :unofficial_currencies, moedas) iex> Moeda.find(:BRL) %{nome: "Moeda do Brasil", simbolo: 'BR$', codigo: "BRL", codigo_iso: 986, expoente: 4} iex> Moeda.find(:USD) %{nome: "Moeda do EUA", simbolo: 'US$', codigo: "USD", codigo_iso: 986, expoente: 3} """ def find(codigo) when is_atom(codigo) do codigo |> Atom.to_string() |> String.upcase() |> String.to_atom() |> do_find end def find(codigo) when is_binary(codigo) do codigo |> String.upcase() |> String.to_atom() |> do_find end defp do_find(codigo) do unofficial_currencies = Application.get_env(:ex_dinheiro, :unofficial_currencies, %{}) currency = unofficial_currencies[codigo] if currency do currency else @moedas[codigo] end end @spec get_atom(String.t() | atom) :: atom | nil @doc """ Return an atom from a value that represents an ISO 4217 code. ## Examples iex> Moeda.get_atom(:BRL) :BRL iex> Moeda.get_atom("BRL") :BRL iex> Moeda.get_atom("") nil Its function ignore case sensitive. ## Examples iex> Moeda.get_atom(:brl) :BRL iex> Moeda.get_atom("brl") :BRL """ def get_atom(codigo) do moeda = find(codigo) if moeda do moeda.codigo |> String.upcase() |> String.to_atom() else nil end end @spec get_factor(String.t() | atom) :: float | nil @doc """ Return a multiplication factor from an ISO 4217 code. ## Examples iex> Moeda.get_factor(:BRL) 100.0 iex> Moeda.get_factor("BRL") 100.0 iex> Moeda.get_factor("") nil Its function ignore case sensitive. ## Examples iex> Moeda.get_factor(:brl) 100.0 iex> Moeda.get_factor("brl") 100.0 """ def get_factor(codigo) do moeda = find(codigo) if moeda do :math.pow(10, moeda.expoente) else nil end end @spec to_string(String.t() | atom, float, Keywords.t()) :: String.t() @doc """ Return a formated string from a ISO 4217 code and a float value. ## Examples iex> Moeda.to_string(:BRL, 100.0) "R$ 100,00" iex> Moeda.to_string("BRL", 1000.5) "R$ 1.000,50" iex> Moeda.to_string(:BRL, -1.0) "R$ -1,00" Its function ignore case sensitive. ## Examples iex> Moeda.to_string(:bRl, 100.0) "R$ 100,00" iex> Moeda.to_string("BrL", 1000.5) "R$ 1.000,50" Using options-style parameters you can change the behavior of the function. - `thousand_separator` - default `"."`, set the thousand separator. - `decimal_separator` - default `","`, set the decimal separator. - `display_currency_symbol` - default `true`, put to `false` to hide de currency symbol. - `display_currency_code` - default `false`, put to `true` to display de currency ISO 4217 code. ## Exemples iex> Moeda.to_string(:USD, 1000.5, thousand_separator: ",", decimal_separator: ".") "$ 1,000.50" iex> Moeda.to_string(:USD, 1000.5, display_currency_symbol: false) "1.000,50" iex> Moeda.to_string(:USD, 1000.5, display_currency_code: true) "$ 1.000,50 USD" iex> Moeda.to_string(:USD, 1000.5, display_currency_code: true, display_currency_symbol: false) "1.000,50 USD" The default values also can be set in the system Mix config. ## Example: iex> Application.put_env(:ex_dinheiro, :thousand_separator, ",") iex> Application.put_env(:ex_dinheiro, :decimal_separator, ".") iex> Moeda.to_string(:USD, 1000.5) "$ 1,000.50" iex> Application.put_env(:ex_dinheiro, :display_currency_symbol, false) iex> Moeda.to_string(:USD, 5000.5) "5,000.50" iex> Application.put_env(:ex_dinheiro, :display_currency_code, true) iex> Moeda.to_string(:USD, 10000.0) "10,000.00 USD" The options-style parameters override values in the system Mix config. ## Example: iex> Application.put_env(:ex_dinheiro, :thousand_separator, ",") iex> Application.put_env(:ex_dinheiro, :decimal_separator, ".") iex> Moeda.to_string(:USD, 1000.5) "$ 1,000.50" iex> Moeda.to_string(:BRL, 1000.5, thousand_separator: ".", decimal_separator: ",") "R$ 1.000,50" """ def to_string(moeda, valor, opts \\ []) do m = Moeda.find(moeda) unless m, do: raise(ArgumentError, message: "'#{moeda}' does not represent an ISO 4217 code.") unless is_float(valor), do: raise(ArgumentError, message: "Value '#{valor}' must be float.") {thousand_separator, decimal_separator, display_currency_symbol, display_currency_code} = get_config(opts) parts = valor |> :erlang.float_to_binary(decimals: m.expoente) |> String.split(".") thousands = parts |> List.first() |> String.reverse() |> String.codepoints() |> format_thousands(thousand_separator) |> String.reverse() decimals = if m.expoente > 0 do Enum.join([decimal_separator, List.last(parts)]) else "" end currency_symbol = if display_currency_symbol do m.simbolo else "" end currency_code = if display_currency_code do m.codigo else "" end [currency_symbol, " ", thousands, decimals, " ", currency_code] |> Enum.join() |> String.trim() end defp get_config(opts) do conf_thousand_separator = Application.get_env(:ex_dinheiro, :thousand_separator, ".") conf_decimal_separator = Application.get_env(:ex_dinheiro, :decimal_separator, ",") conf_display_currency_symbol = Application.get_env(:ex_dinheiro, :display_currency_symbol, true) conf_display_currency_code = Application.get_env(:ex_dinheiro, :display_currency_code, false) thousand_separator = Keyword.get(opts, :thousand_separator, conf_thousand_separator) decimal_separator = Keyword.get(opts, :decimal_separator, conf_decimal_separator) display_currency_symbol = Keyword.get(opts, :display_currency_symbol, conf_display_currency_symbol) display_currency_code = Keyword.get(opts, :display_currency_code, conf_display_currency_code) {thousand_separator, decimal_separator, display_currency_symbol, display_currency_code} end defp format_thousands([head | tail], separator, opts \\ []) do position = Keyword.get(opts, :position, 1) num = if rem(position, 3) == 0 and head != "-" and tail != [] do Enum.join([head, separator]) else head end if tail != [] do [num, format_thousands(tail, separator, position: position + 1)] |> Enum.join() else num end end end