Skip to content

Commit a32fbce

Browse files
committed
formatter: added hex,octal output for 128-bit integers
1 parent 46d38b5 commit a32fbce

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

formatter.h

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,11 +231,21 @@ std::enable_if_t<std::is_same_v<NUM,__int128_t>,std::ostream&> operator<<(std::o
231231
else {
232232
unum = num;
233233
}
234+
int base = 10;
235+
switch (os.flags() & os.basefield)
236+
{
237+
case std::ios_base::hex: base = 16; break;
238+
case std::ios_base::oct: base = 8; break;
239+
case std::ios_base::dec: base = 10; break;
240+
default:
241+
break;
242+
// todo - support bin as well
243+
}
234244

235245
while (unum) {
236-
int digit = unum % 10;
237-
unum /= 10;
238-
*--p = '0' + digit;
246+
int digit = unum % base;
247+
unum /= base;
248+
*--p = (digit<10) ? ('0' + digit) : ('a' + digit - 10);
239249
}
240250
if (isneg)
241251
*--p = '-';
@@ -253,10 +263,21 @@ std::enable_if_t<std::is_same_v<NUM,__uint128_t>,std::ostream&> operator<<(std::
253263
std::string txt(40, char(0));
254264
auto p = txt.end();
255265

266+
int base = 10;
267+
switch (os.flags() & os.basefield)
268+
{
269+
case std::ios_base::hex: base = 16; break;
270+
case std::ios_base::oct: base = 8; break;
271+
case std::ios_base::dec: base = 10; break;
272+
default:
273+
break;
274+
// todo - support bin as well
275+
}
276+
256277
while (num) {
257-
int digit = num % 10;
258-
num /= 10;
259-
*--p = '0' + digit;
278+
int digit = num % base;
279+
num /= base;
280+
*--p = (digit<10) ? ('0' + digit) : ('a' + digit - 10);
260281
}
261282

262283
txt.erase(txt.begin(), p);

0 commit comments

Comments
 (0)