2009-11-11 1 views
185

Я хочу, чтобы cout выводил int с ведущими нулями, поэтому значение 1 было бы напечатано как 001, а значение 25 напечатано как 025 .. у вас есть идея .. как я могу это сделать?Как я могу наложить int с ведущими нулями при использовании оператора cout <<?

Спасибо.

+1

возможно дубликат [? Печать ведущих нулей с C++ вывода оператора (Printf эквивалент)] (http://stackoverflow.com/questions/530614/prin t-leading-zeros-with-c-output-operator-printf-эквивалент) – atoMerz

ответ

276

Сначала включают <iomanip>, затем:

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

output: 
00025 

setfill устанавливается в space ' ' по умолчанию. setw устанавливает ширину поля для печати, и все.


Если вы заинтересованы в знании, как форматировать выходные потоков в общем, я написал ответ на другой вопрос, надеюсь, что это полезно: Formatting C++ Console Output.

+3

, но .. как я могу записать форматированный вывод в строку ('char * или char []'), чтобы напрямую не консолью.На самом деле я пишу функцию, которая возвращает форматированную строку – shashwat

+8

@harsh use std :: stringstream – cheshirekow

+7

не забудьте восстановить формат потока после этого, иначе вы получите неприятный сюрприз позже. –

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

, но .. как я могу записать форматированный вывод в строку ('char * или char []'), а не напрямую на консоль. На самом деле я пишу функцию, которая возвращает форматированную строку – shashwat

+1

@Shashwat Tripathi Используйте 'std :: stringstream'. – AraK

+0

@AraK Я думаю, что это не сработает в Turbo C++. Я использовал его с помощью 'sprintf (s,"% 02d-% 02d-% 04d ", dd, mm, yy);' '' '' '' char * 'и' dd, mm, yy' имеют значение 'int' тип. Это будет записывать формат '02-02-1999' в соответствии со значениями в переменных. – shashwat

32

Другим способом для достижения этой цели является используя старые printf() функции языка C

Вы можете использовать это как

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

Это напечатает 09 - 01 - 0001 на консоли.

Вы можете также использовать другую функцию sprintf() писать форматированный вывод в строку, как показано ниже:

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

Не забудьте включить файл stdio.h заголовка в вашей программе для обеих этих функций

Вещь, которую надлежит указать:

Вы можете заполнить пробел либо 0, либо другим char (не число).
Если вы пишете что-то вроде %24d спецификатора формата, это не заполнит 2 в пустых местах. Это установит площадку на 24 и заполнит пробелы.

+5

Я знаю, что это старый ответ, но все равно следует указать, что sprintf обычно не следует доверять слишком много, так как вы не можете указать длину буфера, на который он должен писать. Использование snprintf имеет тенденцию быть более безопасным. Использование потоков в отличие от * printf() также гораздо безопаснее типов, поскольку у компилятора есть возможность проверить типы параметров во время компиляции; Принимаемый ответ AraK - это безопасный тип и «стандартный» C++, и он не полагается на заголовки, которые отражают глобальное пространство имен. – Magnus

3

Я использовал бы следующую функцию. Я не люблю sprintf, он не делает то, что я хочу!

#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); --> "0" 
// 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; 
    } 

    // setup little 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; 
} 
23
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 

Это производит выход:

-12345 
****-12345 
-12345**** 
****-12345 
-****12345 
0

другой пример на сегодняшний день выходной и времени, используя ноль в качестве заполняющего символа на экземпляры отдельных значений цифр: 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; 
} 
Смежные вопросы