今天我尝试了一些C ++ 11 STL的新功能并遇到了std::to_string
。
可爱,可爱的功能集。为一个双字符串转换创建一个stringstream对象对我来说似乎总是有点过头了,所以我很高兴我们现在可以这样做:
std::cout << std::to_string(0.33) << std::endl;
结果?
0.330000
我并不完全满足于此。有没有办法告诉std::to_string
遗漏尾随的零?我搜索了互联网,但据我所知,该函数只需要一个参数(要转换的值)。回到使用stringstreams的'过去',您可以设置流的宽度,但我宁愿不转换回来。
在解决之前有人遇到过这个问题吗?一些StackOverflow搜索没有产生任何结果。
(A C ++ 11 STL参考:http://en.cppreference.com/w/cpp/string/basic_string/to_string)
答案 0 :(得分:35)
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);
因此,您无法控制结果字符串的格式。
答案 1 :(得分:35)
如果您只想删除尾随零,那么这很容易。
std::string str = std::to_string (f);
str.erase ( str.find_last_not_of('0') + 1, std::string::npos );
答案 2 :(得分:13)
std::to_string
无法控制格式;您获得与sprintf
相同的结果,并为该类型指定适当的格式说明符(在本例中为"%f"
)。
如果您需要更多灵活性,则需要更灵活的格式化程序 - 例如std::stringstream
。
答案 3 :(得分:3)
std::to_string(double)
由标准定义,只返回由sprintf(buf, "%f", value)
生成的相同字符序列。不多也不少,特别是没有办法调整格式说明符。所以不,你无能为力。
答案 4 :(得分:1)
使用boost::to_string
也无法控制格式,但是它将输出更接近屏幕显示的内容。与std::lexical_cast<std::string>
相同。
对于具有格式控制功能的类操作,请使用str(boost::format("...format...")% 0.33)
。
答案 5 :(得分:0)
问题的各种解决方案,因为to_string
不起作用。
&#34;魔术配方&#34; - 我的CS2400老师
std::cout.setf(ios::fixed);
std::cout.setf(ios::showpoint);
std::cout.precision(2);
const double x = 0.33, y = 42.3748;
std::cout << "$" << x << std::endl;
std::cout << "$" << y << std::endl;
输出:
$0.33
$42.37
您使用十进制数做的任何后续输出都将被设置为。
您可以随时更改setf和精度。
答案 6 :(得分:0)
创建自定义转换功能,必要时删除拖尾零。
//! 2018.05.14 13:19:20 CST
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
//! Create a custom convert function, remove the tailing zeros if necessary.
template<typename T>
std::string tostring(const T &n) {
std::ostringstream oss;
oss << n;
string s = oss.str();
int dotpos = s.find_first_of('.');
if(dotpos!=std::string::npos){
int ipos = s.size()-1;
while(s[ipos]=='0' && ipos>dotpos){
--ipos;
}
s.erase ( ipos + 1, std::string::npos );
}
return s;
}
int main(){
std::cout<< tostring(1230)<<endl;
std::cout<< tostring(12.30)<<endl;
}
输入数字:
1230
12.30
使用-std=c++11
编译,然后结果:
1230
12.3
答案 7 :(得分:-1)
省略尾随零:
std::ostringstream oss;
oss << std::setprecision(8) << std::noshowpoint << double;
std::string str = oss.str();
希望有所帮助。
答案 8 :(得分:-2)
double val
std::wstringstream wss;
wss << val;
cout << wss.str().c_str();