1 package algorithms; 2 3 /** 4 * 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 5 * 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 6 * 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 7 * 8 **/ 9 /* 最简便的方法用java的正则表达式去做 10 * 11 * 数字的格式可以用A[.[B]][E|eC]表示,其中A和C都是整数(可以有符号) 12 * B是无符号整数 13 * */ 14 public class IsNumeric { 15 int start = 0; 16 17 public boolean isNumeric(char[] str) { 18 boolean numeric = false; 19 if (str.length == 0) 20 return false; 21 numeric = scanInteger(str); 22 //如果出现'.',接下类就扫描小数部分 23 if (start < str.length && str[start] == '.') { 24 start++; 25 //下面一行用 || 的原因 26 //1.小数可以没有数字 但此时必须要有整数部分 如233. 27 //2.小数可以没有整数部分,但此时小数部分必须要有数字 .456 28 //3.正常的小数 233.666 29 numeric = scanUnsignedInteger(str) || numeric; 30 } 31 if (start < str.length-1 && (str[start] == 'e' || str[start] == 'E')) { 32 start++; 33 //e或E前后都要有数字 所以用&& 34 numeric = scanInteger(str) && numeric; 35 } 36 return numeric && (start == str.length); 37 } 38 39 public boolean scanUnsignedInteger(char[] str) { 40 int i; 41 for (i = start; i < str.length; i++) { 42 if (!(str[i] >= '0' && str[i] <= '9')) 43 break; 44 } 45 if (i > start) { 46 start = i ; 47 return true; 48 } 49 return false; 50 } 51 52 public boolean scanInteger(char[] str) { 53 if (str[start] == '+' || str[start] == '-') { 54 start++; 55 return scanUnsignedInteger(str); 56 } 57 return scanUnsignedInteger(str); 58 } 59 60 public static void main(String[] args) { 61 char[] str = { '1', '2', '3','.','4','5','e','+','6' }; 62 IsNumeric ma = new IsNumeric(); 63 System.out.println(ma.isNumeric(str)); 64 } 65 }