在C ++中将float转换为std :: string

时间:2010-01-24 03:59:56

标签: c++ type-conversion

我有一个需要放入std::string的浮点值。如何从float转换为字符串?

float val = 2.5;
std::string my_val = val; // error here

8 个答案:

答案 0 :(得分:108)

从C ++ 11开始,标准C ++库为arg提供了各种支持类型的函数std::to_string(arg)

答案 1 :(得分:53)

除非您担心效果,否则请使用string streams

std::ostringstream ss;
ss << myFloat;
std::string s(ss.str());

如果你对Boost感到满意,lexical_cast<>是一个方便的选择:

std::string s = boost::lexical_cast<std::string>(myFloat);

有效的替代品例如是FastFormat或仅仅是C风格的函数。

答案 2 :(得分:15)

您可以定义一个模板,该模板不仅可以用于双打,还可以用于其他类型。

template <typename T> string tostr(const T& t) { 
   ostringstream os; 
   os<<t; 
   return os.str(); 
} 

然后你可以将它用于其他类型。

double x = 14.4;
int y = 21;

string sx = tostr(x);
string sy = tostr(y);

答案 3 :(得分:14)

重要
请阅读最后的说明。

快速回答:
使用to_string()。 (自c ++ 11起可用)
例如:

#include <iostream>   
#include <string>  

using namespace std;
int main ()
{
    string pi = "pi is " + to_string(3.1415926);
    cout<< "pi = "<< pi << endl;

  return 0;
}

自己动手:http://ideone.com/7ejfaU
这些也可用:

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);

重要提示:
正如@MichaelKonečný正确地指出的那样,使用to_string()充其量是冒险的,这很可能会导致意想不到的结果。
来自http://en.cppreference.com/w/cpp/string/basic_string/to_string

  

浮点类型std::to_string可能产生意外结果,因为返回字符串中的有效位数可以为零,请参阅示例。
  默认情况下,返回值可能与std::cout打印的显着不同,请参阅示例。       std::to_string依赖于当前的语言环境以进行格式化,因此可以从std::to_string进行并发调用   多个线程可能导致部分序列化调用。 C++17   提供std::to_chars作为更高性能的区域设置独立   替代品。

最好的方法是使用stringstream作为his answer中演示的其他内容,例如@dcp。:

以下示例演示了此问题:
自己运行示例: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;
}

输出:

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 

答案 4 :(得分:4)

您可以在C ++ 11中使用std::to_string

float val = 2.5;
std::string my_val = std::to_string(val);

答案 5 :(得分:2)

一旦标准库提供了std::to_chars,就可以使用它:

std::array<char, 32> buf;
auto result = std::to_chars(buf.data(), buf.data() + buf.size(), val);
if (result.ec == std::errc()) {
  auto str = std::string(buf.data(), result.ptr - buf.data());
  // use the string
} else {
  // handle the error
}

此方法的优点是:

  • 它是与语言环境无关的,可防止在将数据写入要求“。”的JSON等格式时出错。作为小数点
  • 它提供了最短的十进制表示形式并带有往返保证
  • 由于它不使用语言环境且不需要分配,因此它可能比其他标准方法更有效

不幸的是,std::to_string具有浮点功能,因为它使用固定表示形式,将较小的值四舍五入为零,并为较大的值生成长字符串,例如

auto s1 = std::to_string(1e+40);
// s1 == 10000000000000000303786028427003666890752.000000

auto s2 = std::to_string(1e-40);
// s2 == 0.000000

如果P0645标准提案获得批准,C ++ 20可能会获得更方便的std::format API,并且具有与std::to_chars相同的优势。

答案 6 :(得分:1)

如果您担心性能问题,请查看Boost::lexical_cast库。

答案 7 :(得分:0)

This tutorial提供了一个简单而优雅的解决方案,我将其转录:

#include <sstream>
#include <string>
#include <stdexcept>

class BadConversion : public std::runtime_error {
public:
  BadConversion(std::string const& s)
    : std::runtime_error(s)
    { }
};

inline std::string stringify(double x)
{
  std::ostringstream o;
  if (!(o << x))
    throw BadConversion("stringify(double)");
  return o.str();
}
...
std::string my_val = stringify(val);