Convert float to std::string in C++

前端 未结 8 1956
后悔当初
后悔当初 2020-11-29 02:23

I have a float value that needs to be put into a std::string. How do I convert from float to string?

float val = 2.5;
std::string my_val = val;          


        
相关标签:
8条回答
  • 2020-11-29 03:26

    As of C++11, the standard C++ library provides the function std::to_string(arg) with various supported types for arg.

    0 讨论(0)
  • 2020-11-29 03:26

    Important:
    Read the note at the end.

    Quick answer :
    Use to_string(). (available since c++11)
    example :

    #include <iostream>   
    #include <string>  
    
    using namespace std;
    int main ()
    {
        string pi = "pi is " + to_string(3.1415926);
        cout<< "pi = "<< pi << endl;
    
      return 0;
    }
    

    run it yourself : http://ideone.com/7ejfaU
    These are available as well :

    string to_string (int val);
    string to_string (long val);
    string to_string (long long val);
    string to_string (unsigned val);
    string to_string (unsigned 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);
    

    Important Note:
    As @Michael Konečný rightfully pointed out, using to_string() is risky at best that is its very likely to cause unexpected results.
    From http://en.cppreference.com/w/cpp/string/basic_string/to_string :

    With floating point types std::to_string may yield unexpected results as the number of significant digits in the returned string can be zero, see the example.
    The return value may differ significantly from what std::cout prints by default, see the example. std::to_string relies on the current locale for formatting purposes, and therefore concurrent calls to std::to_string from multiple threads may result in partial serialization of calls. C++17 provides std::to_chars as a higher-performance locale-independent alternative.

    The best way would be to use stringstream as others such as @dcp demonstrated in his answer.:

    This issue is demonstrated in the following example :
    run the example yourself : https://www.jdoodle.com/embed/v0/T4k

    #include <iostream>
    #include <sstream>
    #include <string>
    
    template < typename Type > std::string to_str (const Type & t)
    {
      std::ostringstream os;
      os << t;
      return os.str ();
    }
    
    int main ()
    {
    
      // more info : https://en.cppreference.com/w/cpp/string/basic_string/to_string
      double    f = 23.43;
      double    f2 = 1e-9;
      double    f3 = 1e40;
      double    f4 = 1e-40;
      double    f5 = 123456789;
      std::string f_str = std::to_string (f);
      std::string f_str2 = std::to_string (f2); // Note: returns "0.000000"
      std::string f_str3 = std::to_string (f3); // Note: Does not return "1e+40".
      std::string f_str4 = std::to_string (f4); // Note: returns "0.000000"
      std::string f_str5 = std::to_string (f5);
    
      std::cout << "std::cout: " << f << '\n'
        << "to_string: " << f_str << '\n'
        << "ostringstream: " << to_str (f) << "\n\n"
        << "std::cout: " << f2 << '\n'
        << "to_string: " << f_str2 << '\n'
        << "ostringstream: " << to_str (f2) << "\n\n"
        << "std::cout: " << f3 << '\n'
        << "to_string: " << f_str3 << '\n'
        << "ostringstream: " << to_str (f3) << "\n\n"
        << "std::cout: " << f4 << '\n'
        << "to_string: " << f_str4 << '\n'
        << "ostringstream: " << to_str (f4) << "\n\n"
        << "std::cout: " << f5 << '\n'
        << "to_string: " << f_str5 << '\n'
        << "ostringstream: " << to_str (f5) << '\n';
    
      return 0;
    }
    

    output :

    std::cout: 23.43
    to_string: 23.430000
    ostringstream: 23.43
    
    std::cout: 1e-09
    to_string: 0.000000
    ostringstream: 1e-09
    
    std::cout: 1e+40
    to_string: 10000000000000000303786028427003666890752.000000
    ostringstream: 1e+40
    
    std::cout: 1e-40
    to_string: 0.000000
    ostringstream: 1e-40
    
    std::cout: 1.23457e+08
    to_string: 123456789.000000
    ostringstream: 1.23457e+08 
    
    0 讨论(0)
提交回复
热议问题