it-swarm.com.de

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

Ich möchte, dass cout ein int mit führenden Nullen ausgibt, sodass der Wert 1 als 001 und der Wert 25 als 025 gedruckt wird. Wie kann ich das machen?

213
jamieQ

Zuerst <iomanip> einschließen, dann:

cout << setfill('0') << setw(5) << 25;

output:
00025

setfill ist standardmäßig auf space ' ' eingestellt. setw legt die Breite des zu druckenden Feldes fest und das ist es.


Wenn Sie wissen möchten, wie die Ausgabeströme im Allgemeinen formatiert werden sollen, habe ich eine Antwort auf eine andere Frage geschrieben. Ich hoffe, es ist nützlich: Formatieren der C++ - Konsolenausgabe.

319
AraK

Eine andere Möglichkeit, dies zu erreichen, ist die Verwendung der altenprintf()- Funktion der C-Sprache

Sie können das gerne verwenden

int dd = 1, mm = 9, yy = 1;
printf("%02d - %02d - %04d", mm, dd, yy);

Dadurch wird 09 - 01 - 0001 auf der Konsole gedruckt.

Sie können auch eine andere Funktionsprintf()verwenden, um die formatierte Ausgabe in eine Zeichenfolge wie folgt 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, diestdio.h-Header-Datei für beide Funktionen in Ihr Programm aufzunehmen

Was zu beachten ist:

Sie können Leerzeichen entweder durch 0 oder durch ein anderes Zeichen (keine Zahl) füllen.
Wenn Sie etwas wie %24d Formatbezeichner schreiben, wird 2 nicht in Leerzeichen gefüllt. Dies setzt das Pad auf 24 und füllt die leeren Felder aus.

37
shashwat
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
28
quest333
cout.fill( '0' );    
cout.width( 3 );
cout << value;
17
lyricat

Ich würde die folgende Funktion verwenden. Ich mag sprintf nicht; es tut 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;
}
3
Thomas J Younsi

Ein weiteres Beispiel für die Ausgabe von Datum und Uhrzeit unter Verwendung von Null als Füllzeichen in Fällen 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;
}
0
user8163172