AuroraMeter. Credits. Money
(Aurora Meter v0.4.0)
View Source
Conversions between the ledger's integer micro-dollars and the units the rest of the world uses.
AuroraMeter.Credits stores every amount as an integer number of
micro-dollars (1 ยต$ = 1e-6 USD, so 1_000_000 is one dollar and 10_000 is
one cent). Integers keep the ledger exact under concurrency and let a price
of a few thousandths of a cent โ a token, a request, a byte โ be charged
without rounding. Convert at the edges:
iex> AuroraMeter.Credits.Money.from_cents(1_235)
12_350_000
iex> AuroraMeter.Credits.Money.to_cents(12_350_000)
1_235
iex> AuroraMeter.Credits.Money.from_decimal(Decimal.new("12.35"))
12_350_000
iex> AuroraMeter.Credits.Money.format(12_350_000)
"$12.35"
iex> AuroraMeter.Credits.Money.format_compact(1_234_000_000)
"$1.2k"
Summary
Functions
Formats micro-dollars as a dollar string with :precision decimals
(default 2), rounding half away from zero; negative amounts as "-$1.00".
Formats micro-dollars as a short label for a chart axis or a stat tile:
thousands, millions and billions collapse to one decimal ("$1.2k", "$3M"),
ordinary amounts render as dollars and cents ("$0.07"), and a sub-cent
amount keeps just enough precision to stay non-zero ("$0.000015") rather
than rounding away to "$0.00".
Converts cents to micro-dollars.
Converts a Decimal amount of dollars to micro-dollars, rounding half up at
the sixth decimal place.
Converts micro-dollars to whole cents, rounding with :round (default, half
away from zero), :floor or :ceil.
Types
@type micro() :: integer()
An amount in micro-dollars.
Functions
Formats micro-dollars as a dollar string with :precision decimals
(default 2), rounding half away from zero; negative amounts as "-$1.00".
Examples
iex> AuroraMeter.Credits.Money.format(12_350_000)
"$12.35"
iex> AuroraMeter.Credits.Money.format(-1_000_000)
"-$1.00"
iex> AuroraMeter.Credits.Money.format(15, precision: 6)
"$0.000015"
iex> AuroraMeter.Credits.Money.format(1_999_999, precision: 0)
"$2"
Formats micro-dollars as a short label for a chart axis or a stat tile:
thousands, millions and billions collapse to one decimal ("$1.2k", "$3M"),
ordinary amounts render as dollars and cents ("$0.07"), and a sub-cent
amount keeps just enough precision to stay non-zero ("$0.000015") rather
than rounding away to "$0.00".
Use format/2 wherever the exact amount matters; this is for the places where
space matters more than the last decimal.
Examples
iex> AuroraMeter.Credits.Money.format_compact(1_234_000_000)
"$1.2k"
iex> AuroraMeter.Credits.Money.format_compact(70_000)
"$0.07"
iex> AuroraMeter.Credits.Money.format_compact(0)
"$0"
iex> AuroraMeter.Credits.Money.format_compact(2_000_000_000)
"$2k"
iex> AuroraMeter.Credits.Money.format_compact(-4_500_000_000_000)
"-$4.5M"
iex> AuroraMeter.Credits.Money.format_compact(15)
"$0.000015"
Converts cents to micro-dollars.
Examples
iex> AuroraMeter.Credits.Money.from_cents(100)
1_000_000
iex> AuroraMeter.Credits.Money.from_cents(-50)
-500_000
Converts a Decimal amount of dollars to micro-dollars, rounding half up at
the sixth decimal place.
Examples
iex> AuroraMeter.Credits.Money.from_decimal(Decimal.new("0.000015"))
15
iex> AuroraMeter.Credits.Money.from_decimal(Decimal.new("-2.5"))
-2_500_000
Converts micro-dollars to whole cents, rounding with :round (default, half
away from zero), :floor or :ceil.
Examples
iex> AuroraMeter.Credits.Money.to_cents(1_234_999)
123
iex> AuroraMeter.Credits.Money.to_cents(1_235_000)
124
iex> AuroraMeter.Credits.Money.to_cents(1_230_001, rounding: :ceil)
124
iex> AuroraMeter.Credits.Money.to_cents(-1_235_000, rounding: :floor)
-124