programing

C++에서 더블을 문자열로 변환하려면 어떻게 해야 합니까?

css3 2023. 11. 1. 22:30

C++에서 더블을 문자열로 변환하려면 어떻게 해야 합니까?

더블을 끈으로 보관해야 합니다.제가 사용할 수 있다는 것을 압니다.printf표시하고 싶었지만 나중에 (가 아닌 으로) 맵에 저장할 수 있도록 문자열 변수에 저장하고 싶습니다.

// The C way:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);

// The C++03 way:
std::ostringstream sstream;
sstream << myDoubleVar;
std::string varAsString = sstream.str();

// The C++11 way:
std::string varAsString = std::to_string(myDoubleVar);

// The boost way:
std::string varAsString = boost::lexical_cast<std::string>(myDoubleVar);

부스트(tm) 방식:

std::string str = boost::lexical_cast<std::string>(dbl);

Standard C++ 방식:

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

참고: 잊지 마십시오.#include <sstream>

Standard C++11 방식(출력 형식에 상관없는 경우):

#include <string>

auto str = std::to_string(42.5); 

to_stringN1803 (r0), N1982 (r1) 및 N2408 (r2) "Simple Number Access"에 도입된 새로운 라이브러리 기능입니다.그 외에도 있습니다.stod역방향 동작을 수행하기 위한 기능.

다음과 다른 출력 형식을 사용하려면"%f", 사용.snprintf아니면ostringstream다른 답변에 예시된 방법.

C++11에서 std::to_string을 사용할 수 있습니다.

double d = 3.0;
std::string str = std::to_string(d);

C++를 사용하는 경우 피합니다.sprintf. 이것은 un-C++y이고 몇 가지 문제가 있습니다.문자열 스트림은 선택 방법이며, 바람직하게는 부스트에서와 같이 캡슐화됩니다.꽤 쉽게 할 수 있는 어휘 주조:

template <typename T>
std::string to_string(T const& value) {
    stringstream sstr;
    sstr << value;
    return sstr.str();
}

용도:

string s = to_string(42.5);

sprintf괜찮지만, C++에서는 더 좋고, 더 안전하며, 또한 변환을 하는 데 약간 더 느린 방법이 있습니다.stringstream:

#include <sstream>
#include <string>

// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();

부스트를 사용할 수도 있습니다.어휘 캐스팅:

#include <boost/lexical_cast.hpp>
#include <string>

// In some function:
double d = 453.23;
std::string str = boost::lexical_cast<string>(d);

두 경우 모두str그래야 한다"453.23"그 후에렉시컬 캐스트는 변신을 완벽하게 보장한다는 점에서 몇 가지 장점이 있습니다.사용합니다.stringstream내부적으로

C++ String Toolkit Libary를 보겠습니다.방금 다른 곳에도 비슷한 답변을 올렸습니다.저는 그것이 매우 빠르고 믿을 만하다는 것을 발견했습니다.

#include <strtk.hpp>

double pi = M_PI;
std::string pi_as_string  = strtk::type_to_string<double>( pi );

lexical_cast의 문제점은 정밀도를 정의할 수 없다는 것입니다.일반적으로 더블을 문자열로 변환하는 경우 인쇄를 원하기 때문입니다.정밀도가 너무 높거나 너무 작으면 출력에 영향을 미칩니다.

문자열 스트림을 사용할 수도 있습니다.

헤헤, 방금 쓴 글입니다. (이 질문과는 무관합니다.)

string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();

/* rest of the code */

일반적으로 이 작업을 수행하려면 C default ecvt, fcvt 또는 gcvt 함수를 사용해야 합니다.

/* gcvt example */
#include <stdio.h>
#include <stdlib.h>

main ()
{
  char buffer [20];
  gcvt (1365.249,6,buffer);
  puts (buffer);
  gcvt (1365.249,3,buffer);
  puts (buffer);
  return 0;
}

Output:
1365.25
1.37e+003   

As a Function:

void double_to_char(double f,char * buffer){
  gcvt(f,10,buffer);
}

SO에 대한 나의 이전 게시물을 읽고 싶을 수 있습니다. (임시 ostringstream 객체가 있는 Macro'ed version)

기록을 위해:제 코드로는 snprintf()를 선호합니다.로컬 스택에 있는 char 배열을 사용하면 그다지 효율적이지 않습니다. (아마도 배열 크기를 초과하여 루프를 두 번 수행했다면...)

(vsnprintf()를 통해서도 포장했습니다.하지만 종류를 확인하는 데 비용이 좀 듭니다.코드를 원한다면 Yelp...)

을 보다.sprintf()그리고 가족.

문자열은 단지 이중을 표현한 것일 뿐이며, 이를 다시 이중으로 변환하면 동일한 값이 발생하지 않을 수 있습니다.또한 기본 문자열 변환은 변환을 특정 정밀도로 잘라낼 수 있습니다.표준 C++ 방식으로 다음과 같이 정밀도를 제어할 수 있습니다.

#include <sstream>
#include <math.h>
#include <iostream>
#include <iomanip>

int main()
{
    std::ostringstream sout;
    sout << M_PI << '\n';
    sout << std::setprecision(99) << M_PI << '\n';
    sout << std::setprecision(3) << M_PI << '\n';
    sout << std::fixed; //now the setprecision() value will look at the decimal part only.
    sout << std::setprecision(3) << M_PI << '\n';
    std::cout << sout.str();
}

당신에게 결과물을 줄 겁니다

3.14159                                                                                                                                                                            
3.141592653589793115997963468544185161590576171875                                                                                                                                 
3.14                                                                                                                                                                               
3.142  

사용하다to_string().
예제:

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

좀 더 콤팩트한 스타일을 시도해 볼 수 있습니다.

std::string number_in_string;

double number_in_double;

std::ostringstream output;

number_in_string = (dynamic_cast< std::ostringstream*>(&(output << number_in_double <<

std::endl)))->str(); 

이 기능을 사용하여 모든 것을 어떤 것으로 변환할 수 있습니다.

template<class T = std::string, class U>
T to(U a) {
    std::stringstream ss;
    T ret;
    ss << a;
    ss >> ret;
    return ret;
};

용도:

std::string str = to(2.5);
double d = to<double>("2.5");

C++17이 도입되었습니다: std::to_chars, std:to_chars_result - cppreference.com

std::to_chars_result to_chars( char* first, char* last, float       value,
                               std::chars_format fmt, int precision );
std::to_chars_result to_chars( char* first, char* last, double      value,
                               std::chars_format fmt, int precision );
std::to_chars_result to_chars( char* first, char* last, long double value,
                               std::chars_format fmt, int precision );

이것은 어느 정도의 형식 제어를 통해 부동 소수점을 문자열로 변환할 수 있는 빠른 낮은 수준의 방법을 제공합니다.할당이 수행되지 않기 때문에 이는 빨라야 하며, 특정 시나리오에 대한 맞춤형 구현만 빨라야 합니다.

C++20은 사용하기 쉬운 높은 수준의 포맷 문자열(fmt 라이브러리와 동등)을 도입했습니다.

std:: 형식 - cppreference.com

std:: 형식

template< class... Args >
std::string format( /*format_string<Args...>*/ fmt, Args&&... args );

template< class... Args >
std::wstring format( /*wformat_string<Args...>*/ fmt, Args&&... args );

template< class... Args >
std::string format( const std::locale& loc,
                    /*format_string<Args...>*/ fmt, Args&&... args );

template< class... Args >
std::wstring format( const std::locale& loc,
                     /*wformat_string<Args...>*/ fmt, Args&&... args );

그것은 꽤 좋고 편리합니다.그럼 더 빨라야겠네요.sprintf.

언급URL : https://stackoverflow.com/questions/332111/how-do-i-convert-a-double-into-a-string-in-c