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

今天我尝试了一些C ++ 11 STL的新function,并遇到了std::to_string

可爱的,可爱的一套function。 创build一个stringstream对象只需要进行一次双string转换对我来说似乎有点过分,所以我很高兴我们现在可以做这样的事情:

 std::cout << std::to_string(0.33) << std::endl; 

结果?

 0.330000 

我不完全满足于此。 有没有办法告诉std::to_string省略尾部的零? 我search了互联网,但据我所见,该函数只有一个参数(要转换的值)。 回到过去,用stringstreams,你可以设置stream的宽度,但我宁愿不转换回来。

任何人遇到此问题之前/有一个解决scheme? 一些StackOverflowsearch没有任何结果。

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

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

返回:每个函数都会返回一个string对象,其中包含通过调用sprintf(buf,fmt,val)生成的参数值的字符表示forms,格式说明符为“%d”,“%u”,“%ld “,”%llu“,”%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); 

因此,您无法控制生成的string的格式。

如果你想要做的就是删除尾随零,那么很简单。

 std::string str = std::to_string (f); str.erase ( str.find_last_not_of('0') + 1, std::string::npos ); 

std::to_string不能控制格式; 您将得到与sprintf相同的结果,并带有相应的格式说明符(在本例中为"%f" )。

如果你需要更多的灵活性,那么你将需要一个更灵活的格式化程序 – 比如std::stringstream

std::to_string(double)由标准定义,以返回由sprintf(buf, "%f", value)生成的相同字符序列。 没有更多,不能less,特别是没有办法来调整格式说明符。 所以不,没有什么可以做的。

 double val std::wstringstream wss; wss << val; cout << wss.str().c_str(); 

忽略尾随零:

 std::ostringstream oss; oss << std::setprecision(8) << std::noshowpoint << double; std::string str = oss.str(); 

希望有所帮助。