Antworten:
Mit den folgenden,
#include <iomanip>
#include <iostream>
int main()
{
std::cout << std::setfill('0') << std::setw(5) << 25;
}
die Ausgabe wird sein
00025
setfill
ist ' '
standardmäßig auf das Leerzeichen ( ) eingestellt. setw
Legt die Breite des zu druckenden Feldes fest und fertig.
Wenn Sie wissen möchten, wie Ausgabestreams im Allgemeinen formatiert werden, habe ich eine Antwort auf eine andere Frage geschrieben. Ich hoffe, sie ist nützlich: Formatieren der C ++ - Konsolenausgabe.
char* or char[]
) schreiben, um nicht direkt zu trösten. Eigentlich schreibe ich eine Funktion, die formatierte Zeichenfolge
<iostream>
und <iomanip>
am Anfang der Datei, und Sie werden schreiben müssen using namespace std;
, aber das ist eine schlechte Praxis so vielleicht stattdessen sollten Sie mit den drei Kennungen in dieser Antwort Präfix std::
.
Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung der alten printf()
Funktion der C-Sprache
Sie können dies wie verwenden
int dd = 1, mm = 9, yy = 1;
printf("%02d - %02d - %04d", mm, dd, yy);
Dies wird 09 - 01 - 0001
auf der Konsole gedruckt .
Sie können auch eine andere Funktion verwenden sprintf()
, um eine formatierte Ausgabe in eine Zeichenfolge wie die folgende zu schreiben:
int dd = 1, mm = 9, yy = 1;
char s[25];
sprintf(s, "%02d - %02d - %04d", mm, dd, yy);
cout << s;
Vergessen Sie nicht, stdio.h
für beide Funktionen eine Header-Datei in Ihr Programm aufzunehmen
Sie können Leerzeichen entweder mit 0 oder mit einem anderen Zeichen (nicht mit einer Zahl) füllen.
Wenn Sie so etwas wie einen %24d
Formatbezeichner schreiben, werden keine 2
Leerzeichen ausgefüllt. Dadurch wird das Pad auf gesetzt 24
und Leerzeichen ausgefüllt.
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
Dies erzeugt die Ausgabe:
-12345
****-12345
-12345****
****-12345
-****12345
cout.fill( '0' );
cout.width( 3 );
cout << value;
char* or char[]
) schreiben, um nicht direkt zu trösten. Eigentlich schreibe ich eine Funktion, die formatierte Zeichenfolge
std::stringstream
.
sprintf(s, "%02d-%02d-%04d", dd, mm, yy);
wo es s
ist char*
und dd, mm, yy
sind int
. Dadurch wird das 02-02-1999
Format gemäß den Werten in Variablen geschrieben.
Ich würde die folgende Funktion verwenden. Ich mag nicht sprintf
; es macht nicht was ich will !!
#define hexchar(x) ((((x)&0x0F)>9)?((x)+'A'-10):((x)+'0'))
typedef signed long long Int64;
// Special printf for numbers only
// See formatting information below.
//
// Print the number "n" in the given "base"
// using exactly "numDigits".
// Print +/- if signed flag "isSigned" is TRUE.
// Use the character specified in "padchar" to pad extra characters.
//
// Examples:
// sprintfNum(pszBuffer, 6, 10, 6, TRUE, ' ', 1234); --> " +1234"
// sprintfNum(pszBuffer, 6, 10, 6, FALSE, '0', 1234); --> "001234"
// sprintfNum(pszBuffer, 6, 16, 6, FALSE, '.', 0x5AA5); --> "..5AA5"
void sprintfNum(char *pszBuffer, int size, char base, char numDigits, char isSigned, char padchar, Int64 n)
{
char *ptr = pszBuffer;
if (!pszBuffer)
{
return;
}
char *p, buf[32];
unsigned long long x;
unsigned char count;
// Prepare negative number
if (isSigned && (n < 0))
{
x = -n;
}
else
{
x = n;
}
// Set up small string buffer
count = (numDigits-1) - (isSigned?1:0);
p = buf + sizeof (buf);
*--p = '\0';
// Force calculation of first digit
// (to prevent zero from not printing at all!!!)
*--p = (char)hexchar(x%base);
x = x / base;
// Calculate remaining digits
while(count--)
{
if(x != 0)
{
// Calculate next digit
*--p = (char)hexchar(x%base);
x /= base;
}
else
{
// No more digits left, pad out to desired length
*--p = padchar;
}
}
// Apply signed notation if requested
if (isSigned)
{
if (n < 0)
{
*--p = '-';
}
else if (n > 0)
{
*--p = '+';
}
else
{
*--p = ' ';
}
}
// Print the string right-justified
count = numDigits;
while (count--)
{
*ptr++ = *p++;
}
return;
}
Ein weiteres Beispiel für die Ausgabe von Datum und Uhrzeit mit Null als Füllzeichen für Instanzen einstelliger Werte: 2017-06-04 18:13:02
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
int main()
{
time_t t = time(0); // Get time now
struct tm * now = localtime(&t);
cout.fill('0');
cout << (now->tm_year + 1900) << '-'
<< setw(2) << (now->tm_mon + 1) << '-'
<< setw(2) << now->tm_mday << ' '
<< setw(2) << now->tm_hour << ':'
<< setw(2) << now->tm_min << ':'
<< setw(2) << now->tm_sec
<< endl;
return 0;
}