Mercurial > octave
view libcruft/npsol/opnumb.f @ 2329:30c606bec7a8
[project @ 1996-07-19 01:29:05 by jwe]
Initial revision
author | jwe |
---|---|
date | Fri, 19 Jul 1996 01:29:55 +0000 |
parents | |
children |
line wrap: on
line source
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FUNCTION OPNUMB( STRING ) LOGICAL OPNUMB CHARACTER*(*) STRING ************************************************************************ * Description and usage: * * A simple(-minded) test for numeric data is implemented by * searching an input string for legitimate characters: * digits 0 to 9, D, E, -, + and . * Insurance is provided by requiring that a numeric string * have at least one digit, at most one D, E or . * and at most two -s or +s. Note that a few ambiguities remain: * * (a) A string might have the form of numeric data but be * intended as text. No general test can hope to detect * such cases. * * (b) There is no check for correctness of the data format. * For example a meaningless string such as 'E1.+2-' * will be accepted as numeric. * * Despite these weaknesses, the method should work in the * majority of cases. * * * Parameters: * * Name Dimension Type I/O/S Description * OPNUMB L O Set .TRUE. if STRING appears * to be numerical data. * STRING C I Input data to be tested. * * * Environment: ANSI FORTRAN 77. * * * Notes: * * (1) It is assumed that STRING is a token extracted by * OPTOKN, which will have converted any lower-case * characters to upper-case. * * (2) OPTOKN pads STRING with blanks, so that a genuine * number is of the form '1234 '. * Hence, the scan of STRING stops at the first blank. * * (3) COMPLEX data with parentheses will not look numeric. * * * Systems Optimization Laboratory, Stanford University. * 12 Nov 1985 Initial design and coding, starting from the * routine ALPHA from Informatics General, Inc. ************************************************************************ LOGICAL NUMBER INTEGER J, LENGTH, NDIGIT, NEXP, NMINUS, NPLUS, NPOINT CHARACTER*1 ATOM NDIGIT = 0 NEXP = 0 NMINUS = 0 NPLUS = 0 NPOINT = 0 NUMBER = .TRUE. LENGTH = LEN (STRING) J = 0 10 J = J + 1 ATOM = STRING (J:J) IF (ATOM .GE. '0' .AND. ATOM .LE. '9') THEN NDIGIT = NDIGIT + 1 ELSE IF (ATOM .EQ. 'D' .OR. ATOM .EQ. 'E') THEN NEXP = NEXP + 1 ELSE IF (ATOM .EQ. '-') THEN NMINUS = NMINUS + 1 ELSE IF (ATOM .EQ. '+') THEN NPLUS = NPLUS + 1 ELSE IF (ATOM .EQ. '.') THEN NPOINT = NPOINT + 1 ELSE IF (ATOM .EQ. ' ') THEN J = LENGTH ELSE NUMBER = .FALSE. END IF IF (NUMBER .AND. J .LT. LENGTH) GO TO 10 OPNUMB = NUMBER $ .AND. NDIGIT .GE. 1 $ .AND. NEXP .LE. 1 $ .AND. NMINUS .LE. 2 $ .AND. NPLUS .LE. 2 $ .AND. NPOINT .LE. 1 RETURN * End of OPNUMB END