Wie kann ich ein int mit führenden Nullen auffüllen, wenn ich den Operator cout << verwende?

Antworten:

369

Mit den folgenden,

#include <iomanip>
#include <iostream>

int main()
{
    std::cout << std::setfill('0') << std::setw(5) << 25;
}

die Ausgabe wird sein

00025

setfillist ' 'standardmäßig auf das Leerzeichen ( ) eingestellt. setwLegt 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.

AraK
quelle
3
aber .. wie kann ich formatierte Ausgabe in eine Zeichenfolge ( char* or char[]) schreiben, um nicht direkt zu trösten. Eigentlich schreibe ich eine Funktion, die formatierte Zeichenfolge
zurückgibt
12
@harsh Verwendung std :: string
cheshirekow
8
Vergessen Sie nicht, das Stream-Format danach wiederherzustellen, sonst erhalten Sie später eine böse Überraschung.
Code Abominator
14
Diese Antwort hat mich in die richtige Richtung gelenkt, aber sie könnte verbessert werden. Um tatsächlich diesen Code zu verwenden, müssen Sie umfassen <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::.
David Grayson
@shashwat Sie können folgenden Code verwenden - std :: stringstream Dateiname; Dateiname.Füllung ('0'); Dateiname.Breite (5); Dateiname << std :: to_string (i);
Prinz Patel
45

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 - 0001auf 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.hfür beide Funktionen eine Header-Datei in Ihr Programm aufzunehmen

Zu beachten ist:

Sie können Leerzeichen entweder mit 0 oder mit einem anderen Zeichen (nicht mit einer Zahl) füllen.
Wenn Sie so etwas wie einen %24dFormatbezeichner schreiben, werden keine 2Leerzeichen ausgefüllt. Dadurch wird das Pad auf gesetzt 24und Leerzeichen ausgefüllt.

Shashwat
quelle
10
Ich weiß, dass dies eine alte Antwort ist, aber es sollte immer noch darauf hingewiesen werden, dass sprintf im Allgemeinen nicht zu sehr vertraut werden sollte, da Sie die Länge des Puffers, in den geschrieben werden soll, nicht angeben können. Die Verwendung von snprintf ist in der Regel sicherer. Die Verwendung von Streams im Gegensatz zu * printf () ist auch viel typsicherer, da der Compiler die Möglichkeit hat, die Typen der Parameter zur Kompilierungszeit zu überprüfen. Die von AraK akzeptierte Antwort ist sowohl typsicher als auch "Standard" C ++ und basiert nicht auf Headern, die den globalen Namespace vergiften.
Magnus
Die Antwort verwendet die Datumsformatierung als Beispiel. Beachten Sie jedoch, dass ein exotisches Zeitformat als Beispiel verwendet wird, obwohl es auf der Oberfläche ISO_8601 ähnelt ( en.wikipedia.org/wiki/ISO_8601 ).
varepsilon
32
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
quest333
quelle
18
cout.fill( '0' );    
cout.width( 3 );
cout << value;
lyricat
quelle
aber .. wie kann ich formatierte Ausgabe in eine Zeichenfolge ( char* or char[]) schreiben, um nicht direkt zu trösten. Eigentlich schreibe ich eine Funktion, die formatierte Zeichenfolge
zurückgibt
2
@ Shashwat Tripathi Verwendung std::stringstream.
AraK
@AraK Ich denke, das würde in Turbo C ++ nicht funktionieren. Ich habe es benutzt, indem ich verwendet habe, sprintf(s, "%02d-%02d-%04d", dd, mm, yy);wo es sist char*und dd, mm, yysind int. Dadurch wird das 02-02-1999Format gemäß den Werten in Variablen geschrieben.
Shashwat
3

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;
}
Thomas J Younsi
quelle
2

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;
}
user8163172
quelle