解析(浮点数)时使用哪些信息?

What information is used when parsing a (float) number?

提问人:Martin Ba 提问时间:3/25/2014 最后编辑:CommunityMartin Ba 更新时间:3/25/2014 访问量:269

问:

C++ 的标准库在解析(浮点数)时使用哪些信息?

以下是我知道使用 std c++ 解析(单个)浮点数的可能性:

很明显,至少,我们必须知道什么字符用作小数分隔符。

iostreams,特别是 num_get::get此外还讨论了:

  • ios_baseI/O 格式标志 - 解析浮点时是否使用了任何信息?
  • 仲裁员 (* 见下文thousands_sep)

另一方面,在 中,这似乎是根据 (反过来由 引用) 定义的内容,唯一的变量信息似乎是被认为是空格和十进制字符的内容,尽管它似乎没有指定定义的位置。(至少在 cppref 和 MSDN 上都没有。std::strtodsscanfnum_get

那么,实际使用了哪些信息,以及 C++ 标准库的有效可解析浮点表示形式是什么?

据我所知,只需要全局(或???)的小数分隔符,此外,如果数字包含千位分隔符,我希望它只能通过 since / 不支持千位分隔符正确解析。CC++num_getstrodsscanf


(*)组(数千)分隔符对我来说是一个有趣的案例。据我所知,“”函数没有引用它,上次我检查过,标准函数永远不会写它。那么它真的是由 / 函数处理的吗?(我知道组分隔符有一个POSIX printf扩展,但这并不是真正的标准,而且在Microsoft的实现中明显缺失。CCC++printfstrtodscanf

C++ C 语言环境 iostream scanf

评论

2赞 Some programmer dude 3/25/2014
它们都应使用当前区域设置来确定千位分隔符和小数点字符。
0赞 vonbrand 3/25/2014
sscanf(3)(和 、 和 和 ) 是 C 函数,用于向后兼容。它们(作为其 C++ 对应项)应遵循区域设置。scanf(3)fscanf(3)strtod(3)
0赞 Martin Ba 3/25/2014
@vonbrand - 偶数引用的定义。对我来说,它们是完全有效的标准C++函数。num_get::getsscanf
0赞 Martin Ba 3/25/2014
@JoachimPileborg - 请参阅我的编辑 wrt。千分隔符
0赞 vonbrand 3/25/2014
@MartinBa,它们是完全有效的,但 C 遗留/兼容性。即,最好不要使用。

答:

4赞 chux - Reinstate Monica 3/25/2014 #1

C11 规格似乎有一个足够大的开口,任何尺寸的卡车都可以通过。它看起来如此开放,我看不出任何限制。strtod()

§7.22.1.3 6 除“C”语言环境外,还可以接受其他特定于语言环境的主题序列形式。


对于非“标准 C”语言环境,小数点(基数)、组分隔符、每组数字和符号似乎构成了典型的变体。但显然没有限制。isspace()


为了好玩使用 、 和 .printf()sscanf()strftime()isspace()

所有测试的区域设置的基数(小数点)均为 or、相同的 +/- 符号、无数字分组和预期的 0-9。'.'','

strftime(... "%Y" ...)在 1000-99999 年没有使用数字分隔符。

sscanf("1,234.5", "%lf", ..并且没有在任何区域设置中产生 1234.5。sscanf("1.234,5", "%lf", ..

范围为 0 到 255 的所有值都产生相同的结果,但有时 154 和 160 除外。intisspace()

当然,这些测试并不能证明可能发生的事情是有限的,但确实代表了可能性的样本。

评论

0赞 chux - Reinstate Monica 3/25/2014
另请参阅 (stackoverflow.com/questions/4406895/...)