Forex.Support (Forex v1.1.2)

Copy Markdown View Source

The Forex.Support module provides helper functions, for example, for formatting the exchange rates values.

Summary

Functions

Conver the binary currency code to an existing atom representation.

Format the rate value based on the format option

Map the date to a Date struct or nil if the date cannot be parsed.

Attempt to parse a date from a binary string in ISO 8601 format

Round the rate value based on the round option

Convert the currency code to a default string representation (uppercase string).

Functions

atomize_code(code)

@spec atomize_code(atom() | String.t()) :: atom()

Conver the binary currency code to an existing atom representation.

Examples

  iex> Forex.Support.atomize_code("usd")
  :usd

  iex> Forex.Support.atomize_code(:usd)
  :usd

  iex> Forex.Support.atomize_code("USD")
  :usd

  iex> Forex.Support.atomize_code(:USD)
  :usd

  iex> Forex.Support.atomize_code("uSD")
  :usd

  iex> Forex.Support.atomize_code(1)
  ** (FunctionClauseError) no function clause matching in Forex.Support.atomize_code/1

format_value(value, format)

@spec format_value(number() | binary() | Decimal.t(), :string | :decimal) ::
  formatted_value :: binary() | Decimal.t()

Format the rate value based on the format option

Examples

iex> Forex.Support.format_value("1.2345", :string)
"1.2345"

iex> Forex.Support.format_value("1.2345", :decimal)
Decimal.new("1.2345")

iex> Forex.Support.format_value("1.2345", :decimal)
Decimal.new("1.2345")

iex> Forex.Support.format_value("1.2345", :string)
"1.2345"

iex> Forex.Support.format_value(1.2345, :decimal)
Decimal.new("1.2345")

iex> Forex.Support.format_value(1.2345, :string)
"1.2345"

iex> Forex.Support.format_value(Decimal.new("1.2345"), :decimal)
Decimal.new("1.2345")

iex> Forex.Support.format_value(Decimal.new("1.2345"), :string)
"1.2345"

iex> Forex.Support.format_value(1.2345, :number)
** (Forex.FormatError) Invalid format value: number

map_date(date)

@spec map_date(parsable_date()) :: Date.t() | nil

Map the date to a Date struct or nil if the date cannot be parsed.

Examples

iex> Forex.Support.map_date("2020-01-01")
~D[2020-01-01]

iex> Forex.Support.map_date("2020-01-01T00:00:00Z")
~D[2020-01-01]

iex> Forex.Support.map_date({1982, 2, 25})
~D[1982-02-25]

iex> Forex.Support.map_date(~D[2020-01-01])
~D[2020-01-01]

iex> Forex.Support.map_date(~U[2020-01-01T00:00:00Z])
~D[2020-01-01]

iex> Forex.Support.map_date("2020-01-01T00:00:00")
nil

iex> Forex.Support.map_date("1982-02-31T00:00:00Z")
nil

iex> Forex.Support.map_date(1982)
nil

parse_date(string)

@spec parse_date(parsable_date()) :: {:ok, Date.t()} | {:error, :invalid_date}

Attempt to parse a date from a binary string in ISO 8601 format

Examples

iex> Forex.Support.parse_date("2020-01-01")
{:ok, ~D[2020-01-01]}

iex> Forex.Support.parse_date("2020-01-01T00:00:00Z")
{:ok, ~D[2020-01-01]}

iex> Forex.Support.parse_date({1982, 2, 25})
{:ok, ~D[1982-02-25]}

iex> Forex.Support.parse_date(~D[2020-01-01])
{:ok, ~D[2020-01-01]}

iex> Forex.Support.parse_date(~U[2020-01-01T00:00:00Z])
{:ok, ~D[2020-01-01]}

iex> Forex.Support.parse_date("2020-01-01T00:00:00")
{:error, :invalid_date}

iex> Forex.Support.parse_date("1982-02-31T00:00:00Z")
{:error, :invalid_date}

iex> Forex.Support.parse_date(1982)
{:error, :invalid_date}

round_value(value, precision)

@spec round_value(any(), integer() | nil) :: any()

Round the rate value based on the round option

Examples

  iex> Forex.Support.round_value(1.2345, 2)
  1.23

  iex> Forex.Support.round_value(1.2345, 4)
  1.2345

  iex> Forex.Support.round_value(1.2345, 0)
  1.0

  iex> Forex.Support.round_value(1.2345, 15)
  1.2345

  iex> Forex.Support.round_value(Decimal.new("1.2345"), 2)
  Decimal.new("1.23")

  iex> Forex.Support.round_value(Decimal.new("1.2345"), 4)
  Decimal.new("1.2345")

  iex> Forex.Support.round_value(Decimal.new("1.2345"), 0)
  Decimal.new("1")

  iex> Forex.Support.round_value("1.2345", 2)
  "1.23"

  iex> Forex.Support.round_value("1.2345", 4)
  "1.2345"

  iex> Forex.Support.round_value("1.2345", nil)
  "1.2345"

  iex> Forex.Support.round_value(nil, 2)
  nil

  iex> Forex.Support.round_value(1.2345, 16)
  ** (FunctionClauseError) no function clause matching in Forex.Support.round_value/2

stringify_code(code)

@spec stringify_code(atom() | String.t()) :: String.t()

Convert the currency code to a default string representation (uppercase string).

Examples

iex> Forex.Support.stringify_code(:usd)
"USD"

iex> Forex.Support.stringify_code("usd")
"USD"

iex> Forex.Support.stringify_code("USD")
"USD"

iex> Forex.Support.stringify_code(:USD)
"USD"

iex> Forex.Support.stringify_code(:usd)
"USD"

iex> Forex.Support.stringify_code("usd")
"USD"

iex> Forex.Support.stringify_code("USD")
"USD"

iex> Forex.Support.stringify_code(:USD)
"USD"

iex> Forex.Support.stringify_code(1)
** (FunctionClauseError) no function clause matching in Forex.Support.stringify_code/1