home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / FUNCS / FNCOMMA.C < prev    next >
C/C++ Source or Header  |  1990-06-14  |  2KB  |  125 lines

  1. /*
  2.     fncomma.c      11/18/86
  3.  
  4.     % strcomma, strnocomma
  5.  
  6.     Routines for using commas in numeric fields.
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      5/13/88 jmd     removed length restrictions
  15.     12/13/88 jmd     removed nasty strchr
  16.      6/01/89 gam    added ocountry stuff
  17.  
  18.      3/28/90 jmd    ansi-fied
  19.      6/13/90 jdc    replace backwards pointer math with integer math
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <ctype.h>
  25.  
  26. #include "cscape.h"
  27. #include "fnfunc.h"            /* for field functions */
  28.  
  29. char *strcomma(char *s)
  30. /*
  31.     Adds appropriate commas to a numeric string.
  32.     Everything to right of the (first) decimal point is ignored.
  33.                     [   123456789.3333]
  34.      becomes:         [ 123,456,789.3333]
  35. */
  36. {
  37.     int        count, i, j;
  38.     char    first;
  39.  
  40.     /* remember first character */
  41.     first = *s;
  42.  
  43.     /* find end of string or first decimal point */
  44.     for (i = 0; s[i] != ocountry.dec_char && s[i] != '\0'; i++) {
  45.         ;
  46.     }
  47.  
  48.     /* move through the string adding commas (removing old ones as we go) */
  49.     count = 0;
  50.     while (i >= 0) {
  51.         if ((i > 0) && isdigit(s[i])) {
  52.  
  53.             count++;
  54.             if ((count % 3) == 0 && isdigit(s[i - 1])) {
  55.  
  56.                 /* slide over front of string (left), insert a comma. */
  57.  
  58.                 i--;    /* move to comma's slot */
  59.  
  60.                 for (j = 0; j < i; j++) {
  61.                     s[j] = s[j + 1];
  62.                 }
  63.                 s[j] = ocountry.sep_char;
  64.             }
  65.             i--;
  66.         }
  67.         else if (s[i] == ocountry.sep_char) {
  68.  
  69.             if ((i > 0) && (count > 0) && (count % 3) == 0 && isdigit(s[i - 1])) {
  70.                 /* comma belongs */
  71.                 i--;
  72.             }
  73.             else {
  74.                 /* remove old comma */
  75.                 /* slide over front of string (right), insert a space at the beginning */
  76.  
  77.                 for (j = i; j > 0; j--) {
  78.                     s[j] = s[j - 1];
  79.                 }
  80.                 *s = ' ';
  81.             }
  82.         }
  83.         else {
  84.             i--;
  85.         }
  86.     }
  87.  
  88.     /* restore first char if possible */
  89.     if (*s == ' ') {
  90.         *s = first;
  91.     }
  92.  
  93.     return(s);
  94. }
  95.  
  96. char *strnocomma(char *s)
  97. /*
  98.     Removes commas from a string.
  99.     Contracts strings towards the right.
  100.                     [ 123,456,789]
  101.      becomes:        [   123456789]
  102. */
  103. {
  104.     int i, j;
  105.  
  106.     /* move through the string removing commas */
  107.     for (i = strlen(s) - 1; i >= 0; ) {
  108.  
  109.         if (s[i] == ocountry.sep_char) {
  110.  
  111.             /* slide over front of string, insert a space at the beginning */
  112.  
  113.             for (j = i; j > 0; j--) {
  114.                 s[j] = s[j - 1];
  115.             }
  116.             *s = ' ';
  117.         }
  118.         else {
  119.             i--;
  120.         }
  121.     }
  122.  
  123.     return(s);
  124. }
  125.