Current section

Files

Jump to
exosql lib format.ex
Raw

lib/format.ex

require Logger
defmodule ExoSQL.Format do
@format_re ~r/%[\d\.\-]*[%fsdk]/
@format_re_one ~r/([\d\.\-]*)([fsdk])/
def format(str, params) do
{str, []} = Regex.split(@format_re, str, include_captures: true)
|> Enum.reduce({"", params}, fn
("%%", {acc, params}) ->
{acc <> "%", params}
("%" <> fs, {acc, params}) ->
[head | rest] = params
repl = format_one(fs, head)
{acc <> repl, rest}
(other, {acc, params}) ->
{acc <> other, params}
end)
str
end
def format_one(type, data) do
to_string(data)
Regex.replace(@format_re_one, type, fn
_, "", "s" ->
to_string(data)
_, "", "f" ->
{:ok, data} = ExoSQL.Utils.to_float(data)
Float.to_string(data, decimals: 2)
_, "." <> decimals, "f" ->
{:ok, data} = ExoSQL.Utils.to_float(data)
{:ok, decimals} = ExoSQL.Utils.to_number(decimals)
Float.to_string(data, decimals: decimals)
_, "", "d" ->
{:ok, data} = ExoSQL.Utils.to_number(data)
data = Kernel.trunc(data)
"#{data}"
_, ".", "k" ->
{:ok, data} = ExoSQL.Utils.to_float(data)
Logger.debug(" > #{inspect data}")
{data, sufix} = cond do
data >= 100_000 ->
data = data / 1_000_000
data = Float.to_string(data, decimals: 2)
{data, "M"}
data >= 100 ->
data = data / 1_000
data = Float.to_string(data, decimals: 2)
{data, "k"}
true ->
data = Float.to_string(data, decimals: 2)
{data, ""}
end
"#{data}#{sufix}"
_, "", "k" ->
{:ok, data} = ExoSQL.Utils.to_number(data)
data = Kernel.trunc(data)
{data, sufix} = cond do
data >= 1_000_000 ->
{div(data, 1_000_000), "M"}
data >= 1_000 ->
{div(data, 1_000), "k"}
true ->
{data, ""}
end
"#{data}#{sufix}"
end)
end
end