2009-11-11 144 views
185

Quiero que cout muestre un int con los ceros a la izquierda, por lo que el valor 1 se imprimirá como 001 y el valor 25 se imprimirá como 025 ... se entiende ... ¿cómo puedo hacer esto?¿Cómo puedo rellenar un int con los ceros a la izquierda cuando uso el operador cout <<?

Gracias.

+1

posible duplicado de [? ceros a la izquierda de impresión con C++ operador de salida (equivalente printf)] (http://stackoverflow.com/questions/530614/prin t-leading-zeros-with-c-output-operator-printf-equivalent) – atoMerz

Respuesta

276

primer incluyen <iomanip>, entonces:

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

output: 
00025 

setfill se establece en space ' ' por defecto. setw establece el ancho del campo que se imprimirá, y eso es todo.


Si usted está interesado en saber cómo el dar formato a los flujos de salida, en general, me escribió una respuesta para otra pregunta, espero que sea útil: Formatting C++ Console Output.

+3

pero ... ¿cómo puedo escribir una salida formateada en una cadena ('char * o char []') no para consolar directamente.En realidad estoy escribiendo una función que devuelve una cadena formateada – shashwat

+8

@harsh use std :: stringstream – cheshirekow

+7

no olvide restaurar el formato de la secuencia después de hacer eso o le sorprenderá más tarde. –

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

pero ... ¿cómo puedo escribir la salida formateada a una cadena ('char * o char []') no para consolar directamente. En realidad estoy escribiendo una función que devuelve una cadena formateada – shashwat

+1

@Shashwat Tripathi Use 'std :: stringstream'. – AraK

+0

@AraK Creo que esto no funcionaría en Turbo C++. Lo usé usando 'sprintf (s,"% 02d-% 02d-% 04d ", dd, mm, yy);' donde 's' es' char * 'y' dd, mm, yy' son de 'int' tipo. Esto escribirá el formato '02-02-1999' de acuerdo con los valores en las variables. – shashwat

32

Otra forma de lograr esto es utilizando edad printf() función del lenguaje C

Usted puede utilizar esto como

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

Esto imprimirá 09 - 01 - 0001 en la consola.

También puede utilizar otra función sprintf() para escribir la salida con formato a una cadena como a continuación:

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

No se olvide de incluir el archivo de cabecera stdio.h en su programa para estas dos funciones

A tener en cuenta:

Puede completar el espacio en blanco por 0 o por otro char (no número).
Si escribe algo como el especificador de formato %24d, esto no llenará 2 en espacios en blanco. Esto establecerá el pad en 24 y llenará espacios en blanco.

+5

Sé que esta es una respuesta antigua, pero aún debe señalarse que sprintf en general no se debe confiar demasiado ya que no se puede especificar la longitud del búfer en el que se supone que debe escribirse. Usar snprintf tiende a ser más seguro. El uso de flujos en lugar de * printf() también es mucho más seguro debido a que el compilador tiene la oportunidad de verificar los tipos de parámetros en tiempo de compilación; La respuesta aceptada de AraK es a la vez segura y C++ "estándar", y no depende de los encabezados que envenenan el espacio de nombres global. – Magnus

3

Utilizaría la siguiente función. ¡No me gusta el sprintf, no hace lo que quiero!

#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 

Esto produce la salida:

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

otro ejemplo hasta la fecha de salida y el tiempo de utilización de cero como un carácter de relleno en los casos de los valores de un solo dígito: 06/04/2017 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; 
} 
Cuestiones relacionadas