Добавить ведущие нули в строку, без (s)printf
Я хочу добавить переменную ведущих нулей в строку. Я не смог ничего найти в Google, без того, чтобы кто-то не упомянул printf, но я хочу сделать это без printf.
Кто-нибудь из читателей знает способ?
9 ответов
// assuming that `original_string` is of type `std:string`:
std::string dest = std::string( number_of_zeros, '0').append( original_string);
Я могу дать это однострочное решение, если вам нужно поле из нулей n_zero:
std::string new_string = std::string(n_zero - old_string.length(), '0') + old_string;
Например: old_string = "45"; n_zero = 4; new_string = "0045";
Вы могли бы использовать std::string::insert
, std::stringstream
с потоковыми манипуляторами или Boost.Format:
#include <string>
#include <iostream>
#include <iomanip>
#include <boost/format.hpp>
#include <sstream>
int main() {
std::string s("12");
s.insert(0, 3, '0');
std::cout << s << "\n";
std::ostringstream ss;
ss << std::setw(5) << std::setfill('0') << 12 << "\n";
std::string s2(ss.str());
std::cout << s2;
boost::format fmt("%05d\n");
fmt % 12;
std::string s3 = fmt.str();
std::cout << s3;
}
Вы могли бы сделать что-то вроде:
std::cout << std::setw(5) << std::setfill('0') << 1;
Это должно напечатать 00001
,
Обратите внимание, однако, что символ заполнения является "липким", поэтому, когда вы закончите использовать нулевое заполнение, вам придется использовать std::cout << std::setfill(' ');
чтобы получить обычное поведение снова.
Это хорошо работает для меня. Вам не нужно переключать setfill обратно на ' ', так как это временный поток.
std::string to_zero_lead(const int value, const unsigned precision)
{
std::ostringstream oss;
oss << std::setw(precision) << std::setfill('0') << value;
return oss.str();
}
Если вы хотите изменить исходную строку вместо создания копии, вы можете использовать
std::string::insert()
.
std::string s = "123";
unsigned int number_of_zeros = 5 - s.length(); // add 2 zeros
s.insert(0, number_of_zeros, '0');
Результат:
00123
C++ способ сделать это с помощью setw, ios_base:: width и setfill
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int a = 12;
const int b = 6;
cout << setw(width) << row * col;
cout << endl;
return 0;
}
memcpy(target,'0',sizeof(target));
target[sizeof(target)-1] = 0;
Затем вставьте любую строку, которую вы хотите, с нулевым префиксом в конце буфера.
Если это целое число, запомните log_base10(number)+1
(ака ln(number)/ln(10)+1
) дает вам длину числа.
Одна строка, но ограничена целыми числами и максимум 6 нулями:
int number = 42;
int leading = 3; //6 at max
std::to_string(number*0.000001).substr(8-leading); //="042"