private static double stringTOdouble(String str) {
/**
* noBeforeDot : 小数点前面的数值
* noAfterDot = : 小数点后面的数值
* noAfterE : 指数E后面的数值
* noGtZeroFlag :标识是否大于0
* eNoGtZeroFlag :标识e的指数是否大于0
* posBeforeDot :标识是否在小数点前面,此处用byte是后面要用来做累加计算,多个小数点时返回0.0
* posBeforeE :标识是否在E前面,此处用byte是后面要用来做累加计算,多个E时返回0.0
* 算法基本思想:用一个char型数组来保存string,然后逐个分析各个char,
* 首先:如果开始有正负符号的话,正负符号保留
* 然后分: 0-9之间的字符 用字符的ASII码-48得到对应的数字,然后根据两个标识位(小数点前/后,E前/后)来取得对应的数值。
* 如果是小数点的话:第一次出现正确标识,大于一次时,非合法数字串,返回0.0
* 如果是E/e: 第一个正确标识标示位。 ,大于一个是,返回0.0,
* 再次出现正负号,出现一次时候是E后面的指数,大于一个,返回0.0,
* 其他情况一律返回0.0
*/
double noBeforeDot = 0.0, noAfterDot = 0.0;
int noAfterE = 0;double index = 1.0;
boolean noGtZeroFlag = true;
boolean eNoGtZeroFlag = true;
byte posBeforeDot = 0;
byte posBeforeE = 0;
if (str == null) {
return 0.0;
}
int leng = str.length();
if (leng <= 0) {
return 0.0;
}
char temp[];
if (str.startsWith("+")) {
temp = str.substring(1).toCharArray();
leng--;
} else if (str.startsWith("-")) {
noGtZeroFlag = false;
temp = str.substring(1).toCharArray();
leng--;
} else {
temp = str.toCharArray();
}
;
for (int i = 0; i < leng; i++) {
if (temp[i] >= '0' && temp[i] <= '9') {
if (posBeforeE == 0) {
if (posBeforeDot == 0) {
noBeforeDot = noBeforeDot * 10.0 + (temp[i] - 48);
} else if (posBeforeDot == 1) {
index = index * 0.1;
noAfterDot = noAfterDot + (temp[i] - 48) * index;
}
} else if (posBeforeE == 1) {
noAfterE = noAfterE * 10 + (temp[i] - 48);
}
} else if (temp[i] == '.') {
posBeforeDot++;
if (posBeforeDot > 1) {
return 0.0;
}
} else if (temp[i] == 'e' || temp[i] == 'E') {
posBeforeE++;
if (posBeforeE > 1) {
return 0.0;
}
} else if (temp[i] == '+' || temp[i] == '-') {
if (posBeforeE == 1 && temp[i] == '-') {
eNoGtZeroFlag = false;
} else {
return 0.0;
}
} else {
return 0.0;
}
}// end for
if (eNoGtZeroFlag == false) {
noAfterE = noAfterE * (-1);
}
if (noGtZeroFlag == false) {
return (noBeforeDot + noAfterDot) * Math.pow(10, noAfterE * 1.0) * (-1.0);
} else {
return (noBeforeDot + noAfterDot) * Math.pow(10, noAfterE * 1.0);
}
}