C ++에서 double을 문자열로 어떻게 변환합니까?


171

더블을 문자열로 저장해야합니다. printf표시하고 싶을 때 사용할 수 있다는 것을 알고 있지만 문자열 변수에 저장하여 나중에 맵 ( 키가 아닌 으로)에 저장할 수 있습니다 .


2
질문에 대답하는 질문 : 왜 이중 값을 문자열에 저장하여 맵에 저장합니까? 문자열로 된 double을 키로 사용 하시겠습니까? 그렇지 않다면 왜 더블을 그대로 두지 않겠습니까?
매트 맥 클레 런

1
흥미로운 점. 그러나 부동 소수점 값에 대한 정확한 비교는 항상 그렇듯이 double을 맵 키로 사용하면 위험에 처할 수 있습니다. 문자열 표현을 인덱싱하면 문제가 발생하지 않습니다.
Fred Larson

2
왜 그것을 전혀 변환하지 않습니까? 지도에 이중으로 저장하고, 전환을 피하십시오.
EvilTeach

3
그것은 여전히 ​​객체 호출처럼 들립니다. 노동 조합이 효과가있을 것입니다. 각 객체는 다양한 값을 삽입하고 자체 검증합니다.
EvilTeach

2
파일에 많은 이름 / 값 쌍만 있습니다. 객체를 요구하지 않습니다.
Bill the Lizard

답변:


183

부스트 (TM) 방법 :

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

표준 C ++ 방법 :

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

참고 : 잊지 마세요#include <sstream>


3
나는 boost :: lexical_cast가 표준 C ++ 방식이라고 생각합니다. BTW, litb, "boot : lexical_cast"라는 작은 오타가 있습니다.
Fred Larson

2
boost :: lexical_cast는 문자열 스트림 코드를 둘러싼 단순한 래퍼가 아닙니다. 많은 변환 루틴이 인라인으로 구현됩니다. 이 페이지 하단의 성능 측정 ( boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm )에 따르면 boost :: lexical_cast는 문자열 스트림을 사용하는 것보다 빠르며 대부분의 경우 scanf /보다 빠릅니다. printf
Ferruccio

1
@Ferr 누가 간단한 래퍼라고 했습니까? 덕분 링크를 제공하기 위해, 나는 실제로 않았다 그것이 생각 다소 간단한 래퍼 :
요하네스 SCHAUB - litb

27
#include <sstream>C ++ 방식을 잊지 마십시오 :)
VladL

3
문서화를 위해을하지 않으면 #include <sstream>"불완전한 유형은 허용되지 않습니다."라는 오류가 발생합니다.
Trevor Sullivan

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

1
귀하의 C ++ 방법 때문에 작동하지 않습니다 operator <<리턴한다 std::ostream&보다는 stringstream&.
Konrad Rudolph

내 문자열 스트림이 약간 녹슨 것 같습니다. 나는 ol 'C 방식을 선호합니다. 지금 수정했습니다.
Adam Rosenfield

당신의 C 코드는 처음에 나를 버렸습니다. 나는 여전히 당신에게 올바른 대안을 제공 한 것에 대해 찬성했습니다.
Bill the Lizard

2
C 길을 포함시키는 것에 대한 공감. 나에게 훨씬 더 깨끗한 것 같습니다.
Nealon

11
C ++ 11 방식으로 개선되었습니다. 나는 C ++을 처음 접했고 to_string함수 가 있다는 것을 몰랐다 . 저는 Microsoft Visual C ++ 2013을 사용하고 있습니다.
Trevor Sullivan

123

표준 C ++ 11 길 (당신이 출력 형식을 걱정하지 않는 경우) :

#include <string>

auto str = std::to_string(42.5); 

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

와 다른 출력 형식을 원하면 다른 답변에 설명 된대로 또는 메서드를 "%f"사용하십시오 .snprintfostringstream


3
그래, 자기야 to_string과 Visual Studio 11에서 두 가지 작업을 모두 수행했습니다.
BSalita

즉,을, 또는 내가 (매우 가능) 뭘하는지 모르는 : 오, 사랑하는 아기 ... to_string 2010으로 VisualStudio)에 작업에 표시되지 않습니다
chessofnerd

1
더 현대적이기 때문에 더 높아야합니다!
gsamaras

1
이 함수가 필요한 것보다 더 많은 소수를 추가하지 않도록하는 방법이 있습니까? double을 변환하면 8.0string을 제공 "8.000000"하지만 "8"완벽하게 괜찮습니다.
HelloGoodbye

1
이 작은 숫자하지 작업 ... 예를 수행합니다 1e-9생산을0.000000
user3728501

24

C ++를 사용하는 경우 피하십시오 sprintf. C ++ y가 아니며 몇 가지 문제가 있습니다. 문자열 스트림은 선택하는 방법이며, Boost.LexicalCast 에서처럼 캡슐화되는 것이 가장 쉬운 방법입니다.

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

용법:

string s = to_string(42.5);

24

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

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

내 숫자는 실제로 작았 std::to_string()으며 과학적 형식이 아닌 0.000000을 반환했습니다.
erfan

11

sprintf괜찮습니다. 그러나 C ++에서 변환을 수행하는 더 좋고 안전하며 약간 느린 방법은 다음과 stringstream같습니다.

#include <sstream>
#include <string>

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

Boost.LexicalCast를 사용할 수도 있습니다 .

#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". LexicalCast는 변형이 완료된다는 점에서 몇 가지 장점이 있습니다. stringstream내부적으로 s를 사용합니다 .


10

C ++ String Toolkit Libary를 살펴 보겠습니다 . 다른 곳에 비슷한 답변을 게시했습니다. 나는 그것이 매우 빠르고 안정적이라는 것을 알았습니다.

#include <strtk.hpp>

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


6

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



4

나는 방금 이것을 썼다 (이 질문과 관련이 없음).

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

/* rest of the code */

2

SO에 대한 나의 이전 게시물을 읽고 싶을 수도 있습니다. (임시 ostringstream 객체가있는 매크로 버전입니다.)

기록 : 내 자신의 코드에서 snprintf ()를 선호합니다. 로컬 스택에 char 배열을 사용하면 그렇게 비효율적이지 않습니다. (어쩌면 배열 크기를 초과하고 루프를 두 번 반복하면 ...)

(또한 vsnprintf ()를 통해 래핑했습니다. 그러나 유형 검사에 비용이 듭니다. 코드를 원하면 Yelp ...)


2

sprintf()가족을 살펴보십시오 .


2
인터넷 검색은 printf를 사용하여 double에서 문자열로 변환한다고 말하는 많은 기사를 만들었으므로 printf를 언급했습니다. 그들은 당신이 할 수있는 유일한 일은 인쇄이며 내 경우에는 거짓이라고 가정합니다.
Bill the Lizard 21

왜 -1 투표합니까? sprintf가 좋다고 생각합니다. @BilltheLizard, sprint는 화면이 아닌 문자 *에 무언가를 인쇄합니다. 누군가 c 메소드에 여전히 많은 투표권이 있다고 대답했습니다.
worldterminator

2

이 작업에서는 일반적으로 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   

기능으로서 :

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

0

더 컴팩트 한 스타일을 시도 할 수 있습니다.

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

0

사용하십시오 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);

0

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

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");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.