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

时间:2012-12-03 15:34:24

标签: c++ stl c++11

今天我尝试了一些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

9 个答案:

答案 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)

What's the difference between std::to_string, boost::to_string, and boost::lexical_cast<std::string>?

答案 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();