Bagaimana saya bisa melapisi int dengan angka nol di depan saat menggunakan operator cout <<?

Jawaban:

369

Dengan berikut ini,

#include <iomanip>
#include <iostream>

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

hasilnya akan

00025

setfilldiatur ke karakter spasi ( ' ') secara default. setwmengatur lebar bidang yang akan dicetak, dan hanya itu.


Jika Anda tertarik mengetahui cara memformat stream output secara umum, saya menulis jawaban untuk pertanyaan lain, semoga bermanfaat: Memformat C ++ Output Konsol.

AraK
sumber
3
tapi .. bagaimana saya bisa menulis keluaran yang diformat ke string ( char* or char[]) untuk tidak konsol langsung. Sebenarnya saya sedang menulis fungsi yang mengembalikan string yang diformat
shashwat
12
@harsh use std :: stringstream
cheshirekow
8
jangan lupa untuk mengembalikan format aliran setelah melakukan itu atau Anda akan mendapatkan kejutan yang tidak menyenangkan nantinya.
Code Abominator
14
Jawaban ini menunjuk saya ke arah yang benar tetapi bisa diperbaiki. Untuk benar-benar menggunakan kode ini, Anda harus memasukkan <iostream>dan <iomanip>di bagian atas file Anda, dan Anda harus menulis using namespace std;, tapi itu praktik yang buruk jadi mungkin Anda harus mengawali ketiga pengidentifikasi dalam jawaban ini std::.
David Grayson
@shashwat Anda dapat menggunakan kode berikut - std :: stringstream filename; filename.fill ('0'); filename.width (5); nama file << std :: to_string (i);
Pangeran Patel
45

Cara lain untuk mencapai ini adalah menggunakan printf()fungsi bahasa C yang lama

Anda bisa menggunakan ini seperti

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

Ini akan mencetak 09 - 01 - 0001pada konsol.

Anda juga dapat menggunakan fungsi lain sprintf()untuk menulis keluaran yang diformat ke string seperti di bawah ini:

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

Jangan lupa untuk memasukkan stdio.hfile header di program Anda untuk kedua fungsi ini

Hal yang perlu diperhatikan:

Anda dapat mengisi ruang kosong dengan 0 atau dengan karakter lain (bukan angka).
Jika Anda menulis sesuatu seperti %24dformat specifier daripada ini tidak akan mengisi 2ruang kosong. Ini akan mengatur pad ke 24dan akan mengisi ruang kosong.

shashwat
sumber
10
Saya tahu ini adalah jawaban lama, tetapi harus tetap ditunjukkan bahwa sprintf seharusnya tidak terlalu dipercaya karena Anda tidak dapat menentukan panjang buffer yang seharusnya ditulis. Menggunakan snprintf cenderung lebih aman. Menggunakan stream sebagai lawan dari * printf () juga jauh lebih aman karena kompiler memiliki kesempatan untuk memeriksa tipe parameter pada waktu kompilasi; Jawaban yang diterima AraK adalah tipe C ++ yang aman dan "standar", dan tidak bergantung pada header yang meracuni ruang nama global.
Magnus
Jawabannya menggunakan format tanggal sebagai contoh. Perhatikan, bagaimanapun, bahwa itu menggunakan format waktu yang eksotis sebagai contoh, meskipun terlihat mirip dengan ISO_8601 di permukaan ( 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

Ini menghasilkan output:

-12345
****-12345
-12345****
****-12345
-****12345
quest333
sumber
18
cout.fill( '0' );    
cout.width( 3 );
cout << value;
lirik
sumber
tapi .. bagaimana saya bisa menulis keluaran yang diformat ke string ( char* or char[]) untuk tidak konsol langsung. Sebenarnya saya sedang menulis fungsi yang mengembalikan string yang diformat
shashwat
2
@Shashwat Tripathi Use std::stringstream.
AraK
@AraK Saya pikir ini tidak akan berfungsi di Turbo C ++. Aku menggunakannya menggunakan sprintf(s, "%02d-%02d-%04d", dd, mm, yy);mana sadalah char*dan dd, mm, yyadalah dari intjenis. Ini akan menulis 02-02-1999format sesuai dengan nilai-nilai dalam variabel.
shashwat
3

Saya akan menggunakan fungsi berikut. Saya tidak suka sprintf; itu tidak melakukan apa yang saya inginkan !!

#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
sumber
2

Contoh lain untuk menampilkan tanggal dan waktu menggunakan nol sebagai karakter isi pada contoh nilai digit tunggal: 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;
}
pengguna8163172
sumber