home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_02 / curinput.c < prev    next >
C/C++ Source or Header  |  1992-09-03  |  4KB  |  119 lines

  1. /* CURINPUT.C
  2.  * Currency format input function
  3.  * Uses non-ANSI unbuffered char I/O functions
  4.  * W.F.H. Borman
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <conio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11.  
  12. #define DOUBLESTRING 16         // Max. 15 digits
  13.  
  14. double curcy_input(void)
  15. {
  16.   char numstr[DOUBLESTRING];    // Number string
  17.   int dotflag = 0;              // Decimal point flag
  18.   int deccntr=0;                // Dec. place counter
  19.   int ch;                       // Input character
  20.   int i=0;                      // Pointer in numstr
  21.   double number;                // Return value
  22.  
  23.   while ((ch=getch()) !='\r') { // Input until CR
  24.  
  25.     if(ch == 0)  {              // Extended code
  26.       getch();                  // Discard 2nd part
  27.       putch('\a');              // Beep
  28.       continue;                 // Get next input
  29.     }
  30.  
  31. /***  Handle backspace character                  ***/
  32.  
  33.     if(i>0 && ch=='\b') {       // If backspaced
  34.       i--;                      // Decrement pointer
  35.       putch('\b');              // Move cursor back
  36.       putch(' ');               // Erase character
  37.       putch('\b');              // Move cursor back
  38.       if(deccntr)               // If dec.pt. used
  39.         deccntr--;              // Update dec.counter
  40.       if(numstr[i] =='.')       // If dec.pt. erased
  41.         dotflag = 0;            // Reset dec.pt.flag
  42.       continue;                 // Read next character
  43.     }
  44.  
  45. /***  Check validity of character entered:        ***/
  46.  
  47.     if(strchr("0123456789-.",ch)) {    // Valid chars.
  48.       switch(dotflag) {         // Dec.pt. entered?
  49.  
  50. /***  Before decimal point has been entered:      ***/
  51.  
  52.         case 0:
  53.           if(ch=='-' && i>0) {  // Embedded '-'
  54.             putch('\a');        // Beep and break
  55.           }
  56.           else if(i<(DOUBLESTRING-1)) { 
  57.             putch(ch);          // Print digit
  58.             numstr[i] = ch;     // Add ch to numstr
  59.             i++;                // Increment pointer
  60.             if(ch=='.')         // If ch is '.'
  61.               dotflag = 1;      // Set flag
  62.           }
  63.           else {                // Numstr is full
  64.             putch('\a');        // Beep and break
  65.           }
  66.           break;
  67.  
  68. /***  After decimal point has been entered:       ***/
  69. /***  '.' and '-' are invalid; 2 dec. places max. ***/
  70.         
  71.         case 1:
  72.           if(ch=='.' || ch=='-' || deccntr>=2) {
  73.             putch('\a');        // Beep and break
  74.           }
  75.           else if(i<(DOUBLESTRING-1))  { 
  76.             putch(ch);
  77.             numstr[i] = ch;
  78.             i++;
  79.             deccntr++;
  80.           }
  81.           else {
  82.             putch('\a');
  83.           }
  84.       }                         // End switch(dotflag)
  85.       continue;                 // Read next character
  86.     }                           // End if(strchr...)
  87.  
  88. /***  Invalid ch entered to get this far!         ***/
  89.  
  90.     putch('\a');                // Beep
  91.  
  92. /***  Continue until CR entered:                  ***/
  93.  
  94.   }                             // End while((ch=...)
  95.  
  96.   numstr[i] = '\0';             // Terminate string
  97.   number = atof(numstr);        // Convert to double
  98.   return number;                // Return number
  99. }
  100.  
  101.  
  102.  
  103.  
  104. /*** --------------- Test driver ---------------- ***/
  105.  
  106. main()
  107. {
  108.   double currency;
  109.  
  110.   clrscr();
  111.   puts("\n\nEnter a currency amount: ");
  112.   currency = curcy_input();
  113.   printf("\nThat number was %.2f\n", currency);
  114.   puts("press a key to continue");
  115.   getch();
  116.   return 0;
  117. }
  118.  
  119.