使用cout << operator时,如何使用前导零填充int?

jam*_*ieQ 232 c++ formatting cout

我想cout输出一个带前导零的int,因此值1将打印为001,值25打印为025.我怎样才能做到这一点?

Ara*_*raK 346

首先包括setfill,然后:

#include <iomanip>
#include <iostream>

int main()
{
    std::cout << std::setfill('0') << std::setw(5) << 25;
}
Run Code Online (Sandbox Code Playgroud)

' 'setw默认设置为.setfill设置要打印的字段的宽度,就是这样.


如果您有兴趣知道如何格式化输出流一般,我写了另一个问题的答案,希望它是有用的: 格式化C++控制台输出.

  • 这个答案指出了我正确的方向,但可以改进.要实际使用此代码,您需要在文件顶部包含`<iostream>`和`<iomanip>`,并且您需要编写`using namespace std;`,但这是不好的做法,所以可能相反,你应该在这个答案中使用`std ::`作为前缀. (14认同)
  • @harsh使用std :: stringstream (12认同)
  • 不要忘记在执行此操作后恢复流格式,否则您将在以后获得令人讨厌的惊喜. (8认同)
  • 为了增加乐趣,“std::setw”仅在下一个输出操作之前设置流的宽度属性,之后将其重置为 0,但“std::setfill”是持久的。 (7认同)
  • 但..如何将格式化输出写入字符串(`char*或char []`)而不是直接控制台.其实我正在编写一个返回格式化字符串的函数 (3认同)

sha*_*wat 40

实现此目的的另一种方法是使用printf()C语言的旧函数

你可以像这样使用它

int dd = 1, mm = 9, yy = 1;
printf("%02d - %02d - %04d", mm, dd, yy);
Run Code Online (Sandbox Code Playgroud)

这将09 - 01 - 0001在控制台上打印.

您还可以使用另一个函数sprintf()将格式化输出写入字符串,如下所示:

int dd = 1, mm = 9, yy = 1;
char s[25];
sprintf(s, "%02d - %02d - %04d", mm, dd, yy);
cout << s;
Run Code Online (Sandbox Code Playgroud)

不要忘记stdio.h在程序中包含头文件以用于这两个函数

需要注意的是:

您可以用0或其他字符(不是数字)填充空格.
如果您确实写了%24d格式说明符之类的内容,则不会填写2空格.这将设置填充24并将填充空格.

  • 我知道这是一个古老的答案,但是仍然应该指出sprintf通常不应该被过多地信任,因为你不能指定它应该写入的缓冲区的长度.使用snprintf往往更安全.使用流而不是*printf()也更加类型安全,因为编译器有机会在编译时检查参数的类型; AraK接受的答案是类型安全和"标准"C++,它不依赖于毒害全局命名空间的标头. (9认同)

小智 30

cout.fill('*');
cout << -12345 << endl; // print default value with no field width
cout << setw(10) << -12345 << endl; // print default with field width
cout << setw(10) << left << -12345 << endl; // print left justified
cout << setw(10) << right << -12345 << endl; // print right justified
cout << setw(10) << internal << -12345 << endl; // print internally justified
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

-12345
****-12345
-12345****
****-12345
-****12345
Run Code Online (Sandbox Code Playgroud)


lyr*_*cat 17

cout.fill( '0' );    
cout.width( 3 );
cout << value;
Run Code Online (Sandbox Code Playgroud)

  • @Shashwat Tripathi使用`std :: stringstream`. (2认同)

vit*_*aut 14

在 C++20 中,您将能够执行以下操作:

std::cout << std::format("{:03}", 25); // prints 025
Run Code Online (Sandbox Code Playgroud)

在此期间,您可以使用的{} FMT库std::format是基于。

免责声明:我是 {fmt} 和 C++20 的作者std::format

  • 恭喜您的库进入 C++20!很多年前第一次使用它。 (3认同)
  • @jlh,这是一个库,不是编译器功能,但除此之外你是对的:标准库实现尚不支持 std::format (C++20 最近才发布)。我知道 libc++ 和 Microsoft 正在研究它。 (2认同)