实现一个函数用来判断字符串是否表示数值
题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”±5”和”12e+4.3”都不是。
思路:
设有符号的整数为A,无符号的整数为B,
那么最标准的形式应该是
A . B E/e A
任何一个合法的数字肯定是他的子集按某种意义
.100
190.
-2.9E-2
等等
整个算法大体分为两段判断小数点,以及判断E后面
public boolean numberic(char a[]) {
if(a==null){
return false;//l鲁棒
}
boolean numberic;//这个变量代表目前此时这个时候字符串是不是合法的
int index[] = new int[1];
index[0] = 0;
//开始先判断这个数是不是以符号开头
numberic = isSigned(a, index);//判断是否是有无符号的整数完毕,现在如果后面又小数点或者e需要继续判断
if(index[0]<a.length&&(a[index[0]]=='.')){
index[0]++;//需要判断. 后面的东西,此时有几种情况,有 有符号数后面有一个小数点 、 有符号数后面有小数点并且
//小数点后面还有无符号数 、 开头就是小数点然后是无符号数
numberic = isUnsigned(a,index)||numberic;//||的左面是代表以小数点开头的情况||右面代表xxx.xxxz这种情况
}//下面就要判断E的情况
if(index[0]<a.length&&(a[index[0]]=='E'||a[index[0]]=='e')){
index[0]++;
numberic = isSigned(a,index)&&numberic;
}
if(numberic&&index[0]==a.length){
return true;
}
return false;
}
private boolean isSigned(char[] a, int[] index) {
if (index[0] < a.length && (a[index[0]] == '+' || a[index[0]] == '-')) {
index[0]++;
}//判断符号完毕接下来判断符号后面是不是整数
return isUnsigned(a, index);
}
private boolean isUnsigned(char[] a, int[] index) {
int start = index[0];
while (index[0] < a.length && ((a[index[0]] - '0') >= 0 && (a[index[0]] - '0') <= 9)) {
index[0]++;
}
if (index[0] > start) {//代表是整数这一块截至
return true;
} else
return false;
}
测试:
void test(String testName, char[] str, boolean expected) {
System.out.print(testName + ":");
if (numberic(str) == expected) {
System.out.println(" passed!");
}else {
System.out.println(" failed!");
}
}
void test1() {
char[] str = null;
test("test1", str, false);
}
void test2() {
char[] str = {};
test("test2", str, false);
}
void test3() {
String string ="e3";
char[] str=string.toCharArray();
test("test3", str, false);
}
void test4() {
String string ="3e1.2";
char[] str=string.toCharArray();
test("test4", str, false);
}
void test5() {
String string ="e3";
char[] str=string.toCharArray();
test("test5", str, false);
}
void test6() {
String string ="1.2e3";
char[] str=string.toCharArray();
test("test6", str, true);
}
void test7() {
String string ="-.2e3";
char[] str=string.toCharArray();
test("test7", str, true);
}
void test8() {
String string ="-.2e-3";
char[] str=string.toCharArray();
test("test8", str, true);
}
void test9() {
String string ="1.e-3";
char[] str=string.toCharArray();
test("test9", str, true);
}
void test10() {
String string ="1.";
char[] str=string.toCharArray();
test("test10", str, true);
}
void test11() {
String string =".2";
char[] str=string.toCharArray();
test("test11", str, true);
}
void test12() {
String string ="12e3";
char[] str=string.toCharArray();
test("test12", str, true);
}
public static void main(String[] args) {
R demo = new R();
demo.test1();
demo.test2();
demo.test3();
demo.test4();
demo.test5();
demo.test6();
demo.test7();
demo.test8();
demo.test9();
demo.test10();
demo.test11();
demo.test12();
}
test1: passed!
test2: passed!
test3: passed!
test4: passed!
test5: passed!
test6: passed!
test7: passed!
test8: passed!
test9: passed!
test10: passed!
test11: passed!
test12: passed!
Process finished with exit code 0