printing double in n character field
Jamshid Afshar
jamshid at emx.utexas.edu
Wed Jan 16 03:53:38 AEST 1991
I am trying to sprintf a double into a character string so the
string can be edited by the user. The problem is I want the string to
always be a set length. I thought I had finally come up with a
solution (see below) using significant digits, but I forgot about
cases where zeroes immediately follow the decimal point (those zeroes
are not sig. digs). These are examples of what I would like (width==5):
I have this double value I want this string
12345.6 |12345|
12.4 | 12.4|
1234.5 | 1235|
1.00004 | 1|
0.0004 | 0|
0.00453 |0.005|
The following doesn't work for the last two examples.
// pre: s points to 'width' characters and d can be displayed in width chars
// post: s is a valid numeric string and strlen(s)==width
void numtoa(char *s, double d, int width)
{
int sigdigs = max_num_len(ceil(d));
if (sigdigs<=width-2) { // if at least one decimal place will fit
if (d<1) sigdigs = width-2; // 1 for decimal point, 1 for zero
else sigdigs = width-1; // subtract 1 for decimal point
}
sprintf(s, "%*.*lg", width, sigdigs, d);
}
int max_num_len(unsigned long number)
{
if (number<10) return 1;
else if (number < 100) return 2;
else if (number < 1000) return 3;
// ... you get the idea
}
I'm sure I'm not the first to need something like this. I would fix
mine, but I'm hoping there is a more elegant solution. I'll post a
summary.
Thanks, Jamshid Afshar
jamshid at emx.utexas.edu
More information about the Comp.lang.c
mailing list