今天在superWaba上看到Convert.toDouble(String str),由于底层问题比较大的数就出错,现在自己写了一个 程序中info()是我加的打印,可以去掉
java中 Convert.toDouble(String str)处理函数
/**由于底层对该函数支持不好,自己写了一个 added by shixianjun
* 对于比较大的数 也没有问题 可以对科学计数法形式的数进行处理
* @param str
* @return 无效串返回0.0
*/
private double stringTOdouble(String str) {
info("into stringTOdouble==str=="+str);
//re小数点之前的数,re1小数点之后的数,re2 E之后的数
double re=0.0,re1=0.0;
int re2=0;
double index=1.0;
boolean flag=true;//正负标志 true 正 false负
boolean eflag=true;//e之后的指数正负 true正 false 负
if(str==null) {
info("out stringTOdouble==re=str==null="+0);
return 0.0;
}
byte point=0;//在小数点之前0,之后1
byte ebefore=0;//在E之前0,之后1
int leng=str.length();
if(leng<=0) {
info("out stringTOdouble==re=leng<0="+0);
return 0.0;
}
char temp[];//串临时保存在temp数组
//判断是整数还是负数,对flag进行赋值,并去掉(+ -)符号
if(str.startsWith("+")) {
temp=str.substring(1).toCharArray();
leng--;
}else if(str.startsWith("-")) {
flag=false;
temp=str.substring(1).toCharArray();
leng--;
}else{
temp=str.toCharArray();
};
/**检查每位数把小数点之前的保存在re中,小数点之后的
* 的保存在re1中,e之后的保存在re2中
*/
for(int i=0;i<leng;i++) {
if(temp[i]>='0' && temp[i]<='9') {
if(ebefore==0) {
if(point==0) {
re=re*10.0+(temp[i]-48);
}else if(point==1) {
index=index*0.1;
re1=re1+(temp[i]-48)*index;
}
}else if(ebefore==1) {
re2=re2*10+(temp[i]-48);
}
}else if(temp[i]=='.') {
point++;
if(point>1) {//两个点为无效
info("out stringTOdouble==re=twopoint="+0);
return 0.0;
}
}else if(temp[i]=='e' ||temp[i]=='E') {
ebefore++;
if(ebefore>1) {//两个E为无效
info("out stringTOdouble==re=two e="+0);
return 0.0;
}
}else if(temp[i]=='+' || temp[i]=='-'){
if(ebefore==1 && temp[i]=='-') {
eflag=false;
}else {//E之前出现了 + -号
info("out stringTOdouble==re=plusbefor e="+0);
return 0.0;
}
}else {
info("out stringTOdouble==re=other char=temp[i]"+temp[i]);
return 0.0;
}
}//end for
if(eflag==false) {
re2=re2*(-1);
}
// info("out stringTOdouble==re=eee14="+Math.pow(10,-14));
if(flag==false) {
info("out stringTOdouble==re=="+(re+re1)+" "+Math.pow(10,re2*1.0)*(-1.0));
return (re+re1)*Math.pow(10,re2*1.0)*(-1.0);
}else {
info("out stringTOdouble==re=="+(re+re1)+" "+Math.pow(10,re2*1.0));
return (re+re1)*Math.pow(10,re2*1.0);
}
}