void
num_to_string (double v, char *s, int w, int d)
{
- struct fmt_spec f;
- f.type = FMT_F;
- f.w = w;
- f.d = d;
+ struct fmt_spec f = make_output_format (FMT_F, w, d);
convert_F (s, &f, v);
}
\f
/* There are no decimal places, so there's no way
that the value can be shortened. Either it fits
or it doesn't. */
- char buf[40];
+ char buf[41];
sprintf (buf, "%*.0f", fp->w, number);
if (strlen (buf) <= fp->w)
{
sprintf (buf, "%.*f", decimals, number);
+ /* Omit integer part if it's 0. */
if (!memcmp (buf, "0.", 2))
memmove (buf, buf + 1, strlen (buf));
else if (!memcmp (buf, "-0.", 3))
}
}
+ /* Omit `-' if value output is zero. */
+ if (buf[0] == '-' && buf[strspn (buf, "-.0")] == '\0')
+ memmove (buf, buf + 1, strlen (buf));
+
buf_copy_str_lpad (dst, fp->w, buf);
return 1;
}