После долгого просмотра кода библиотеки std кажется, что все передается какой-то функции printf
type: __builtin_vsnprintf(__out, __size, __fmt, __args)
.Строка формата __fmt
устанавливается в зависимости от флагов, установленных для объекта ostringstream
, и может быть запрошена с помощью
std::ostringstream s;
// ...
char format[50];
std::__num_base::_S_format_float(s,format,'\0');
Строка формата по умолчанию - %.*g
, которая используется как в printf("%.*g",precision,x);
, гдеprecision
- это int
и x
double
для печати.Для других флагов мы получаем:
s.setf(std::ios::fixed); // %.*f
s.setf(std::ios::showpoint); // %#.*g
Тем не менее, формат %#g
не только сохраняет десятичную точку, но также сохраняет все конечные нули.В документе говорится об использовании #
в сочетании с g
:
"printf" will always print out a decimal point and trailing zeros will not
be removed; usually 'g' and 'G' remove trailing zeros.
К сожалению, я не могу найти другую строку формата printf
, которая ведет себя так же хорошо, как %g
, но всегда сохраняетдесятичная точка, так что я думаю, что что-то вроде ответа Дшеффера вполне может быть лучшим.