我使用strtod()将字符串转换为十进制。因为我需要为错误的输入/无效字符抛出错误,我别无选择。 但问题是strtod()受区域设置的影响。所以'。'程序在不同的语言环境中运行时变为无效字符
如果我使用这样的解决方案:
std::istringstream text(iterator->second.c_str());
text.imbue(std::locale::classic());
double result;
text >> result;
根本无法检查无效输入。
哪种解决方案可以为我提供这两种解决方案?
答案 0 :(得分:0)
是的,您可以确定提供给stringstream的值是否已完全转换。您可以测试流以查看它是否到达文件末尾。如果有,那么你已经阅读了所有内容并将其转换为双倍。如果没有则输入无效。
这是一个展示转换的小样本:
bool convert(const std::string & text)
{
if (text = "")
return false;
std::istringstream iss(text);
iss.imbue(std::locale::classic());
double result;
iss >> result;
if (iss.eof())
return true;
else
return false;
}
int main()
{
std::cout << convert("123.456") << std::endl;
std::cout << convert("123.456abc") << std::endl;
std::cout << convert("123.456e5") << std::endl;
std::cout << convert("e5") << std::endl;
return 0;
}
输出:
1
0
1
0
答案 1 :(得分:0)
您可以通过测试text
错误并且到达输入结束来检查无效输入:
text >> result;
bool ok = text && text.eof();