더블을 문자열로 저장해야합니다. printf
표시하고 싶을 때 사용할 수 있다는 것을 알고 있지만 문자열 변수에 저장하여 나중에 맵 ( 키가 아닌 값 으로)에 저장할 수 있습니다 .
더블을 문자열로 저장해야합니다. printf
표시하고 싶을 때 사용할 수 있다는 것을 알고 있지만 문자열 변수에 저장하여 나중에 맵 ( 키가 아닌 값 으로)에 저장할 수 있습니다 .
답변:
부스트 (TM) 방법 :
std::string str = boost::lexical_cast<std::string>(dbl);
표준 C ++ 방법 :
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
참고 : 잊지 마세요#include <sstream>
#include <sstream>
C ++ 방식을 잊지 마십시오 :)
#include <sstream>
"불완전한 유형은 허용되지 않습니다."라는 오류가 발생합니다.
// 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);
operator <<
리턴한다 std::ostream&
보다는 stringstream&
.
to_string
함수 가 있다는 것을 몰랐다 . 저는 Microsoft Visual C ++ 2013을 사용하고 있습니다.
표준 C ++ 11 길 (당신이 출력 형식을 걱정하지 않는 경우) :
#include <string>
auto str = std::to_string(42.5);
to_string
N1803 (r0), N1982 (r1) 및 N2408 (r2) " Simple Numeric Access "에 도입 된 새로운 라이브러리 기능 입니다. stod
역 동작을 수행 하는 기능 도 있습니다.
와 다른 출력 형식을 원하면 다른 답변에 설명 된대로 또는 메서드를 "%f"
사용하십시오 .snprintf
ostringstream
8.0
string을 제공 "8.000000"
하지만 "8"
완벽하게 괜찮습니다.
1e-9
생산을0.000000
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);
C ++ 11에서 std :: to_string 을 사용할 수 있습니다
double d = 3.0;
std::string str = std::to_string(d);
std::to_string()
으며 과학적 형식이 아닌 0.000000을 반환했습니다.
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를 사용합니다 .
C ++ String Toolkit Libary를 살펴 보겠습니다 . 다른 곳에 비슷한 답변을 게시했습니다. 나는 그것이 매우 빠르고 안정적이라는 것을 알았습니다.
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
lexical_cast의 문제점은 정밀도를 정의 할 수 없다는 것입니다. 일반적으로 double을 문자열로 변환하는 경우 인쇄하려는 것이기 때문입니다. 정밀도가 너무 많거나 너무 낮 으면 출력에 영향을 미칩니다.
stringstream 을 사용할 수도 있습니다 .
나는 방금 이것을 썼다 (이 질문과 관련이 없음).
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
SO에 대한 나의 이전 게시물을 읽고 싶을 수도 있습니다. (임시 ostringstream 객체가있는 매크로 버전입니다.)
기록 : 내 자신의 코드에서 snprintf ()를 선호합니다. 로컬 스택에 char 배열을 사용하면 그렇게 비효율적이지 않습니다. (어쩌면 배열 크기를 초과하고 루프를 두 번 반복하면 ...)
(또한 vsnprintf ()를 통해 래핑했습니다. 그러나 유형 검사에 비용이 듭니다. 코드를 원하면 Yelp ...)
sprintf()
가족을 살펴보십시오 .
이 작업에서는 일반적으로 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);
}
더 컴팩트 한 스타일을 시도 할 수 있습니다.
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();
사용하십시오 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);