如何使用与错误报告无关的区域设置 strtod

how to use locale independent strtod with error reporting

我正在使用 strtod() 将字符串转换为十进制。因为我需要为不正确的 input/invalid 字符抛出错误,所以我别无选择。 然而,问题是 strtod() 受语言环境影响。所以一个'.'当程序 运行 在不同的语言环境

时变成无效字符

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

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

根本无法检查无效输入。

哪个解决方案可以同时提供我?

是的,您可以确定提供给字符串流的值是否已完全转换。您可以测试流以查看它是否到达文件末尾。如果有,那么您已经阅读了所有内容并将其转换为双精度数。如果不是,则输入无效。

这里有一个演示转换的小示例:

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

您可以通过测试 text 是否有错误以及它是否已到达输入末尾来检查输入是否无效:

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

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