如何使用与语言环境无关的strtod并报告错误

时间:2015-08-06 16:34:19

标签: c++ oop std

我使用strtod()将字符串转换为十进制。因为我需要为错误的输入/无效字符抛出错误,我别无选择。  但问题是strtod()受区域设置的影响。所以'。'程序在不同的语言环境中运行时变为无效字符

如果我使用这样的解决方案:

std::istringstream text(iterator->second.c_str());
text.imbue(std::locale::classic());
double result;
text >> result;

根本无法检查无效输入。

哪种解决方案可以为我提供这两种解决方案?

2 个答案:

答案 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

Live Example

答案 1 :(得分:0)

您可以通过测试text错误并且到达输入结束来检查无效输入:

text >> result;
bool ok = text && text.eof();

示例:http://coliru.stacked-crooked.com/a/758b769f26567d1e