有没有一种简单的方法可以向通过std::to_string(int)创建的字符串添加前导零?

std::string通过将 an 转换int为 a部分创建了以下内容string

std::string text = std::string("FPS: " + std::to_string(1000 / d));

示例输出:

每秒帧数:60

现在,我想专门为int零件添加前导零,以便获得以下输出:

每秒帧数:060

我已经知道如何stdout使用std::cout << std::setfill('0') << std::setw(5) .

但是我还没有找到简单std::to_string()转换的解决方案。

回答

使用字符串流。

它的行为与 std::cout 完全一样,但有一个方法 str() 来获取您创建的字符串。

对于您的问题,它可能如下所示:

std::stringstream ss;
ss << "FPS: " << std::setfill('0') << std::setw(5) << std::to_string(1000 / d);
std::string text(ss.str());

编辑:为了测试它的性能,我创建了一个愚蠢的测试程序:

#include <sstream>
#include <iomanip>

int main()
{
    std::stringstream ss;

    for(int i=0; i<100000; i++)
    {
        ss.clear();
        ss << "FPS: " << std::setfill('0') << std::setw(5) << std::to_string(i);
        std::string text(ss.str());
    }

    return 0;
}

并用g++ -O3 main.cpp. 然后我打开一个终端并通过time以下方式启动程序:

$ time ./a.out
./a.out  1,53s user 0,01s system 99% cpu 1,536 total

因此,在Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz运行 Linux 5.13.5 内核最新 libstdc++ 的 CPU 上,100k 迭代需要 1.53 秒(平均每次迭代 15.3 微秒)

从指令的角度来看,它很长,在小型微处理器上数万条指令的成本很高,但在现代系统上,这几乎不是问题。

  • 小吹毛求疵,由于 stringstream 仅用于输出,您应该使用 `std::ostringstream` 而不是 `std::stringstream`

以上是有没有一种简单的方法可以向通过std::to_string(int)创建的字符串添加前导零?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>