我有一个字符串,可以是一个数字(甚至是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
值。这样我就无法区分非数字和零输入值。
答案 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
}