13 explicit n4(uint64_t v, uint64_t d = 1) : val(v), div(d) {}
14 std::ostream &print(std::ostream &os)
const {
16 if (val % div && val < div * 100) {
17 if ((v = val * 1000 + div / 2) < div * 1000) {
18 char ofill = os.fill(
'0');
19 os <<
'.' << std::setw(3) << v / div;
23 if ((v = val * 100 + div / 2) < div * 1000) {
24 char ofill = os.fill(
'0');
25 os << val / div <<
'.' << std::setw(2) << (v / div) % 100;
29 if ((v = val * 10 + div / 2) < div * 1000) {
30 os << val / div <<
'.' << (v / div) % 10;
34 v = (val + div / 2) / div;
36 os << std::setw(4) << v;
37 }
else if (v < UINT64_C(999500)) {
38 os << std::setw(3) << (v + 500) / 1000 <<
'K';
39 }
else if (v < UINT64_C(9950000)) {
40 v = (v + UINT64_C(50000)) / UINT64_C(100000);
41 os << v / 10 <<
'.' << v % 10 <<
'M';
42 }
else if (v < UINT64_C(999500000)) {
43 os << std::setw(3) << (v + UINT64_C(500000)) / UINT64_C(1000000) <<
'M';
44 }
else if (v < UINT64_C(9950000000)) {
45 v = (v + UINT64_C(50000000)) / UINT64_C(100000000);
46 os << v / 10 <<
'.' << v % 10 <<
'G';
47 }
else if (v < UINT64_C(999500000000)) {
48 os << std::setw(3) << (v + UINT64_C(500000000)) / UINT64_C(1000000000) <<
'G';
49 }
else if (v < UINT64_C(9950000000000)) {
50 v = (v + UINT64_C(50000000000)) / UINT64_C(100000000000);
51 os << v / 10 <<
'.' << v % 10 <<
'T';
53 os << std::setw(3) << (v + UINT64_C(500000000000)) / UINT64_C(1000000000000) <<
'T';