source: trunk/STRING/isnumber.pro @ 2

Last change on this file since 2 was 2, checked in by opalod, 22 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1;-------------------------------------------------------------
2;+
3; NAME:
4;       ISNUMBER
5; PURPOSE:
6;       Determine if a text string is a valid number.
7; CATEGORY:
8; CALLING SEQUENCE:
9;       i = isnumber(txt, [x])
10; INPUTS:
11;       txt = text string to test.                      in
12; KEYWORD PARAMETERS:
13; OUTPUTS:
14;       x = optionaly returned numeric value if valid.  out
15;       i = test flag:                                  out
16;           0: not a number.
17;           1: txt is a long integer.
18;           2: txt is a float.
19;           -1: first word of txt is a long integer.
20;           -2: first word of txt is a float.
21; COMMON BLOCKS:
22; NOTES:
23; MODIFICATION HISTORY:
24;       R. Sterner.  15 Oct, 1986.
25;       Johns Hopkins Applied Physics Lab.
26;       R. Sterner, 12 Mar, 1990 --- upgraded.
27;       Richard Garrett, 14 June, 1992 --- fixed bug in returned float value.
28;
29; Copyright (C) 1986, Johns Hopkins University/Applied Physics Laboratory
30; This software may be used, copied, or redistributed as long as it is not
31; sold and this copyright notice is reproduced on each copy made.  This
32; routine is provided as is without any express or implied warranties
33; whatsoever.  Other limitations apply as described in the file disclaimer.txt.
34;-
35;-------------------------------------------------------------
36 
37        FUNCTION ISNUMBER, TXT0, X, help=hlp
38       
39        if (n_params(0) lt 1) or keyword_set(hlp) then begin
40          print,' Determine if a text string is a valid number.'
41          print,' i = isnumber(txt, [x])'
42          print,'   txt = text string to test.                      in'
43          print,'   x = optionaly returned numeric value if valid.  out'
44          print,'   i = test flag:                                  out'
45          print,'       0: not a number.'
46          print,'       1: txt is a long integer.'
47          print,'       2: txt is a float.'
48          print,'       -1: first word of txt is a long integer.'
49          print,'       -2: first word of txt is a float.'
50          return, -1
51        endif
52 
53        TXT = STRTRIM(TXT0,2)   ; trim blanks.
54        X = 0                   ; define X.
55 
56        IF TXT EQ '' THEN RETURN, 0     ; null string not a number.
57 
58        SN = 1
59        IF NWRDS(TXT) GT 1 THEN BEGIN   ; get first word if more than one.
60          SN = -1
61          TXT = GETWRD(TXT,0)
62        ENDIF
63         
64        f_flag = 0              ; Floating flag.
65        b = byte(txt)
66        w = where(b eq 43, cnt)
67        if cnt gt 1 then return, 0
68        t = delchr(txt,'+')
69        w = where(b eq 45, cnt)
70        if cnt gt 1 then return, 0
71        t = delchr(t,'-')
72        w = where(b eq 46, cnt)                 ; '.'
73        if cnt gt 1 then return, 0              ; May only be 1.
74        if cnt eq 1 then f_flag = 1             ; If one then floating.
75        t = delchr(t,'.')
76        w = where(b eq 101, cnt)                ; 'e'
77        if cnt gt 1 then return, 0
78        if cnt eq 1 then f_flag = 1
79        t = delchr(t,'e')
80        w = where(b eq 69, cnt)                 ; 'E'
81        if cnt gt 1 then return, 0
82        if cnt eq 1 then f_flag = 1
83        t = delchr(t,'E')
84        w = where(b eq 100, cnt)                ; 'd'
85        if cnt gt 1 then return, 0
86        if cnt eq 1 then f_flag = 1
87        t = delchr(t,'d')
88        w = where(b eq 68, cnt)                 ; 'D'
89        if cnt gt 1 then return, 0
90        if cnt eq 1 then f_flag = 1
91        t = delchr(t,'D')
92        if total((b eq 101)+(b eq 69)+(b eq 100)+(b eq 68)) gt 1 then return,0
93        b = byte(t)
94        if total((b ge 65) and (b le 122)) ne 0 then return, 0
95 
96        c = strmid(t,0,1)
97        if (c lt '0') or (c gt '9') then return, 0  ; First char not a digit.
98 
99        x = txt + 0.0                               ; Convert to a float.
100        if f_flag eq 1 then return, 2*sn            ; Was floating.
101        if x eq long(x) then begin
102          x = long(x)
103          return, sn
104        endif else begin
105          return, 2*sn
106        endelse
107 
108        END
Note: See TracBrowser for help on using the repository browser.