double型轉換成string型


double型轉換成string型

題目描寫敘述:
如有一個函數。其可接受一個long double參數,並將參數轉換為字符串。結果字符串應保留兩位小數,比如,浮點值123.45678應該生成“123.45”這種字符串。表面上看來 這是一個意義不大的編程問題,然而。假設真要在實際中派上用場。函數應設計為具有一定彈性,以同意調用者指定小數位數。另外,函數也應該可以處理各種異常 情況,如像123.0或123這種整數。
轉換函數接口:string do_fraction(long double value, int decplaces = 3)
題目分析:
經驗之談:①不管何時須要格式化一個數值。都應該先轉換為一個字符串,這樣可保證每位數剛好占領一個字符。②須要轉化為字符串時候,能夠考慮使用庫函數
使用庫函數將long double值轉化為一個string應該非常easy,可是須要注意以下幾個問題:
1)精度問題
由於stringstream對象默認精度為6。(這里須要強調一個精度,老式指的是小數位數,新式應該指的是所有位數),這就會有出現一個問題:假設很大的數,比如123456789.9,它就會轉化為科學計數法,這顯然不是我們須要的,所以我們使用庫函數和轉換之前,必須先把默認的精度設為最大
2)小數點位置問題
定位小數位使用string::find
在STL算法中使用一個常量來代表“數值未找到”,字符串中是string::npos
由於我們設定了小數點最大位數decplacea。所以我們要檢查小數點位數。假設小於它。那么直接返回字符串。否則小數部分多余的要被截去。

截斷字符串的方法:通常使用\0
插入變量\0之后,怎樣截去后面的字符。一般採用自交換
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
參考代碼:

string do_fraction(long double value, int decplaces = 3)
{
    ostringstream out;
    int prec = numeric_limits::digits10; //18 注意須要加上頭文件#include<limits>
    out.precision(prec); //覆蓋默認精度

    //從流中取出字符串
    string str = out.str();

    //推斷是否有小數點。且還有decpalces位
    size_t n = str.find(DECIMAL_POINT);
    if((n != string::npos) && (str.size() > n + decplaces)) 
    {
        str[n + decplaces] = '\0'; //覆蓋第一個多余的數字
    }
    str.swap(string(str.c_str())); //刪除NULL之后多余的字符
    return str;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM