나는 변환하려고 해요 std::string에 float/double. 나는 시도했다 :
std::string num = "0.6";
double temp = (double)atof(num.c_str());
그러나 항상 0을 반환합니다. 다른 방법은 없나요?
나는 변환하려고 해요 std::string에 float/double. 나는 시도했다 :
std::string num = "0.6";
double temp = (double)atof(num.c_str());
그러나 항상 0을 반환합니다. 다른 방법은 없나요?
답변:
std::string num = "0.6";
double temp = ::atof(num.c_str());
나를 위해, 문자열을 double로 변환하는 것은 유효한 C ++ 구문입니다.
stringstream 또는 boost :: lexical_cast를 사용하여 수행 할 수 있지만 성능이 저하됩니다.
Ahaha Qt 프로젝트가 있습니다 ...
QString winOpacity("0.6");
double temp = winOpacity.toDouble();
추가 참고 :
입력 데이터가 인 경우 const char*, QByteArray::toDouble빠른 것입니다.
표준 라이브러리 (C ++ 11)는 다음을 통해 원하는 기능을 제공합니다 std::stod.
std::string s = "0.6"
std::wstring ws = "0.7"
double d = std::stod(s);
double dw = std::stod(ws);
일반적으로 대부분의 다른 기본 유형은을 참조하십시오 <string>. C 문자열에도 몇 가지 새로운 기능이 있습니다. 보다<stdlib.h>
ostringstream그 자체로는 .. 혼자 사용하게 밖으로 입력 단순히 너무 긴
어휘 캐스트는 매우 좋습니다.
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <string>
using std::endl;
using std::cout;
using std::string;
using boost::lexical_cast;
int main() {
string str = "0.6";
double dub = lexical_cast<double>(str);
cout << dub << endl;
}
try { ... boost::lexical_cast ... } catch (std::exception const& err) { //handle excpetion }
catch ( boost::bad_lexical_cast const& err )하여 예외를 포착하십시오.
std :: stringstream을 사용할 수 있습니다.
#include <sstream>
#include <string>
template<typename T>
T StringToNumber(const std::string& numberAsString)
{
T valor;
std::stringstream stream(numberAsString);
stream >> valor;
if (stream.fail()) {
std::runtime_error e(numberAsString);
throw e;
}
return valor;
}
용법:
double number= StringToNumber<double>("0.6");
모든 부스트를 드래그하지 않으려면 strtod(3)from으로 이동 <cstdlib>하십시오. 이미 double을 반환합니다.
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
int main() {
std::string num = "0.6";
double temp = ::strtod(num.c_str(), 0);
cout << num << " " << temp << endl;
return 0;
}
출력 :
$ g++ -o s s.cc
$ ./s
0.6 0.6
$
atof ()가 작동하지 않는 이유 ... 어떤 플랫폼 / 컴파일러를 사용하고 있습니까?
이 답변은 귀하의 의견에 litb를 백업하고 있습니다. 나는 당신이 결과를 제대로 표시하지 않고 있다는 심오한 의혹을 가지고 있습니다.
나에게 똑같은 일이 한 번 일어났습니다. 나는 왜 내가 64 비트 int에 나쁜 값을 가져 오는지 알아 내려고 하루 종일 보냈지 만, printf가 두 번째 바이트를 무시하고 있다는 것을 발견했다. int처럼 64 비트 값을 printf에 전달할 수는 없습니다.
atof()원래 질문에서 작동하지 않는 이유 는 이중으로 캐스팅되었다는 사실이 나를 의심하게 만듭니다. 코드는없이 컴파일해서는 #include <stdlib.h>안되지만 컴파일 경고를 해결하기 위해 캐스트가 추가 된 경우 atof()올바르게 선언되지 않습니다. 컴파일러 atof()가 int를 반환 한다고 가정 하면 캐스팅하면 변환 경고가 해결되지만 반환 값이 double로 인식 되지 는 않습니다 .
#include <stdlib.h>
#include <string>
...
std::string num = "0.6";
double temp = atof(num.c_str());
경고없이 작동해야합니다.
어쨌든 string <-> 부동 소수점에 대해 Boost lexical_cast를 원하지 않습니다. 사용 사례의 하위 집합은 부스트가 이전 기능보다 지속적으로 더 나쁜 유일한 세트이며 기본적으로 자체 성능 결과가 이러한 변환에 sscanf 및 printf를 사용하는 것보다 20-25 배 느린 성능을 보여주기 때문에 기본적으로 모든 오류를 여기에 집중 시켰습니다.
직접 구글링하세요. boost :: lexical_cast는 50 개의 변환과 같은 것을 처리 할 수 있으며 부동 소수점 #s와 관련된 변환을 제외하면 명백한 대안만큼 좋거나 더 좋습니다 (모든 작업에 대해 단일 API를 갖는 추가 이점과 함께). 그러나 성능 측면에서 빙산을 치는 타이타닉과 같은 수레를 가져 오십시오.
오래된 전용 str-> double 함수는 모두 30ms (또는 그 이상)에 10000 개의 구문 분석을 수행 할 수 있습니다. lexical_cast는 동일한 작업을 수행하는 데 650ms 정도 걸립니다.
내 문제:
내 솔루션 (Windows 함수 _wcstod_l 사용) :
// string to convert. Note: decimal seperator is ',' here
std::wstring str = L"1,101";
// Use this for error detection
wchar_t* stopString;
// Create a locale for "C". Thus a '.' is expected as decimal separator
double dbl = _wcstod_l(str.c_str(), &stopString, _create_locale(LC_ALL, "C"));
if (wcslen(stopString) != 0)
{
// ... error handling ... we'll run into this because of the separator
}
HTH ...이 솔루션을 얻는 데 꽤 오래 걸렸습니다. 그리고 나는 여전히 문자열 현지화 등에 대해 충분히 알지 못한다는 느낌을받습니다.