C++ 11 std :: to_string(double) - 没有尾随零

Sti*_*ert 56 c++ stl c++11

今天我尝试了一些C++ 11 STL的新功能并遇到过std::to_string.

可爱,可爱的功能集.为一个双字符串到字符串的转换创建一个stringstream对象对我来说似乎太过分了,所以我很高兴我们现在能做到这样的事情:

std::cout << std::to_string(0.33) << std::endl;
Run Code Online (Sandbox Code Playgroud)

结果?

0.330000
Run Code Online (Sandbox Code Playgroud)

我并不完全满足于此.有没有办法告诉你std::to_string留下尾随的零?我搜索了互联网,但据我所知,该函数只需要一个参数(要转换的值).回到使用stringstreams的'过去',您可以设置流的宽度,但我宁愿不转换回来.

任何人在解决之前遇到过这个问题?一些StackOverflow搜索没有产生任何结果.

(C++ 11 STL参考:http://en.cppreference.com/w/cpp/string/basic_string/to_string)

Mar*_*low 40

如果您只想删除尾随零,那么这很容易.

std::string str = std::to_string (f);
str.erase ( str.find_last_not_of('0') + 1, std::string::npos );
Run Code Online (Sandbox Code Playgroud)

  • 几乎完美的工作,除了浮点/双精度是整数的角落情况.结果是例如'440.',而有些人可能更喜欢'440.0`,如果他们仍然需要漂亮的输出.但是,对最后一个角色的简单检查无法解决. (9认同)
  • 正确,这就是我调整Marshalls代码的原因:`namespace util {template <typename T> std :: string to_string(const T&t){std :: string str {std :: to_string(t)}; int offset {1}; if(str.find_last_not_of('0')== str.find('.')){offset = 0; } str.erase(str.find_last_not_of('0')+ offset,std :: string :: npos); 返回str; 这也删除了一个不必要的点. (5认同)
  • 用`.`重复最后一次擦除足以删除尾随周期`str.erase(str.find_last_not_of('0')+ 1,std :: string :: npos);`str.erase(str.find_last_not_of(( '。')+ 1,std :: string :: npos);` (2认同)

rub*_*nvb 38

C++ 11标准明确地说(21.5/7):

返回:每个函数返回一个字符串对象,其中包含其参数值的字符表示形式,该字符表示形式将通过调用sprintf(buf,fmt,val)生成,格式说明符为"%d","%u","%ld" ","%lu","%lld","%llu","%f","%f"或"%Lf",其中buf指定足够大小的内部字符缓冲区

对于按此顺序声明的函数:

string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
Run Code Online (Sandbox Code Playgroud)

因此,您无法控制结果字符串的格式.


Mik*_*our 16

std::to_string让你无法控制格式; 您得到sprintf与该类型的适当格式说明符相同的结果("%f"在本例中).

如果您需要更多灵活性,那么您将需要一个更灵活的格式化程序 - 例如std::stringstream.


小智 10

去掉尾随零:

std::ostringstream oss;
oss << std::setprecision(8) << std::noshowpoint << double_value;
std::string str = oss.str();
Run Code Online (Sandbox Code Playgroud)

注意:#include <sstream>#include <iomanip>

  • 我不明白为什么这个答案不是顶级的!谢谢伊万 (2认同)
  • @Guillaume.P 可能,因为它不通用。例如,如果使用std::fixed,showpoint没有预期的效果 (2认同)

303*_*303 7

借助 C++20,我们终于可以拥抱 的力量了std::format!现在似乎所有主流编译器都支持它,从 Clang 17.0.1、GCC 13.1 和 MSVC 19.32 开始。

std::cout << std::format("{}\n", 0.33);
Run Code Online (Sandbox Code Playgroud)

演示