-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path_valid_number.c
62 lines (56 loc) · 1.52 KB
/
_valid_number.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
bool isNumber(char* s) {
// Parse white spaces
while(isspace(*s)) s++;
// Parse '-' or '+' signs
if(*s == '-' || *s == '+')
s++;
// Check for invalid starting 'e'
if(*s == 'e')
return false;
bool dot = false;
bool exp = false;
bool num = false;
bool enm = false;
// Parse number
while(*s) {
switch(*s) {
// Parse digits
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
num = true;
if(exp)
enm = true;
break;
// Parse decimal point
case '.':
if(dot || exp)
return false;
dot = true;
break;
// Parse exponent
case 'e':
if(exp || !num)
return false;
exp = true;
if(*(s+1) == '+' || *(s+1) == '-')
s++;
break;
// Parse other cases
default:
// Parse end whitespaces
while(isspace(*s)) s++;
// If not end of string, return false
if(*s) return false;
// If end of string, return true
if(exp)
return enm && num;
else
return num;
}
s++;
}
if(exp)
return enm && num;
else
return num;
}