/* Copyright (C) 1995 by Thomas Glen Smith. All Rights Reserved. */ /* formatt APL2 V1.0.0 ************************************************* * Called by formatr to use sprintf to round a value to the desired * * number of places, then format it using sprint, and then to remove * * any left and right zero fill done by sprintf. Returns the address * * of the first significant digit left of the decimal point. * * If there are no significant digits, returns the address of the * * decimal point, if there is one, or the address of the end of string * * ('\0') otherwise. * ***********************************************************************/ #define INCLUDES STDIO+STRING #include "includes.h" char *formatt(buffer,value,places) char *buffer; /* Place to store formatted output. */ double value; /* Value to be formatted. */ int places; /* Number of places desired right of decimal point. */ { char *bd,*be,*bp,*bq,ch; double dw; int i; if (i = places) /* decimals to print right of d.p. */ for(dw = 10.0; i > 1; i--) dw *= 10.0; /* 10.0 for 1 decimal, 100.0 for 2,... */ else dw = 1.0; value += 1.0 / (2.0 * dw); /* Round. */ sprintf(buffer,"%f",value); bp = buffer; /* Start of buffer. */ while(' ' == *bp) bp++; /* Find 1st non-blank. */ while('0' == *bp) bp++; /* Find 1st significant digit. */ be = buffer + strlen(buffer); /* End of buffer, addr('\0'). */ for(bd = bp; bd < be; bd++) if (*bd == '.') break; /* Find decimal point. */ bq = bd + places + 1; /* Maximum desired position. */ while(be > bq) *(--be) = '\0'; /* Strip extra decimals. */ for(bq = be - 1; bq > bd; bq--) { ch = *bq; if (ch == ' ' || ch == '0') /* Strip trailing blanks and zeros */ *bq = '\0'; /* right of decimal point. */ else break; } return(bp); /* Return ptr to 1st significant digit left of d.p. */ }