What are the default Format Flags (and widths) for double output in a std::stringstream?

时间:2018-08-22 13:59:54

标签: c++ std precision stringstream

What is the default format, when I'm writting a double to a stringstream?

double v = 3.0;
std::stringstream ss;
ss << v;

Where can I find a list of the default format setup for a stringstream? Is the default format the same for all derived classes of std::istream (within the stdlib)?

2 个答案:

答案 0 :(得分:5)

默认设置是由std::basic_ios::init设置的,并且对于所有从ios_base派生的流来说都是相同的。默认值为:

rdbuf()         sb
tie()           0
rdstate()       goodbit if sb is not a null pointer, otherwise badbit.
exceptions()    goodbit
flags()         skipws | dec
width()         0
precision()     6
fill()          widen(’ ’)
getloc()        a copy of the value returned by locale()
iarray          a null pointer
parray          a null pointer

因此默认精度为6

答案 1 :(得分:2)

  

在哪里可以找到字符串流的默认格式设置列表?

所有标准库行为的权威来源是标准文档。在这种情况下,[basic.ios.members]部分中标记为basic_ios::init() effects的表。

+--------------+--------------------------------------------------------+
|   Element    |                         Value                          |
+--------------+--------------------------------------------------------+
| rdbuf()      | sb                                                     |
| tie()        | 0                                                      |
| rdstate()    | goodbit if sb is not a null pointer, otherwise badbit. |
| exceptions() | goodbit                                                |
| flags()      | skipws | dec                                           |
| width()      | 0                                                      |
| precision()  | 6                                                      |
| fill()       | widen(’ ’)                                             |
| getloc()     | a copy of the value returned by locale()               |
| iarray       | a null pointer                                         |
| parray       | a null pointer                                         |
+--------------+--------------------------------------------------------+

格式化浮点数取决于floatfield标志,该标志在默认flags()中未设置。该行为在[facet.num.put.virtuals]部分的表Floating-point conversions中定义。

+----------------------------------------------------------------------+-----------------+
|                                State                                 | stdioequivalent |
+----------------------------------------------------------------------+-----------------+
| floatfield == ios_base::fixed                                        | %f              |
| floatfield == ios_base::scientific && !uppercase                     | %e              |
| floatfield == ios_base::scientific                                   | %E              |
| floatfield == (ios_base::fixed | ios_base::scientific) && !uppercase | %a              |
| floatfield == (ios_base::fixed | ios_base::scientific)               | %A              |
| !uppercase                                                           | %g              |
| otherwise                                                            | %G              |
+----------------------------------------------------------------------+-----------------+

因此,初始状态下的格式化应与stdio格式标志%G相匹配。在C标准的[格式化的输入/输出功能]部分中指定了stdio格式标志:

  

f,F

     

表示浮点数的 double 参数将转换为[-] ddd.ddd格式的十进制表示法,其中小数点字符后的位数等于精度规范。如果缺少精度,则取值为6;否则,取值为0。如果精度为零,并且未指定标志,则不显示小数点字符。如果出现小数点字符,则在其前面至少出现一位数字。该值将四舍五入为适当的位数。

     

e,E

     

表示浮点数的 double 参数将以[-] d.ddde±dd格式转换,其中在该参数之前有一个数字(如果参数为非零,则为非零)。小数点字符及其后的位数等于精度;如果精度丢失,则取为6;如果精度为零,并且未指定标志,则不显示小数点字符。该值将四舍五入为适当的位数。 E 转换说明符使用 E 而不是引入指数的 e 产生一个数字。指数始终至少包含两位数,并且仅包含表示指数所需的更多位数。如果值为零,则指数为零。

     

表示无穷大的 double 参数转换为以下一种样式: [-] inf [-] infinity -实现定义的。表示NaN的双引数会转换为 [-] nan *或** [-nan] (n-char-sequence)样式之一-哪种样式以及任何n-字符序列是实现定义的。 F转换说明符产生 INF INFINITY NAN 而不是 inf 无穷大 >或 nan

     

g,G

     

表示浮点数的 double 参数以 f e 风格(或以 F 风格)转换(如果是 G 转换说明符,则为strong>或 E ),具体取决于转换后的值和精度。假设P等于精度(如果非零),6(如果省略精度)或1(如果精度为零)。然后,如果样式为 E 的转换的指数为X

     
      
  • 如果P > X ≥ -4,则转换采用样式 f (或 F )和精度P - (X + 1)
  •   
  • 否则,转换的样式为 e (或 E ),精度为P - 1
  •   

  

std :: istream的所有派生类(在stdlib中)的默认格式是否相同?

是的,默认设置相同。