如何在C ++中将字符串转换为double?

时间:2008-12-25 17:17:21

标签: c++

如何在C ++中将字符串转换为double? 我想要一个函数,当字符串不是数字时返回0。

10 个答案:

答案 0 :(得分:38)

请参阅C ++ FAQ Lite How do I convert a std::string to a number?

请参阅C ++ Super-FAQ How do I convert a std::string to a number?

请注意,根据您的要求,您无法将所有允许的零字符串表示与非数字字符串区分开来。

 // the requested function
 #include <sstream>
 double string_to_double( const std::string& s )
 {
   std::istringstream i(s);
   double x;
   if (!(i >> x))
     return 0;
   return x;
 } 

 // some tests
 #include <cassert>
 int main( int, char** )
 {
    // simple case:
    assert( 0.5 == string_to_double( "0.5"    ) );

    // blank space:
    assert( 0.5 == string_to_double( "0.5 "   ) );
    assert( 0.5 == string_to_double( " 0.5"   ) );

    // trailing non digit characters:
    assert( 0.5 == string_to_double( "0.5a"   ) );

    // note that with your requirements you can't distinguish
    // all the the allowed string representation of zero from
    // the non numerical strings:
    assert( 0 == string_to_double( "0"       ) );
    assert( 0 == string_to_double( "0."      ) );
    assert( 0 == string_to_double( "0.0"     ) );
    assert( 0 == string_to_double( "0.00"    ) );
    assert( 0 == string_to_double( "0.0e0"   ) );
    assert( 0 == string_to_double( "0.0e-0"  ) );
    assert( 0 == string_to_double( "0.0e+0"  ) );
    assert( 0 == string_to_double( "+0"      ) );
    assert( 0 == string_to_double( "+0."     ) );
    assert( 0 == string_to_double( "+0.0"    ) );
    assert( 0 == string_to_double( "+0.00"   ) );
    assert( 0 == string_to_double( "+0.0e0"  ) );
    assert( 0 == string_to_double( "+0.0e-0" ) );
    assert( 0 == string_to_double( "+0.0e+0" ) );
    assert( 0 == string_to_double( "-0"      ) );
    assert( 0 == string_to_double( "-0."     ) );
    assert( 0 == string_to_double( "-0.0"    ) );
    assert( 0 == string_to_double( "-0.00"   ) );
    assert( 0 == string_to_double( "-0.0e0"  ) );
    assert( 0 == string_to_double( "-0.0e-0" ) );
    assert( 0 == string_to_double( "-0.0e+0" ) );
    assert( 0 == string_to_double( "foobar"  ) );
    return 0;
 }

答案 1 :(得分:35)

最简单的方法是使用boost::lexical_cast

double value;
try
{
    value = boost::lexical_cast<double>(my_string);
}
catch (boost::bad_lexical_cast const&)
{
    value = 0;
}

答案 2 :(得分:20)

atof和strtod做你想要的但是非常原谅。如果您不希望接受像“32asd”这样的字符串有效,则需要将strtod包装在如下函数中:

#include <stdlib.h>
double strict_str2double(char* str)
{
    char* endptr;
    double value = strtod(str, &endptr);
    if (*endptr) return 0;
    return value;
}

答案 3 :(得分:6)

如果它是一个c-string(以null为终结的char类型数组),你可以这样做:

#include <stdlib.h>
char str[] = "3.14159";
double num = atof(str);

如果它是C ++字符串,只需使用c_str()方法:

double num = atof( cppstr.c_str() );

atof()会将字符串转换为double,失败时返回0。该功能记录在此处:http://www.cplusplus.com/reference/clibrary/cstdlib/atof.html

答案 4 :(得分:5)

#include <iostream>
#include <string>
using namespace std;

int main()
{
    cout << stod("  99.999  ") << endl;
}

输出:99.999(这是双倍的,空格被自动剥离)

由于C ++ 11将字符串转换为浮点值(如double),因此可以使用函数:
stof - 将str转换为浮点数
stod - 将str转换为双倍 stold - 将str转换为long double

  

我想要一个在字符串不是数字时返回0的函数。

stod抛出异常时,您可以添加try catch语句。

答案 5 :(得分:3)

必须说我同意这个最优雅的解决方案是使用boost :: lexical_cast。然后,您可以捕获可能发生的bad_lexical_cast,并在失败时执行某些操作,而不是获得0.0 atof给出的内容。

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

int main()
{
    std::string str = "3.14";
    double strVal;
    try {
        strVal = boost::lexical_cast<double>(str);
    } catch(bad_lexical_cast&) {
        //Do your errormagic
    }
    return 0;
}

答案 6 :(得分:1)

这个问题最优雅的解决方案之一是使用boost :: lexical_cast作为@Evgeny Lazin提到的。

答案 7 :(得分:0)

我认为atof正是你想要的。此函数解析字符串并将其转换为double。如果字符串不以数字(非数字)开头,则返回0.0。

然而,它确实试图解析尽可能多的字符串。换句话说,字符串“3abc”将被解释为3.0。如果你想要一个在这些情况下将返回0.0的函数,你需要自己编写一个小包装器。

此外,此函数使用空终止字符数组的C样式字符串。如果您正在使用字符串对象,则在使用此函数之前需要将其转换为char *。

答案 8 :(得分:0)

没有一个函数会这样做,因为0是一个有效数字,你需要能够在字符串不是有效数字时捕获。

您需要先检查字符串(可能是正则表达式),看它是否只包含数字和数字标点符号。如果这是您的应用程序所需要的,则可以决定返回0,或者将其转换为double。

在查找 atof() strtod()后,我应该将我的陈述改为“不应该”,而不是“没有”......和合

答案 9 :(得分:0)

示例C程序在C中将字符串转换为双精度

#include <iostream>
#include <comutil.h>
#include <iomanip>

bool ParseNumberToDouble(const std::wstring& strInput, double & dResult)
{
    bool bSucceeded = false;
    dResult = 0;
    if (!strInput.empty() && dResult)
    {
        _variant_t varIn = strInput.c_str();
        if (SUCCEEDED(VariantChangeTypeEx(&varIn, &varIn, GetThreadLocale(), 0, VT_R8)))
        {
            dResult = varIn.dblVal;
            bSucceeded = true;
        }
    }
    return bSucceeded;
}

int main()
{
    std::wstring strInput = L"1000";
    double dResult = 0;

    ParseNumberToDouble(strInput, dResult);

    return 0;
}