Packages

phoenix_kit

1.7.153
1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit utils format.ex
Raw

lib/phoenix_kit/utils/format.ex

defmodule PhoenixKit.Utils.Format do
@moduledoc """
Workspace-shared formatting helpers for numeric / size values.
"""
@doc """
Formats a byte count as a human-readable size string.
Accepts an integer, `Decimal`, or `nil`. Returns the `:unknown` option
string for `nil` (or any unrecognised input) and rounds to `:decimals`
decimal places for the chosen unit. The unit auto-scales to B / KB /
MB / GB based on the size.
## Options
- `:decimals` — decimal places for KB/MB/GB output. Default `1`.
- `:unknown` — string returned for `nil` or unrecognised inputs.
Default `"Unknown"`. Pass `"0 B"` to mimic the file-picker shape.
- `:base``1024` (binary, default) or `1000` (decimal/SI). Some
media-browser surfaces use the decimal convention to match what
operating systems show; everything else defaults to the binary
convention common in dev tooling.
## Examples
iex> PhoenixKit.Utils.Format.bytes(0)
"0 B"
iex> PhoenixKit.Utils.Format.bytes(1500)
"1.5 KB"
iex> PhoenixKit.Utils.Format.bytes(1_500_000, decimals: 2)
"1.43 MB"
iex> PhoenixKit.Utils.Format.bytes(1_500_000, base: 1000, decimals: 2)
"1.5 MB"
iex> PhoenixKit.Utils.Format.bytes(nil, unknown: "0 B")
"0 B"
"""
@spec bytes(integer() | Decimal.t() | nil, keyword()) :: String.t()
def bytes(value, opts \\ [])
def bytes(nil, opts), do: Keyword.get(opts, :unknown, "Unknown")
def bytes(0, _opts), do: "0 B"
def bytes(%Decimal{} = d, opts) do
d |> Decimal.to_integer() |> bytes(opts)
end
def bytes(n, opts) when is_number(n) and n > 0 do
decimals = Keyword.get(opts, :decimals, 1)
{kb, mb, gb} = unit_thresholds(Keyword.get(opts, :base, 1024))
cond do
n >= gb -> "#{Float.round(n / gb, decimals)} GB"
n >= mb -> "#{Float.round(n / mb, decimals)} MB"
n >= kb -> "#{Float.round(n / kb, decimals)} KB"
true -> "#{n} B"
end
end
def bytes(_, opts), do: Keyword.get(opts, :unknown, "Unknown")
defp unit_thresholds(1000), do: {1_000, 1_000_000, 1_000_000_000}
defp unit_thresholds(_), do: {1024, 1_048_576, 1_073_741_824}
end