support for precision in integer format

master
Daniel Kolesa 2017-02-21 18:17:28 +01:00
parent a23a42da1f
commit 2665c20351
1 changed files with 21 additions and 7 deletions

View File

@ -590,12 +590,22 @@ private:
} }
int base = detail::fmt_bases[specn]; int base = detail::fmt_bases[specn];
if (!val) { bool zval = !val;
if (zval) {
buf[n++] = '0'; buf[n++] = '0';
} }
for (; val; val /= base) { for (; val; val /= base) {
buf[n++] = detail::fmt_digits[isp >= 'a'][val % base]; buf[n++] = detail::fmt_digits[isp >= 'a'][val % base];
} }
size_t tn = n;
if (has_precision()) {
int prec = precision();
if (size_t(prec) > tn) {
tn = size_t(prec);
} else if (!prec && zval) {
tn = 0;
}
}
int fl = flags(); int fl = flags();
bool lsgn = fl & FMT_FLAG_PLUS; bool lsgn = fl & FMT_FLAG_PLUS;
@ -611,20 +621,24 @@ private:
} }
if (!zero) { if (!zero) {
write_spaces(writer, n + pfxlen + sign, true, ' '); write_spaces(writer, tn + pfxlen + sign, true, ' ');
} }
if (sign) { if (sign) {
writer.put(neg ? '-' : *((" \0+") + lsgn * 2)); writer.put(neg ? '-' : *((" \0+") + lsgn * 2));
} }
range_put_all(writer, string_range{pfx, pfx + pfxlen}); range_put_all(writer, string_range{pfx, pfx + pfxlen});
if (zero) { if (zero) {
write_spaces(writer, n + pfxlen + sign, true, '0'); write_spaces(writer, tn + pfxlen + sign, true, '0');
} }
if (tn) {
for (int i = int(n - 1); i >= 0; --i) { for (size_t i = 0; i < (tn - n); ++i) {
writer.put(buf[i]); writer.put('0');
}
for (size_t i = 0; i < n; ++i) {
writer.put(buf[n - i - 1]);
}
} }
write_spaces(writer, n + sign + pfxlen, false); write_spaces(writer, tn + sign + pfxlen, false);
} }
/* floating point */ /* floating point */