2

我有浮点数char[]。它是本地化字符串,DE没有小数点分隔符。是否有任何标准方法可以将此类字符串转换为浮点数?我正在寻找更好的东西然后“替换,用.和使用”。PL',''.'atoi

4

2 回答 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 回答