如何使用与错误报告无关的区域设置 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
您可以通过测试 text
是否有错误以及它是否已到达输入末尾来检查输入是否无效:
text >> result;
bool ok = text && text.eof();
我正在使用 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
您可以通过测试 text
是否有错误以及它是否已到达输入末尾来检查输入是否无效:
text >> result;
bool ok = text && text.eof();