将前导零添加到字符串,不带(s)printf

Guu*_*ink 24 c++

我想在字符串中添加一个前导零的变量.我没有在谷歌上找到任何东西,没有人提及printf,但我想在没有(s)printf的情况下这样做.

有没有读者知道一种方式?

Rus*_*nov 59

如果你想要一个n_zero零的字段,我可以给这个单行解决方案:

  std::string new_string = std::string(n_zero - old_string.length(), '0') + old_string;
Run Code Online (Sandbox Code Playgroud)

例如:old_string ="45"; n_zero = 4; new_string ="0045";

  • 我喜欢这个.这意味着我不必构建一个字符串流,它对内部构件有相当多的包袱. (4认同)
  • 非常好的解决方案!当 (n_zero - old_string.length()) 为负时会发生什么?编辑:刚刚对其进行了测试,它似乎仍然可以传递负值。 (2认同)
  • @lys 添加了对预期类型的​​说明,特别是 n_zero 应该是 size_t 类型,那么它也与我们使用的 std::string 构造函数兼容。 (2认同)

Rob*_*obᵩ 48

你可以使用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;
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 16

你可以这样做:

std::cout << std::setw(5) << std::setfill('0') << 1;
Run Code Online (Sandbox Code Playgroud)

这应该打印00001.

但请注意,填充字符是"粘性的",因此当您使用零填充时,您将不得不再次使用std::cout << std::setfill(' ');以获得通常的行为.

  • 好像不粘。`std::cout &lt;&lt; std::setw(5) &lt;&lt; std::setfill('0') &lt;&lt; 1 &lt;&lt; 1 &lt;&lt; std::endl;` 产生:`000011` (2认同)

Mic*_*urr 14

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

std::string dest = std::string( number_of_zeros, '0').append( original_string);
Run Code Online (Sandbox Code Playgroud)

  • 这不会只是添加零而不考虑"original_string"长度?`number_of_zeros = 4 original_string ="99"dest将变为:000099(而不是0099)`.如果我错了,请纠正我,否则我可能不明白'领先的零'究竟是什么意思...... (19认同)
  • @lepe它回答了所写的问题.OP是否写出了他们真正的意思是另一回事. (2认同)

小智 8

这对我很有效。您不需要将 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();
}
Run Code Online (Sandbox Code Playgroud)


Gen*_*his 5

如果您想修改原始字符串而不是创建副本,可以使用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');
Run Code Online (Sandbox Code Playgroud)

结果:

00123
Run Code Online (Sandbox Code Playgroud)