如何检查字符串是否可以在C ++中转换为double?

时间:2013-10-13 19:08:15

标签: c++ string double

我有一个字符串,可以是一个数字(甚至是float或double类型,不仅仅是整数),它也可以是一个非数字的单词。

我想检查这个字符串是否可以转换为double,如果是,那么我想进行转换。如果是非数字字符串,我想要不同的行为。

我试过这个:

double tmp;
string str;
stringstream ss;

ss << str;
ss >> tmp;

if (ss.fail())
{
    // non-numeric string
}
else
{
    // string to double conversion is successful
}

此代码的问题是ss.fail()始终为true,即使tmp包含正确的值。

有一个名为atof()的函数将字符串转换为double,但这不适合我,因为如果输入字符串是非数字的,则返回0.0值。这样我就无法区分非数字和零输入值。

5 个答案:

答案 0 :(得分:5)

std :: stod怎么样?当它无法执行转换时,它将抛出std :: out_of_range。

try
{
    double value = std::stod(input_string);
    std::cout << "Converted string to a value of " << value << std::endl;
}
catch(std::exception& e)
{
    std::cout << "Could not convert string to double" << std::endl;
}

我没有尝试编译它,但你应该明白这个想法。

答案 1 :(得分:3)

如果输入字符串的类型来自std :: string(它适用于windows和unix系统),则可以使用此函数:

#include <stdlib.h>
#include <string>
/**
* @brief checkIsDouble - check inputString is double and if true return double result
* @param inputString - string for checking
* @param result - return double value
* @return true if string is double, false if not
*/
bool checkIsDouble(string inputString, double &result) {
    char* end;
    result = strtod(inputString.c_str(), &end);
    if (end == inputString.c_str() || *end != '\0') return false;
    return true;
}

答案 2 :(得分:0)

检查空白区域和流结束

if ((ss >> tmp) && (ss >> std::ws).eof() )
{
   // a double

}

提取double值,然后提取任何空格,如果在此期间遇到eof,则表示您只有一个有效的double

答案 3 :(得分:0)

什么是有效号码? atof()会解析什么,或者你有关于空格的规则吗?你是否允许科学记数法,领导 - ,领导+?可能还有其他数据跟着号码?必须有一个小数点或你接受整数?你接受一个小的前导小数点还是必须先加0?你接受00.1吗?你接受0.1FRED但拒绝0.1.2FRED吗?

函数strtod()是针对此问题而设计的。 atof()现在基本上已经过时了,因为它不够健壮,无法处理格式错误的输入。但是,strtod()不够灵活,无法接受格式良好的输入的特定规则。如果规则很简单,那么编写自己的ad-hoc匹配器 - 跳过白色空间,匹配数字,匹配小数点,匹配数字,跳过空白并不困难。如果你需要完全的灵活性,最终你必须求助于正则表达式,这是一种大锤的答案。

答案 4 :(得分:0)

如何减少cpp-ish解决方案:

double number;
string str;

if (sscanf(str.c_str(), "%lf", &number) != 1)
{
    // non-numeric string
}
else
{
    // string to double conversion is successful
}