https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114862
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- Actually I think we're doing exactly what the standard requires: ios_base::fmtflags __fltfield = __flags & ios_base::floatfield; ... // [22.2.2.2.2] Table 58 if (__fltfield == ios_base::fixed) *__fptr++ = 'f'; when (flags & ios_base::floatfield) == ios_base::fixed the conversion specifier is %f and uppercase is not considered. There is no way to use a conversion specifier of %F with std::num_put. That seems odd, but it's what the standard says. Libc++ does what you expect, which seems to be non-conforming. I don't see any library issues about this, so I'll talk to the committee.