как обнулить предварительное заполнение для функции std :: to_string? - PullRequest
0 голосов
/ 26 ноября 2018

В C ++ с использованием std :: to_string (), как мне предварительно заполнить строку, преобразованную из целого числа?Я пытался использовать #include и std :: setfill ('0'), но это не сработало.вот простой тестовый код.

#include <iostream>
#include <string>
//#include <iomanip> // setw, setfill below doesn't work

int main()
{
int i;
for (i=0;i<20;i++){
    std::cout << "without zero fill : " << std::to_string(i) << ", with zero fill : " << std::to_string(i) << std::endl;
    //std::cout << std::setw(3) << std::setfill('0') << "without zero fill : " << std::to_string(i) << ", with zero fill : " << std::to_string(i) << std::endl;  // doesn't work
}
}

То, что я хочу сделать, это чтобы некоторые числа были преобразованы в строку, но некоторые из них с нулевым заполнением, другие нет. (Я использую его для создания имени файла на самом деле.) Как следуетЯ делаю это?
(я не знаю, почему это не должно быть так просто, как в C с использованием спецификатора формата% 0d или% 04d.)

ADD: From Добавить ведущие нули в строку, без (s) printf , я нашел

int number = 42;
int leading = 3; //6 at max
std::to_string(number*0.000001).substr(8-leading); //="042"

Это работает для меня, но я бы предпочел более естественное решение, чем этот трюк, как метод.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

ostringstream кажется излишним.Вы можете просто вставить нужное количество нулей:

template<typename T/*, typename = std::enable_if_t<std::is_integral_v<T>>*/>
std::string to_string_with_zero_padding(const T& value, std::size_t total_length)
{
    auto str = std::to_string(value);
    if (str.length() < total_length)
        str.insert(str.front() == '-' ? 1 : 0, total_length - str.length(), '0');
    return str;
}

Эта функция также работает правильно, если value отрицательно и / или если T равно char или связанному типу.

0 голосов
/ 26 ноября 2018

Вместо использования std::to_string(), вы можете использовать std::ostringstream.Манипуляторы ввода-вывода будут работать с выходом std::ostringstream.

#include <iostream>
#include <sstream>
#include <iomanip>

int main()
{
   for ( int i = 1; i <= 10; ++i )
   {
      std::ostringstream str;
      str << std::setw(3) << std::setfill('0') << i;
      std::cout << str.str() << std::endl;
   }
}

:

001
002
003
004
005
006
007
008
009
010

См., Что он работает при https://ideone.com/ay0Xzp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...