1+ /**
2+ * Validate if a given string is numeric.
3+ *
4+ * Some examples:
5+ *
6+ * "0" => true
7+ * " 0.1 " => true
8+ * "abc" => false
9+ * "1 a" => false
10+ * "2e10" => true
11+ *
12+ * Note: It is intended for the problem statement to be ambiguous.
13+ * You should gather all requirements up front before implementing one.
14+ *
15+ */
16+ public class ValidNumber {
17+ public boolean isNumber (String s ) {
18+ StringBuffer sb = new StringBuffer (s .trim ());
19+ int i = sb .length () - 1 ;
20+ while (i >= 0 && sb .charAt (i ) == ' ' ) {
21+ i --;
22+ }
23+ sb .delete (i + 1 , sb .length ());
24+ s = sb .toString ();
25+ int length = s .length ();
26+ if (length == 0 )
27+ return false ;
28+ i = 0 ;
29+ int start = 0 ;
30+ if (s .charAt (i ) == '-' || s .charAt (i ) == '+' ) {
31+ i ++;
32+ start ++;
33+ }
34+ for (; i < length ; i ++) {
35+ char c = s .charAt (i );
36+ if (c == 'e' || c == 'E' ) {
37+ return isDouble (s .substring (start , i )) && isDigitals (s .substring (i + 1 , s .length ()));
38+ } else if (c != '.' && (c < '0' || c > '9' )) {
39+ return false ;
40+ }
41+ }
42+ return isDouble (s .substring (start ));
43+ }
44+
45+ private boolean isDouble (String s ) {
46+ int length = s .length ();
47+ if (length == 0 || ((s .charAt (0 ) == '-' || s .charAt (0 ) == '+' ) && length == 1 ))
48+ return false ;
49+ int i = 0 , start = 0 ;
50+ if (s .charAt (i ) == '-' || s .charAt (i ) == '+' ) {
51+ i ++;
52+ start ++;
53+ }
54+ for (; i < length ; i ++) {
55+ char c = s .charAt (i );
56+ if (c == '.' ) {
57+ if (i == start && s .length () - i - 1 == 0 )
58+ return false ;
59+ boolean left = i == start ? true : isDigitals (s .substring (0 , i ));
60+ boolean right = s .length () - i - 1 == 0 ? true : isDigitals (s .substring (i + 1 , s .length ()));
61+ return left && right ;
62+ } else if (c < '0' || c > '9' ) {
63+ return false ;
64+ }
65+ }
66+ return true ;
67+ }
68+
69+ private boolean isDigitals (String s ) {
70+ int length = s .length ();
71+ if (length == 0 || ((s .charAt (0 ) == '-' || s .charAt (0 ) == '+' ) && length == 1 ))
72+ return false ;
73+ int i = 0 ;
74+ if (s .charAt (i ) == '-' || s .charAt (i ) == '+' ) {
75+ i ++;
76+ }
77+ for (; i < length ; i ++) {
78+ char c = s .charAt (i );
79+ if (c < '0' || c > '9' ) {
80+ return false ;
81+ }
82+ }
83+ return true ;
84+ }
85+ }
0 commit comments