我在char[]
中有一个浮点数。它是DE
或PL
本地化字符串,并且','
不是'.'
作为小数点分隔符。有没有标准的方法将这样的字符串转换为浮点数?我正在寻找更好的东西,然后“替换,使用。{并使用atoi
”。
答案 0 :(得分: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
为零来检查错误,而不是设置{{1} }:
errno
在某些情况下,稍微昂贵的 sscanf 会更好,因为// 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.
}
可以接受其他数字格式,例如十六进制。在某些情况下,您可能不想要允许某些不是“正确”浮动的东西,例如3.14159,使其超过转换阶段; strtod
允许它。
此外,strtod()
将接受(并且在较粗略的版本中,未检测)字符串,例如“INFERIOR”(将被解释为具有ERIOR尾部的INFinity)。不太可能,但在某些情况下,如果值受用户控制,则可能导致应用程序漏洞。
答案 1 :(得分:2)
AFAIK,sscanf(3)和strtod(3)都应该照顾locale。在适当之前调用setlocale(3)。