home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FNDECPT.C < prev    next >
C/C++ Source or Header  |  1990-08-15  |  3KB  |  151 lines

  1. /*
  2.     fndecp.c     11/18/86
  3.  
  4.     % strdecp, strnodecp
  5.  
  6.     Routines for using fixed decimal points 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.      6/01/89 gam    added ocountry stuff
  16.      3/28/90 jmd    ansi-fied
  17.      6/13/90 jdc    replaced backwards pointer math
  18.      8/15/90 pmcm    fixed duplicate '-' problem
  19. */
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <ctype.h>
  24.  
  25. #include "cscape.h"
  26. #include "fnfunc.h"            /* for field functions */
  27.  
  28. char *strdecp(char *s, int pos)
  29. /*
  30.     Place a fixed decimal point at pos.
  31.     Removes leading zeroes (unless there is no other number left of the dec pt).
  32.     (pos = 2)        [   -00000342]
  33.      becomes:         [       -3.42]
  34. */
  35. {
  36.     int        count, minus, i, j;
  37.     char    first;
  38.  
  39.     /* remember first character */
  40.     first = *s;
  41.  
  42.     /* go through the string thrice */
  43.  
  44.     /* first add leading zeroes, (so that short strings work correctly) */
  45.     /* see if this is a negative number */
  46.     minus = FALSE;
  47.     for (i = 0;; i++) {
  48.         if (s[i] == ' ') {
  49.             s[i] = '0';
  50.         }
  51.         else if (s[i] == '-') {
  52.             s[i] = '0';
  53.             minus = TRUE;
  54.         }
  55.         else {
  56.             break;
  57.         }
  58.     }
  59.  
  60.     /* second, add the decimal point (removing old decimal points) */
  61.     for (i = strlen(s) - 1, count = 0; i >= 0; ) {
  62.  
  63.         if ((i > 0) && isdigit(s[i])) {
  64.             count++;
  65.             if ((count == pos) && (s[i - 1] != ocountry.dec_char)) {
  66.  
  67.                 /* slide over front of string (left), insert a point. */
  68.                 i--;    /* move to decp's slot */
  69.                 for (j = 0; j < i; j++) {
  70.                     s[j] = s[j + 1];
  71.                 }
  72.                 s[j] = ocountry.dec_char;
  73.                 /* increment count so that all future decp's are bad */
  74.                 count++;
  75.             }
  76.             i--;
  77.         }
  78.         else if (s[i] == ocountry.dec_char) {
  79.             if (count == pos) {
  80.                 /* decp belongs */
  81.                 i--;
  82.                 /* increment count so that all future decp's are bad */
  83.                 count++;
  84.             }
  85.             else {
  86.                 /* remove old decp */
  87.                 /* slide over front of string (right), insert a '0' at the beginning */
  88.                 for (j = i; j > 0; j--) {
  89.                     s[j] = s[j - 1];
  90.                 }
  91.                 *s = '0';
  92.             }
  93.         }
  94.         else {
  95.             i--;
  96.         }
  97.     }
  98.  
  99.     /* now get rid of leading zeroes (assume no leading spaces) */
  100.     for(i = 0, j = 0; s[i] != '\0'; i++) {
  101.         if (s[i] != '0' || s[i + 1] == ocountry.dec_char || s[i + 1] == '\0') {
  102.             break;
  103.         }
  104.         else {
  105.             s[i] = ' ';
  106.             j++;
  107.         }
  108.     }
  109.  
  110.     /* restore minus sign */
  111.     j--;
  112.     if (minus && (j >= 0)) {
  113.         s[j] = '-';
  114.     }
  115.  
  116.     /* restore first char if possible */
  117.     if (*s == ' ' && first != '0' && !(first == '-' && minus)) {
  118.         *s = first;
  119.     }
  120.  
  121.     return(s);
  122. }
  123.  
  124. char *strnodecp(char *s)
  125. /*
  126.     Removes the decimal point from a string.
  127.     Contracts strings towards the right.
  128.                     [ 1234567.89]
  129.      becomes:        [  123456789]
  130. */
  131. {
  132.     int i, j;
  133.  
  134.     /* move through the string removing commas */
  135.     for (i = strlen(s) - 1; i >= 0; ) {
  136.  
  137.         if (s[i] == ocountry.dec_char) {
  138.             /* slide over front of string, insert a space at the beginning */
  139.             for (j = i; j > 0; j--) {
  140.                 s[j] = s[j - 1];
  141.             }
  142.             *s = ' ';
  143.         }
  144.         else {
  145.             i--;
  146.         }
  147.     }
  148.  
  149.     return(s);
  150. }
  151.