开发者

Add leading zeroes to string, without (s)printf

开发者 https://www.devze.com 2023-03-08 11:33 出处:网络
I want to add a variable of leading zero\'s to a string. I couldn\'t find anything on Google, without someone mentioning (s)printf,

I want to add a variable of leading zero's to a string. I couldn't find anything on Google, without someone mentioning (s)printf, but I want to do th开发者_开发问答is without (s)printf.

Does anybody of the readers know a way?


I can give this one-line solution if you want a field of n_zero zeros:

auto new_str = std::string(n_zero - std::min(n_zero, old_str.length()), '0') + old_str;

For example, for std::string old_str = "45"; size_t n_zero = 4; you get new_str == "0045".


You could use std::string::insert, std::stringstream with stream manipulators, or 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;
}


You could do something like:

std::cout << std::setw(5) << std::setfill('0') << 1;

This should print 00001.

Note, however, that the fill-character is "sticky", so when you're done using zero-filling, you'll have to use std::cout << std::setfill(' '); to get the usual behavior again.


// assuming that `original_string` is of type `std:string`:

std::string dest = std::string( number_of_zeros, '0').append( original_string);


This works well for me. You don't need to switch setfill back to ' ', as this a temporary stream.

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();
}


If you want to modify the original string instead of creating a copy, you can use 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');

Result:

00123


memcpy(target,'0',sizeof(target));
target[sizeof(target)-1] = 0;

Then stick whatever string you want zero prefixed at the end of the buffer.

If it is an integer number, remember log_base10(number)+1 (aka ln(number)/ln(10)+1) gives you the length of the number.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号