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

时间:2014-03-24 19:27:41

标签: c++ c locale iostream scanf

解析(浮动)数字时,C ++标准库使用了哪些信息?

这是我用std c ++解析(单个)浮点数的可能性:

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

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

  • ios_base I / O格式标志 - 解析浮点时是否有任何信息?
  • thousands_sep arator(* 见下方

另一方面,在std::strtod中,似乎sscanf的定义是(num_get引用的),那里唯一可变的信息似乎是什么是considered a space和十进制字符,虽然似乎没有指定 定义的位置。 (至少在cppref和MSDN上都没有。)

那么,实际使用了哪些信息,以及包含C ++标准库的有效可解析浮点表示的内容?

从我看到的,只需要全局(CC++ ???)中的小数分隔符,此外,如果数字包含千位分隔符,我希望它只有num_get才能正确解析,因为strod / sscanf不支持千位​​分隔符。


(*)组(千)分隔符对我来说是一个有趣的案例。据我所知,“C”函数不会对其进行任何引用,而上次我检查CC++标准{{1}函数永远不会写它。它是否真的由printf / strtod函数处理? (我知道组分隔符有一个POSIX printf 扩展名,但这不是真正的标准,特别是微软的实现中没有。)

1 个答案:

答案 0 :(得分:4)

strtod()的C11规格似乎有一个足够大的开口,可供任何规模的卡车通过。它似乎是开放式的,我认为没有限制。

  

§7.22.1.36除“C”语言环境外,可以接受其他特定于语言环境的主题序列表格。


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


使用printf()sscanf()strftime()isspace(),使用500多种语言区域进行实验实验

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

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

sscanf("1,234.5", "%lf", ..sscanf("1.234,5", "%lf", ..未在任何区域设置中生成1234.5。

0到255范围内的所有int值产生相同的isspace()结果,有时除外154和160.

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