UFO ET IT

C ++에서 float를 std :: string으로 변환

ufoet 2020. 11. 25. 21:42
반응형

C ++에서 float를 std :: string으로 변환


에 넣어야하는 부동 소수점 값이 있습니다 std::string. float에서 문자열로 어떻게 변환합니까?

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

성능에 대해 걱정하지 않는 한 문자열 스트림을 사용하십시오 .

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

Boost가 괜찮다면 lexical_cast <> 가 편리한 대안입니다.

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

효율적인 대안은 예를 들어 FastFormat 또는 단순히 C 스타일 기능입니다.


C ++ 11으로, 표준 C ++ 라이브러리 기능 제공 std::to_string(arg)을위한 다양한 유형을 지원 arg.


복식뿐만 아니라 다른 유형에서도 작동하는 템플릿을 정의 할 수 있습니다.

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

중요 :
끝에있는 메모를 읽으십시오.

빠른 대답 :
사용 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);

중요 참고 :
@Michael Koneč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같은에서 설명 @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 

You can use std::to_string in C++11

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

Use std::to_chars once your standard library provides it:

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
}

The advantages of this method are:

  • It is locale-independent, preventing bugs when writing data into formats such as JSON that require '.' as a decimal point
  • It provides shortest decimal representation with round trip guarantees
  • It is potentially more efficient than other standard methods because it doesn't use the locale and doesn't require allocation

Unfortunately std::to_string is of limited utility with floating point because it uses the fixed representation, rounding small values to zero and producing long strings for large values, e.g.

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

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

C++20 might get a more convenient std::format API with the same benefits as std::to_chars if the P0645 standards proposal gets approved.


If you're worried about performance, check out the Boost::lexical_cast library.


This tutorial gives a simple, yet elegant, solution, which i transcribe:

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

참고URL : https://stackoverflow.com/questions/2125880/convert-float-to-stdstring-in-c

반응형