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

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

本文关键字:信息 浮点 数字 解析      更新时间:2023-10-16

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

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

  • double atof( const char *str )
  • sscanf
  • double strtod( const char* str, char** str_end );
  • istringstream、经由operator>>
  • 直接通过num_get

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

iostreams,特别是num_get::get此外还谈到:

  • ios_base I/O格式标志-这里是否有解析浮点时使用的任何信息
  • thousands_sep加速器(*见下文(

另一方面,在std::strtod中,似乎是sscanf的定义(反过来又被num_get引用(,唯一的变量信息似乎是什么被认为是空间和十进制字符,尽管似乎没有指定是在哪里定义的。(至少在cppref和MSDN上都没有。(

那么,实际使用的信息是什么?C++标准库的有效可解析浮点表示是什么?

据我所见,只需要全局中的十进制分隔符(CC++??(,此外,如果数字包含千位分隔符,我希望它只能由num_get正确解析,因为strod/sscanf不支持千位分隔。


(*(组(千(分隔符对我来说是一个有趣的例子;CCD_ 18";函数不会对进行任何引用,上次我检查CC++标准printf函数时,它永远不会写入。那么,它真的是由strtod/scanf函数处理的吗?(我知道组分隔符有一个POSIXprintf扩展,但这并不是真正的标准,而且在微软的实现中明显缺失。(

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

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


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


为了好玩,使用printf()sscanf()strftime()isspace()对500多个区域设置进行了实验。

所有测试的区域设置的基数(十进制(点为'.'',',具有相同的+/-号,没有数字分组,并且预期为0-9。

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

CCD_ 33和CCD_。

0到255范围内的所有CCD_ 35值产生相同的CCD_。

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