113 static constexpr reloco::array<string_view, 6> SI_PREFIXES = {
"",
"k",
"M",
"G",
"T",
"P"};
114 static constexpr reloco::array<string_view, 6> IEC_PREFIXES = {
"",
"Ki",
"Mi",
"Gi",
"Ti",
"Pi"};
116 const uint32_t base_div =
static_cast<uint32_t
>(auv.base);
119 const bool is_negative = auv.value < 0;
120 uint64_t abs_val = is_negative ?
static_cast<uint64_t
>(-auv.value) :
static_cast<uint64_t
>(auv.value);
122 size_t scale_idx = 0;
123 uint64_t remainder = 0;
124 uint64_t current_div = 1;
127 while (abs_val >= base_div && scale_idx < 5) {
128 remainder = abs_val % base_div;
130 current_div = base_div;
139 detail::format_unsigned<detail::radix::decimal>(out, abs_val,
false, 0);
141 const uint8_t prec = (parse_precision != 255) ? parse_precision : auv.precision;
144 if (prec > 0 && scale_idx > 0) {
146 uint64_t frac_multiplier = 1;
147 for (uint8_t i = 0; i < prec; ++i)
148 frac_multiplier *= 10;
150 uint64_t frac_part = (remainder * frac_multiplier) / current_div;
151 detail::format_unsigned<detail::radix::decimal>(out, frac_part,
false, prec);
155 out.write(prefixes[scale_idx]);
156 out.write(auv.unit_symbol);