Add module to format numbers
This commit is contained in:
@@ -0,0 +1,51 @@
|
|||||||
|
defmodule MusicLibrary.FormatNumber do
|
||||||
|
@moduledoc """
|
||||||
|
Provides utilities for formatting numbers with human-readable suffixes.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
iex> MusicLibrary.FormatNumber.to_compact(96591)
|
||||||
|
"96.6k"
|
||||||
|
|
||||||
|
iex> MusicLibrary.FormatNumber.to_compact(1234)
|
||||||
|
"1.2k"
|
||||||
|
|
||||||
|
iex> MusicLibrary.FormatNumber.to_compact(999)
|
||||||
|
"999"
|
||||||
|
|
||||||
|
iex> MusicLibrary.FormatNumber.to_compact(1500000)
|
||||||
|
"1.5M"
|
||||||
|
|
||||||
|
iex> MusicLibrary.FormatNumber.to_compact(2000000000)
|
||||||
|
"2.0B"
|
||||||
|
|
||||||
|
iex> MusicLibrary.FormatNumber.to_compact(0)
|
||||||
|
"0"
|
||||||
|
"""
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Converts an integer to a compact string representation using k, M, B suffixes.
|
||||||
|
|
||||||
|
Numbers less than 1,000 are returned as-is.
|
||||||
|
Numbers 1,000 and above are formatted with appropriate suffix and one decimal place.
|
||||||
|
"""
|
||||||
|
def to_compact(number) when is_integer(number) and number < 1000 do
|
||||||
|
Integer.to_string(number)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_compact(number) when is_integer(number) and number < 1_000_000 do
|
||||||
|
format_with_suffix(number / 1000, "k")
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_compact(number) when is_integer(number) and number < 1_000_000_000 do
|
||||||
|
format_with_suffix(number / 1_000_000, "M")
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_compact(number) when is_integer(number) do
|
||||||
|
format_with_suffix(number / 1_000_000_000, "B")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_with_suffix(value, suffix) do
|
||||||
|
"#{:erlang.float_to_binary(value, decimals: 1)}#{suffix}"
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
defmodule MusicLibrary.FormatNumberTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
doctest MusicLibrary.FormatNumber
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user