30 static constexpr const char* units[] = {
"B",
"KiB",
"MiB",
"GiB",
"TiB",
"PiB",
"EiB"};
31 static constexpr std::size_t unit_count =
sizeof(units) /
sizeof(units[0]);
38 double value =
static_cast< double >(bytes);
39 std::size_t unit_index = 0;
40 while (value >= 1024.0 && unit_index + 1 < unit_count)
46 auto decimals_for = [](
double v) -> std::ptrdiff_t
52 auto const digits =
static_cast< std::ptrdiff_t
>(std::floor(std::log10(v))) + 1;
53 return std::max< std::ptrdiff_t >(0, 3 - digits);
56 auto decimals = decimals_for(value);
57 double scale = std::pow(10.0,
static_cast< double >(decimals));
58 double rounded = std::round(value * scale) / scale;
60 if (rounded >= 1024.0 && unit_index + 1 < unit_count)
62 value = rounded / 1024.0;
64 decimals = decimals_for(value);
65 scale = std::pow(10.0,
static_cast< double >(decimals));
66 rounded = std::round(value * scale) / scale;
69 std::ostringstream oss;
72 oss << bytes << units[unit_index];
76 oss << std::fixed << std::setprecision(static_cast< int >(decimals)) << rounded << units[unit_index];