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

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

int n = 999;
string str = some_function(n,6);
//str = '000999'

在C ++中是否有这样的函数?

有帮助吗?

解决方案

或使用stringstreams:

#include <sstream>
#include <iomanip>

std::stringstream ss;
ss << std::setw(10) << std::setfill('0') << i;
std::string s = ss.str();

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

其他提示

char str[7];
snprintf (str, 7, "%06d", n);

请参阅 snprintf

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

sprintf 版本没有采取任何锁定(至少根据我目前正在开发的锁定监视工具......)因此可能会“更好”用于并发情况。

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

stringstream会做( as xtofl指出)。 Boost格式更方便更换snprintf。

此方法不使用stream或sprintf。除了存在锁定问题之外,流会产生性能开销,实际上是一种过度杀伤力。对于流,开销来自构建蒸汽和流缓冲区的需要。对于sprintf,开销来自需要解释格式字符串。即使 n 为负数或 n 的字符串表示长于 len ,此方法仍然有效。这是最快的解决方案。

inline string some_function(int n, int len)
{
    string result(len--, '0');
    for (int val=(n<0)?-n:n; len>=0&&val!=0; --len,val/=10)
       result[len]='0'+val%10;
    if (len>=0&&n<0) result[0]='-';
    return result;
}

有很多方法可以做到这一点。最简单的是:

int n = 999;
char buffer[256]; sprintf(buffer, "%06d", n);
string str(buffer);

sprintf是类似C语言的方式,也适用于C ++。

在C ++中,字符串流和流输出格式的组合(请参阅 http:// www .arachnoid.com / cpptutor / student3.html )将完成这项工作。

这是一个旧帖子,但是 fmt 可能会成为标准,这里是一个额外的解决方案:

#include <fmt/format.h>

int n = 999;

const auto str = fmt::format("{:0>{}}", n, 6);

请注意, fmt :: format(“{:0&gt; 6}”,n)在编译时已知所需宽度时效果相同。另一种选择是 abseil

#include <absl/strings/str_format.h>

int n = 999;

const auto str = absl::StrFormat("%0*d", 6, n);

同样, abs :: StrFormat(&quot;%06d&quot;,n)是可能的。 提升格式是此问题的另一个工具:

#include <boost/format.hpp>

int n = 999;

const auto str = boost::str(boost::format("%06d") % n);

不幸的是,不支持将变量宽度说明符作为与运算符链接的参数,这需要格式化字符串设置(例如 const std :: string fmt =&quot;%0&quot; + std :: to_string(6)+&quot; d&quot;; )。

在性能方面,abseil和fmt声称自己非常具有吸引力并且比提升更快。在任何情况下,所有三种解决方案都应该比 std :: stringstream 方法更有效,除了 std :: * printf 系列之外,它们不会牺牲类型安全性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top