首页 > 解决方案 > 有没有一种简单的方法可以将前导零添加到通过 std::to_string(int) 创建的字符串中?

问题描述

我通过将 an 转换为 astd::string部分创建了以下内容:intstring

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()转换的解决方案。

标签: c++stringformattingstd

解决方案


使用字符串流

它的行为与 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

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

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


推荐阅读