dtostr,一個double to string,好糾結。

看看本身剛入門時寫的東西!竟然還用了一年!!要留下來,證實本身的成長。ui

char * tr_dtostr(double value, int declen)rem

{     char * pstring = NULL;     int64_t intval = 0;     uint16_t effenum = 0;     uint16_t renum = 0;     uint32_t i = 0;     int64_t longnum = 0;     uint64_t plongnum = 0;     int64_t anum = 0;     int64_t bnum = 0;     //有效位長度若是<0 或 >19位則等於19位     if (declen <= 0 || declen > 19)     {         declen = 19;     }     pstring = (char *) malloc(21);     memset(pstring, 0, 21);     intval = (int64_t) value;//獲取整數值     if (value < 0.0)//肯定負值     {         if (intval == 0)//肯定整數位爲0         {             char chnum[21] = {             0             };             sprintf(pstring, "%s", "-");             sprintf(chnum, "%lld", intval);             strcat(pstring, chnum);             strcat(pstring, ".");//存入「-0.」         }         else//整數位不爲0存入「負數.」         {             sprintf(pstring, "%lld", intval);             strcat(pstring, ".");         }         if (intval != 0)//若是         {             renum = strlen(pstring) - 2;         }         else         {             renum = strlen(pstring) - 3;         }         effenum = 15 - renum;     }     else     {         sprintf(pstring, "%lld", intval);         strcat(pstring, ".");         if (intval != 0)         {             renum = strlen(pstring) - 1;         }         else         {             renum = strlen(pstring) - 2;         }         effenum = 15 - renum;     }     if (intval == 0)     {         anum = (value) * pow(10,effenum);         bnum = intval * pow(10,effenum);         longnum = anum - bnum;         plongnum = labs(longnum);         if (value > 0.0)         {             anum = (value + 1) * pow(10,effenum);         }         else if (value < 0.0)         {             anum = (value - 1) * pow(10,effenum);         }         else if (value == 0)         {             sprintf(pstring, "%s", "0");             return pstring;         }     }     else     {         anum = value * pow(10,effenum);         bnum = intval * pow(10,effenum);         longnum = anum - bnum;         plongnum = labs(longnum);     }     if (plongnum == 0)     {         //小數部位全爲0         pstring[strlen(pstring)-1] = 0;         return pstring;     }     else     {         char chnum[20] = {         0         };         uint8_t sursavelen = 0;//剩餘應該保存個數         int invallen = 0;//小數部位轉爲整數後的大小         int vallen = 0; //小數部位非零數的個數(包括非零數中間0的個數)         int tailzerolen = 0;//小數部位轉爲整數後尾部補的0的個數         int index = 0;         uint32_t frontzeronum = 0;//小數部位緊跟在小數點後有效0的個數         sursavelen = declen; // 剩餘應保存個數初始值爲需保留小數個數         for (index = 0;; index++)         {             uint64_t div = 0;             uint64_t rem = 0;             uint64_t squ = 0;             squ = pow(10, index + 1);             div = plongnum / squ;             rem = plongnum % squ;             if (rem == 0)//餘數爲0,尾零個數+1             {                 tailzerolen++;             }                         if (div >= 1)//除數>= 1, 整數個數+1             {                 invallen++;             }             else             {                 invallen += 1;//加上第一位                 break;             }         }         vallen = invallen - tailzerolen;         //計算小數部位緊跟在小數點後有幾個0         for (index = 0;; index++)         {             uint64_t temnum;             uint64_t div;             uint64_t squ = pow(10, invallen + index);             temnum = labs(anum) % squ;             div = labs(anum) / squ;             if (temnum == plongnum && div == intval)             {                 break;             }             else if (temnum == plongnum)             {                 frontzeronum++;             }             else             {                 frontzeronum--;                 break;             }         }         //將緊跟在小數點後的前0寫入字符串         for (i = 0; i < frontzeronum; i++)         {             strcat(pstring, "0");             if (sursavelen > 0)             {                 sursavelen--;//剩餘應保留個數-1             }         }         if (sursavelen > vallen)         {             sursavelen = vallen;         }                 if (sursavelen == 0)         {             uint8_t len = strlen(pstring);             if (intval == 0)             {                 for (i = 0; i < len; i++)                 {                     pstring[len - i - 1] = 0;                 }                 pstring[0] = '0';             }             else             {                 for (i = 0; i < frontzeronum + 1; i++)                 {                     pstring[len - 1 - i] = 0;                 }             }         }         else         {             sprintf(chnum, "%lld", plongnum);//將小數點後數轉換爲字符串             strncat(pstring, chnum, sursavelen);         }             }     return pstring; }
相關文章
相關標籤/搜索