自己实现 java中 Convert.toDouble(String str)处理函数

今天在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);
  }

 }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值