Старый способ Visual C ++ с трехзначным показателем представляется устаревшим расширением Visual C ++ _set_output_format .Документация гласит:
Важно
Эта функция устарела.Начиная с Visual Studio 2015, он не доступен в CRT.
Таким образом, в основном вам не повезло, но не безнадежно.
Вы можете определить свою собственную функцию печати дляудвоить и связать его с std::basic_ostream
через std::ios_base::imbue
.Это означает, что вам нужно определить новую локаль только для ваших нужд.
Вот эскиз решения.Вы должны заполнить детали, чтобы код хорошо работал со всеми параметрами форматирования iostream
и не игнорировал такие вещи, как setprecision()
.Пример кода ниже - это всего лишь пример, он не делает все эти вещи.Для полного решения вам придется немного поработать (но не слишком):
template <class Char>
class my_double : public std::num_put<Char>
{
public:
static my_double * get()
{
static my_double * singleton = new my_double;
return singleton;
}
private:
using base = std::num_put<Char>;
//
// This method will format your double according to your needs.
// Refine the code so that it reads and uses all the flags from `str`
// and uses the `fill` character.
//
iter_type do_put(iter_type out, std::ios_base& str, Char fill, double v) const override
{
if (v < 0)
{
v *= -1;
*out = '-';
++out;
}
if (v == 0.0 || std::isnan(v))
{
return base::do_put(out, str, fill, v);
}
auto exponent = static_cast<int>(std::floor(std::log10(v)));
auto significand = v / std::pow(10.0, exponent);
// TODO: Format according to the flags in `str`
out = base::do_put(out, str, fill, significand);
*(out++) = 'e';
if (exponent < 0)
{
*(out++) = '-';
exponent *= -1;
}
*(out++) = '0' + ( (exponent / 100) % 10);
*(out++) = '0' + ((exponent / 10) % 10);
*(out++) = '0' + (exponent % 10);
return out;
}
};
int main()
{
// !!!
// This is how you register your formatting function for `double`
// !!!
std::cout.imbue(std::locale(cout.getloc(), my_double<char>::get()));
/// your code goes here:
}