home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / cvt / gcvt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-19  |  1.1 KB  |  64 lines

  1. #include <stdlib.h>
  2.  
  3. /*
  4.  * gcvt  - Floating output conversion to
  5.  * minimal length string
  6.  */
  7.  
  8. char *
  9. gcvt(double number, size_t ndigit, char *buf)
  10. {
  11.     int sign, decpt;
  12.     register char *p1, *p2;
  13.     register i;
  14.  
  15.     p1 = ecvt(number, ndigit, &decpt, &sign);
  16.     p2 = buf;
  17.     if (sign)
  18.         *p2++ = '-';
  19.     for (i=ndigit-1; i>0 && p1[i]=='0'; i--)
  20.         ndigit--;
  21.     if ((decpt >= 0 && decpt-ndigit > 4)
  22.      || (decpt < 0 && decpt < -3)) { /* use E-style */
  23.         decpt--;
  24.         *p2++ = *p1++;
  25.         *p2++ = '.';
  26.         for (i=1; i<ndigit; i++)
  27.             *p2++ = *p1++;
  28.         *p2++ = 'e';
  29.         if (decpt<0) {
  30.             decpt = -decpt;
  31.             *p2++ = '-';
  32.         } else
  33.             *p2++ = '+';
  34.         if (decpt/100 > 0)
  35.           *p2++ = decpt/100 + '0';
  36.         if (decpt/10 > 0)
  37.           *p2++ = (decpt%100)/10 + '0';
  38.         *p2++ = decpt%10 + '0';
  39.     } else {
  40.         if (decpt<=0) {
  41.             if (*p1!='0')
  42.                 *p2++ = '.';
  43.             while (decpt<0) {
  44.                 decpt++;
  45.                 *p2++ = '0';
  46.             }
  47.         }
  48.         for (i=1; i<=ndigit; i++) {
  49.             *p2++ = *p1++;
  50.             if (i==decpt)
  51.                 *p2++ = '.';
  52.         }
  53.         if (ndigit<decpt) {
  54.             while (ndigit++<decpt)
  55.                 *p2++ = '0';
  56.             *p2++ = '.';
  57.         }
  58.     }
  59.     if (p2[-1]=='.')
  60.         p2--;
  61.     *p2 = '\0';
  62.     return(buf);
  63. }
  64.