所以我使用atof将我的字符串转换为double。但是我需要知道输入是否错误(如y564等)。我怎么检查呢?我需要正确的号码才能进一步采取行动。
double x = atof(s.c_str());
答案 0 :(得分:5)
您可能想要使用std::stod:
bool parse_double(std::string in, double& res) {
try {
size_t read= 0;
res = std::stod(in, &read);
if (in.size() != read)
return false;
} catch (std::invalid_argument) {
return false;
}
return true;
}
int main()
{
double d;
bool b = parse_double("123z", d);
if (b)
std::cout << d;
else
std::cout << "Wrong input";
}
[编辑]
您可能会找到here:
返回值
对应成功的str内容的double值。如果转换后的值超出返回类型的范围,则返回值未定义。 如果无法执行转换,则返回0.0 。
因此无法确定输入是否错误或包含0
。
答案 1 :(得分:1)
使用std::stod
。它会抛出无效输入的异常。或者,如果您坚持使用C解决方案,请使用strtod
;它为您提供了有关结果的更多信息。
答案 2 :(得分:1)
atof(http://en.cppreference.com/w/cpp/string/byte/atof)的定义:
返回值
对应成功的str内容的double值。如果转换后的值超出返回类型的范围,则返回值未定义。如果无法执行转换,则返回0.0。
如果您使用现代c ++并且现在必须返回,请更好地使用std::strtod
(http://en.cppreference.com/w/cpp/string/byte/strtof):
double strtod( const char* str, char** str_end );
并定义其返回值:
返回值
与成功时str的内容对应的浮点值。如果转换后的值超出相应返回类型的范围,则会发生范围错误,并返回HUGE_VAL,HUGE_VALF或HUGE_VALL。如果不能执行转换,则返回0并将* str_end设置为str。
答案 3 :(得分:0)
拯救的正则表达式(即libpcre):
import oracle.jdbc.pool.OracleDataSource;
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;
PoolDataSource poolDataSource = PoolDataSourceFactory.getPoolDataSource();
poolDataSource.setConnectionFactoryClassName(OracleDataSource.class.getName());
poolDataSource.setURL("jdbc:oracle:thin:@localhost:1521:XE");
poolDataSource.setUser("SYSTEM");
poolDataSource.setPassword("****");
有关安装/编译的详细信息,请参阅// checked_atof.cpp
#include <iostream>
#include <cstdlib>
#include <pcrecpp.h>
const char FP_RE[] = "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?";
using namespace std;
int main()
{
std:string s;
double number;
pcrecpp::RE fpre(FP_RE);
cout << "Enter a floating point number: " << endl;
cin >> s;
if (!fpre.FullMatch(s)) {
cout << "Sorry, not a valid floating point number!" << endl;
} else {
number = atof(s.c_str());
cout << "Ok, result: " << number << endl;
}
return 0;
}
文档 - 以下内容可能适用于您的系统:
libpcre
g++ checked_atof.cpp $(pkg-config --cflags libpcrecpp) $(pkg-config --libs libpcrecpp) -o checked_atof
答案 4 :(得分:-1)
您只需检查字符串中的每个字符是否为'。'或std::isdigit(int ch)之前将其传递给atof(并且'。'必须是唯一的)
更简洁的解决方案是使用正则表达式(如^[0-9]+(\.[0-9]+)?$
)对您的字符串应该适用于通用浮点值。