On Thu, 07 Jun 2007 10:36:50 -0700 (while OU was sucking), bobm2005

wrote:

>Whatever format I try in Printf, an 'E' format number nearly always

has a leading non-zero:-

1.2345E7

-9.3456E8 etc.

Is it possible to force it (printf) always to have leading zero?

Thus, the above becomes:-

0.12345E8

-0.93456E9

Someone already said no to your question.

What I was going to recommend is that you could write your own. I

wrote my own for some embedded work I was doing (standard SPRINTF is a

memory/code hog). Here is the function, it could be modified to print

the numbers between 0 and 1 instead of 1 to 10.

RonB

// value = value to be printed

// total number of spaces to be occupied

// the z in "%zE"

void outputExp(float value, char total)

{ // # of digits to be printed AFTER decimal point

#define POST_DEC 6

// leading spaces of the

while(total 12){

out_putchar(' ');

--total;

}

total = 0;

// FIRST PRINT SIGN

if((*((char*)&value) & 0x80) == 0x80)

out_putchar('-');

else

out_putchar(' ');

*((char*)&value) &= 0x7F;

// ZERO CASE

if(value == 0)

out_putString("0.000000E+00");

else{

// NUMBER HAS A POSITVE EXPONENT

TF_3 = value;

if(value >= 10){

while(TF_3 >= 10){

TF_3 /= 10;

++total;

}

}

// NUMBER HAS A NEGATIVE EXPONENT

else if(value < 1){

while(TF_3 < 1){

TF_3 *= 10;

++total;

}

total = -total;

}

// TURN NUMBER INTO 7 DIGIT LONG

{

char i= 8-total;

TF_3 = 1;

if(i >= 10){

value *= 1e9;

i -= 9;

}

for(i; i 0; --i)

TF_3 *= 10;

value *= TF_3;

}

// PRINT CHAR BY CHAR

{

xdata long print = value + 5; // ROUNDING

xdata long div = 100000000;

while(div 10){

char ch = print / div;

out_putchar(ch + '0'); //CHAR PRINTER

if(div == 100000000)

out_putchar('.');

print -= (div * ch);

div /= 10;

}

out_putchar('E');

if(total < 0){

out_putchar('-');

total = -total;

}

else

out_putchar('+');

outputInt(total, 2, 1);

// this is my own Integer printer

}

}

}