2011-10-11 78 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