将本地化字符串转换为C中的float

时间:2012-12-15 08:48:43

标签: c

我在char[]中有一个浮点数。它是DEPL本地化字符串,并且','不是'.'作为小数点分隔符。有没有标准的方法将这样的字符串转换为浮点数?我正在寻找更好的东西,然后“替换,使用。{并使用atoi”。

2 个答案:

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