String 转化成double(不用Double.parseDouble(str))

本文介绍了一种将字符串转换为双精度浮点数的方法。该方法通过解析字符串中的数字、小数点及指数部分,支持科学计数法,并能够处理包括正负号在内的多种情况。同时,对于非法输入,如多余的符号或不正确的格式,该方法会返回0.0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   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);
       }
 
    }
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值