2011-10-11 150 views
2

我嘗試轉換double數爲std::string,轉換應打印或是與2小數位十進制格式或指數形式:轉換浮點數到一個格式化字符串

  1. 1 - > 1.00
  2. 0.1 - > 0.10
  3. 0.01 - > 0.01
  4. 0.015 - > 1.5E-2
  5. 10 - > 10.00
  6. 100 - > 100.00
  7. 15000 - > 1.5e4

我試圖用boost::format功能與%g類型,但同時也可以設置顯著的位數,這是不可能的設置小數點後的印刷位數:

  1. 1 - > 1
  2. 0.1 - > 0.1
  3. 0.01 - > 0.01
  4. 10 - > 10
  5. 100 - > 100

有沒有做這種轉換/格式化的更好的辦法?我最好使用標準庫或Boost。

回答

4

根據號碼的大小選擇scientificfixed

就是這麼簡單。

乾杯&心連心,

+1

這是iostream的輸出是正確的。結合'setprecision'來限制打印的數字。 – AJG85

+0

我想避免檢查數字的大小,仍然有一個漂亮的輸出。我將繼續使用boost :: format(它會輸出不錯的i18n格式的數字),並在設置格式化掩碼前檢查數字的大小。 –

0

我不知道如果這是你在找什麼,但... 您可以控制使用COUT與使用setprecision功能打印位數。

#include <iomanip> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    double d = 123123.23234234; 
    cout << setprecision(15) << d; 
    system("pause"); 
    return 0; 
} 
+0

這不會解決非常大或很小的數字,應該使用指數表示法來格式化數字。 –

+0

@Fábio取決於。 – Andrew

-1

平原舊的C的sprintf支持小數#像這樣: 「%0.3克」

您可以打開的char *輸出到的std :: string很輕鬆了。

+0

-1:是的,但sprintf在C++中輸入unsafe和unadvised。另外你必須先分配一些糟糕的字符緩衝區。呸。 –

+0

boost :: format與sprintf具有相同的功能。 「%.3g」標誌將允許我設置指數數字的有效數字,但不能使用小數點浮點數的小數位。 –

+0

咦......然後提高::格式沒有準確* *同樣的功能的sprintf,因爲sprintf的%0.3克總是會產生完全相同三位小數點的右側。 (門票:我幾乎沒有使用提升。) – ZeroDiv

0

sprintf();應該很容易幫助你將字符串/字符數組雙重打印。

+0

是不是這只是ZeroDiv的答案一樣http://stackoverflow.com/questions/7729162/conversion-of-float-numbers-to-a-formatted-string/7729285#7729285 ? – kennytm

+0

抱歉沒有看到。如果您建議,我可以刪除我的答案。 ! –

3

沒有增加需要,雖然應該有辦法做到這一點與boost::formatsprintf如果你想。

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::string numStr("3.14159265"); 
    double num(atof(numStr.c_str())); 
    std::cout 
     << std::setprecision(2) 
     << std::scientific << num 
     << std::fixed << num; 
    return 0; 
} 

編輯:誤讀,如果你想要去的doublestd::string我會使用一個std::ostringstream支持同一個iostream操縱和插入運營商的問題。然後,您可以撥打str()以獲取一個字符串。

1

您可以使用ostringstream,像這樣

#include <sstream> 
#include <string> 

std::string FloatToString(float fNumber) 
{ 
    std::ostringstream os; 

    os << fNumber; 

    return os.str(); 
} 
+0

只需交換雙倍浮動 – james82345