home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 283_01 / dlrcvt.c < prev    next >
C/C++ Source or Header  |  1988-08-28  |  2KB  |  89 lines

  1. /* dlrcvt.c - extracted from MONEY.C to avoid linking old edit routines
  2. */
  3.  
  4. #include "ciao.h"
  5.  
  6. /*
  7. **  dlrcvt -- return a pointer to dollar & cents string with commas
  8. **            input is a long value
  9. **            has trailing minus sign if negative input
  10. **            dollar sign not included
  11. **            leading spaces not included
  12. **            overflow shows ***,***,***.**
  13. */
  14.  
  15. char *dlrcvt( long dval )
  16. {
  17.         static char *f, *q;
  18.         static char *p, dollars[16];
  19.         static char buffer[34];
  20.         static int sign;
  21.  
  22.         /* initialize receiving field */
  23.  
  24.                       /*  0....v....1....v */
  25.         strcpy( dollars, "   ,   ,  0.00 "); 
  26.  
  27.         /* fetch digits to be formatted */
  28.  
  29.         p = ltoa( dval, buffer, 10 );
  30.  
  31.         sign = (*p == '-');
  32.         if (sign) ++p;
  33.  
  34.  
  35.         /* format dollars field, right to left */
  36.  
  37.         q = strchr(p,'\0');        /* locate from end of source string */
  38.         q--;
  39.         f = dollars + 13;          /* locate to end of destination */
  40.         while (f >= dollars)
  41.         {
  42.              if ( q >= p )   /* is q to the right of first digit? */
  43.              {
  44.                  if (*f == ',' || *f == '.') --f;  /* jump left */
  45.                  *f = *q--;
  46.              }
  47.              else            /* no, no more digits remain in source */
  48.              {
  49.                  if (f < dollars + 10) 
  50.                  {
  51.                      *f = ' ';  /* fill destination left with blanks */
  52.                  }
  53.              }
  54.              --f;
  55.         }
  56.  
  57.         if (q > buffer)  /* OVERFLOW? does source still have digits? */
  58.         {
  59.                            /*  0....v....1....v */
  60.              strcpy( dollars, "***,***,***.** ");  /* overflow */
  61.         }
  62.  
  63.         if (sign) dollars[14] = '-';
  64.         f = dollars;
  65.         while (*f == ' ') f++;
  66.         return (f);
  67.  
  68. } /* dlrcvt() */
  69.  
  70.  
  71. /* Same, but minus sign is interpreted as trailing Cr, positive is Dr
  72. */
  73.  
  74. char *crdrform( long x )
  75. {
  76.      static char *q, r[20];
  77.  
  78.      strcpy( r, dlrcvt( x ) );
  79.      q = strchr( r, '\0' );
  80.      --q;
  81.      if ( x == 0L )      strcpy( q, "Dr" ); /* zero is positive */
  82.      else if (*q == '-') strcpy( q, "Cr" ); 
  83.      else                strcpy( q, "Dr" );
  84.      return (r);
  85. }
  86.  
  87.  
  88.  
  89.