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

来源:互联网 发布:python multiply 矩阵 编辑:程序博客网 时间:2024/06/06 09:18

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