今天我尝试了一些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)
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>
借助 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)
| 归档时间: |
|
| 查看次数: |
36194 次 |
| 最近记录: |