Это старая ветка, но поскольку fmt может сделать ее стандартной, вот дополнительное решение:
#include <fmt/format.h>
int n = 999;
const auto str = fmt::format("{:0>{}}", n, 6);
Обратите внимание, что fmt::format("{:0>6}", n)
одинаково хорошо работает, когда желаемая ширина известна во время компиляции. Другой вариант: abseil :
#include <absl/strings/str_format.h>
int n = 999;
const auto str = absl::StrFormat("%0*d", 6, n);
Опять же, abs::StrFormat("%06d", n)
возможно. расширенный формат - еще один инструмент для решения этой проблемы:
#include <boost/format.hpp>
int n = 999;
const auto str = boost::str(boost::format("%06d") % n);
К сожалению, спецификатор переменной ширины в качестве аргументов, связанных с оператором %
, не поддерживается, для этого требуется настройка строки формата (например, const std::string fmt = "%0" + std::to_string(6) + "d";
).
С точки зрения производительности, abseil и fmt утверждают, что они очень привлекательны и быстрее, чем boost. В любом случае все три решения должны быть более эффективными, чем std::stringstream
подходы, и, кроме семейства std::*printf
, они не приносят в жертву безопасность типов.