Làm cách nào tôi có thể đệm int với các số 0 đứng đầu khi sử dụng toán tử cout <<?


Câu trả lời:


369

Với những điều sau đây,

#include <iomanip>
#include <iostream>

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

đầu ra sẽ là

00025

setfillđược đặt thành ký tự khoảng trắng ( ' ') theo mặc định. setwđặt chiều rộng của trường sẽ được in và đó là trường.


Nếu bạn quan tâm đến việc biết cách định dạng các luồng đầu ra nói chung, tôi đã viết một câu trả lời cho một câu hỏi khác, hy vọng nó hữu ích: Định dạng đầu ra Bảng điều khiển C ++.


3
nhưng .. làm thế nào tôi có thể viết đầu ra được định dạng vào một chuỗi ( char* or char[]) không trực tiếp đến bàn điều khiển. Trên thực tế tôi đang viết một hàm trả về chuỗi được định dạng
shashwat

12
@harsh sử dụng std :: chuỗi dòng
cheshirekow

8
đừng quên khôi phục định dạng luồng sau khi làm điều đó hoặc bạn sẽ gặp bất ngờ khó chịu sau này.
Mã số Abominator

14
Câu trả lời này chỉ cho tôi đi đúng hướng nhưng nó có thể được cải thiện. Để thực sự sử dụng mã này, bạn sẽ cần phải bao gồm <iostream><iomanip>ở đầu tệp của bạn và bạn sẽ cần phải viết using namespace std;, nhưng đó là cách thực hành tồi nên có lẽ thay vào đó bạn nên đặt tiền tố cho ba định danh trong câu trả lời này std::.
David Grayson

@shashwat bạn có thể sử dụng mã sau - std :: tên tệp chuỗi; tên tệp.fill ('0'); tên tệp. Băng thông (5); tên tệp << std :: to_opes (i);
Hoàng tử Patel

45

Một cách khác để đạt được điều này là sử dụng printf()chức năng cũ của ngôn ngữ C

Bạn có thể sử dụng như thế này

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

Điều này sẽ in 09 - 01 - 0001trên bàn điều khiển.

Bạn cũng có thể sử dụng một chức năng khác sprintf()để ghi đầu ra được định dạng vào một chuỗi như dưới đây:

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

Đừng quên bao gồm stdio.htệp tiêu đề trong chương trình của bạn cho cả hai chức năng này

Điều cần lưu ý:

Bạn có thể điền vào chỗ trống bằng 0 hoặc bằng char khác (không phải số).
Nếu bạn viết một cái gì đó giống như %24dđịnh dạng định dạng thì điều này sẽ không điền vào chỗ 2trống. Điều này sẽ đặt pad thành 24và sẽ lấp đầy khoảng trống.


10
Tôi biết đây là một câu trả lời cũ, nhưng vẫn nên chỉ ra rằng sprintf thường không nên được tin tưởng quá nhiều vì bạn không thể chỉ định độ dài của bộ đệm mà nó nên ghi vào. Sử dụng snprintf có xu hướng an toàn hơn. Sử dụng các luồng trái ngược với * printf () cũng an toàn hơn nhiều loại vì trình biên dịch có cơ hội kiểm tra các loại tham số tại thời gian biên dịch; Câu trả lời được chấp nhận của AraK là cả loại C ++ an toàn và "tiêu chuẩn", và nó không dựa vào các tiêu đề gây độc cho không gian tên toàn cầu.
Magnus

Câu trả lời là sử dụng định dạng ngày làm ví dụ. Tuy nhiên, lưu ý rằng nó sử dụng định dạng thời gian kỳ lạ làm ví dụ, mặc dù nó trông tương tự như ISO_8601 trên bề mặt ( 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

Điều này tạo ra đầu ra:

-12345
****-12345
-12345****
****-12345
-****12345

18
cout.fill( '0' );    
cout.width( 3 );
cout << value;

nhưng .. làm thế nào tôi có thể viết đầu ra được định dạng vào một chuỗi ( char* or char[]) không trực tiếp đến bàn điều khiển. Trên thực tế tôi đang viết một hàm trả về chuỗi được định dạng
shashwat

2
@Shashwat Tripathi Sử dụng std::stringstream.
AraK

@AraK Tôi nghĩ rằng điều này sẽ không hoạt động trong Turbo C ++. Tôi đã sử dụng nó bằng cách sử sprintf(s, "%02d-%02d-%04d", dd, mm, yy);nơi schar*dd, mm, yylà của intloại. Điều này sẽ viết 02-02-1999định dạng theo các giá trị trong các biến.
shashwat

3

Tôi sẽ sử dụng các chức năng sau đây. Tôi không thích sprintf; nó không làm những gì tôi muốn !!

#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;
}

2

Một ví dụ khác để xuất ngày và thời gian bằng cách sử dụng số 0 làm ký tự điền vào các trường hợp của các giá trị chữ số đơn: 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.