将数字转换为C++中具有指定长度的字符串

Deg*_*vik 45 c++ integer stdstring

我有一些不同长度的数字(如1,999,76492,等等),我想将它们全部转换为具有共同长度的字符串(例如,如果长度为6,那么这些字符串将为:'000001' ,'000999','076492').

换句话说,我需要在数字中添加正确数量的前导零.

int n = 999;
string str = some_function(n,6);
//str = '000999'
Run Code Online (Sandbox Code Playgroud)

在C++中有这样的函数吗?

xto*_*ofl 60

或使用stringstreams:

#include <sstream>
#include <iomanip>

std::stringstream ss;
ss << std::setw(10) << std::setfill('0') << i;
std::string s = ss.str();
Run Code Online (Sandbox Code Playgroud)

我编译了我在arachnoid.com上找到的信息,因为我更喜欢iostreams的类型安全方式.此外,您可以在任何其他输出流上同样使用此代码.

  • 仅供参考 - 这需要包含文件`sstream`和`iomanip`. (9认同)
  • 而`stringstream`、`setw` 和`setfill`(以及`string`)都在`std` 命名空间内。 (2认同)
  • 在这样的答案中,我总是会显示输出是什么。在这种情况下,如果`int i=1;`,则为`0000000001`。 (2认同)

Isa*_*avo 14

char str[7];
snprintf (str, 7, "%06d", n);
Run Code Online (Sandbox Code Playgroud)

snprintf

  • arg#2是size_t,而不是len,所以它是7,而不是6.但是更好地使用sizeof. (4认同)

Len*_*ate 8

可能想要注意的一件事是当您使用该stringstream方法时可能会发生的潜在锁定.在Visual Studio 2008附带的STL中,至少有许多锁被取出并在格式化过程中使用各种区域设置信息时被释放.这可能会或可能不会成为您的问题,具体取决于您可能同时将数字转换为字符串的线程数量...

sprintf版本不采用任何锁定(至少根据我正在开发的锁定监视工具......)因此可能在并发情况下使用"更好".

我之所以注意到这一点,是因为我的工具最近吐出了'locale'锁,因为它是我服务器系统中锁争用最多的锁之一; 这有点令人意外,可能会让我修改我一直在采取的方法(即sprintf从中回来stringstream)......