我有浮点数char[]
。它是本地化字符串,DE
没有小数点分隔符。是否有任何标准方法可以将此类字符串转换为浮点数?我正在寻找更好的东西然后“替换,用.和使用”。PL
','
'.'
atoi
问问题
331 次
2 回答
3
正如@Omkant 建议的那样,strtod()
将为您做:
setlocale(LC_NUMERIC, "de_DE.UTF-8");
errno = 0;
val = strtod(myString, &endPtr);
if (errno)
{
// Handle error
}
if (*endPtr)
{
// This tells you that the string had a trail, e.g. "250.99USD"
}
您可以使用 NULL 代替 &endPtr,如果您确定永远不会尝试转换零,则可以使用val
零来检查错误而不是设置errno
:
// Faster, sloppier version
setlocale(LC_NUMERIC, "de_DE.UTF-8");
if (!(val = strtod(myString, NULL)))
{
// An error occurred, provided myString was not legitimately zero
// AND is not so large a value as to create overflow.
}
在某些情况下,稍微贵一点的sscanf会更好,因为strtod
可以接受其他数字格式,例如十六进制。在某些情况下,您可能不希望允许一些不是“正确”浮点数的东西,例如 3.14159,使其通过转换阶段;strtod()
将允许它。
此外,strtod()
将接受(并且在草率的版本中,不检测)字符串,例如“INFERIOR”(将被解释为带有 ERIOR 尾部的 INFinity)。不太可能,但在某些情况下,如果该值在用户的控制之下,它可能会导致应用程序漏洞。
于 2012-12-15T09:17:41.360 回答
2
AFAIK,sscanf(3)和strtod(3)都应该处理locale。之前适当地调用setlocale(3) 。
于 2012-12-15T08:54:15.757 回答