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_string
는 N1803 (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:: 형식
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
'programing' 카테고리의 다른 글
CSS에서 스타일 비활성화 버튼 (0) | 2023.11.01 |
---|---|
MySQL, Grails 2 앱을 사용하지 않는 동안 풀링된 연결을 지속적으로 유지하는 올바른 방법(또는 풀링된 연결의 시간을 초과하고 새 연결을 얻는 방법) (0) | 2023.11.01 |
Oracle Sequence 값이 순서화되지 않았습니다. (0) | 2023.11.01 |
도커 컨테이너 실행과 시작의 차이점 (0) | 2023.11.01 |
XML-RPC와 SOAP의 차이점은 무엇입니까? (0) | 2023.11.01 |