Вывести лидирующие нули с помощью оператора вывода C ++? - PullRequest
51 голосов
/ 10 февраля 2009

Как мне отформатировать вывод в C ++? Другими словами, что такое C ++, эквивалентный использованию printf, например:

printf("%05d", zipCode);

Я знаю, что мог бы просто использовать printf в C ++, но я бы предпочел оператор вывода <<.

Вы бы просто использовали следующее?

std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;

Ответы [ 4 ]

79 голосов
/ 10 февраля 2009

Это поможет, по крайней мере, для неотрицательных чисел (a) , таких как почтовые индексы (b) , упомянутые в вашем вопросе.

#include <iostream>
#include <iomanip>

using namespace std;
cout << setw(5) << setfill('0') << zipCode << endl;

// or use this if you don't like 'using namespace std;'
std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;

Наиболее распространенные манипуляторы ввода-вывода, управляющие заполнением:

  • std::setw(width) устанавливает ширину поля.
  • std::setfill(fillchar) устанавливает символ заполнения.
  • std::setiosflags(align) устанавливает выравнивание, где align это ios :: left или ios :: right.

И если вы предпочитаете использовать <<, я настоятельно рекомендую вам заглянуть в библиотеку fmt. Это было отличным дополнением к нашему набору инструментов для форматирования и намного лучше, чем потоковые конвейеры с большой длиной, что позволяет вам делать такие вещи, как:

cout << fmt::format("{:05d}", zipCode);

И в настоящее время LEWG также нацелена на C ++ 20, а это означает, что, надеюсь, он станет базовой частью языка в этот момент (или почти наверняка позже, если он не совсем проникнет).


(a) Если вам нужно обрабатывать отрицательные числа, вы можете использовать std::internal следующим образом:

cout << internal << setw(5) << setfill('0') << zipCode << endl;

Помещает символ заполнения между знаком и величиной.


(b) Это («все почтовые индексы неотрицательны») является предположением с моей стороны, но достаточно безопасным, я бы гарантировал: -)

8 голосов
/ 10 февраля 2009

Использование вызовов setw и setfill :

std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
4 голосов
/ 10 февраля 2009
cout << setw(4) << setfill('0') << n << endl;

от

http://www.fredosaurus.com/notes-cpp/io/omanipulators.html

1 голос
/ 13 августа 2013

или

char t[32];
sprintf_s(t, "%05d", 1);

выдаст 00001, как ОП уже хотел сделать

...