2012-10-04 14 views
5

En C, se puede incluir un espacio en un indicador de formato printf que da como resultado el prefijo de números positivos con un espacio. Esta es una característica útil para alinear valores firmados. No puedo entender cómo hacer lo mismo en C++. En C:ostream: prefija un número positivo con un espacio

double d = 1.2; 
printf("%f\n",d); 
printf("%+f\n",d); 
printf("% f\n",d); 

produce:

1.2 
+1.2 
1.2 

Usando ostream, puedo hacer las dos primeras, pero ¿cómo puedo hacer el tercero?

int d = 1.2; 
std::cout << d << std::endl; 
std::cout << std::showpos << d << std::endl; 
// ?????????????? 

EDIT: Parece que hay cierta confusión acerca de si o no, sólo quiero prefijar todos mis valores con un espacio. Solo quiero prefijar valores positivos con un espacio, similar a a) como lo hace el indicador de espacio printf yb) similar a lo que hace showpos, excepto un espacio en lugar de un '+'. Por ejemplo:

printf("%f\n", 1.2); 
printf("%f\n", -1.2); 
printf("% f\n", 1.2); 
printf("% f\n", -1.2); 

1.2 
-1.2 
1.2 
-1.2 

Tenga en cuenta que el tercer valor se prefija con un espacio mientras que el cuarto valor (negativo) no lo es.

+0

¿Estás tratando de imprimir un espacio? std :: cout << ""; – Jeff

+0

Si necesita que los números se alineen, generalmente necesita usar una precisión fija y un cierto ancho de campo. Si haces eso, también obtendrás el espacio extra al principio según sea necesario. –

Respuesta

1
std::cout << " " << my_value; 

Si necesita más espacio sólo para positivo:

if (my_value >=0) cout << " "; cout << my_value; 
+0

Eso no hará lo correcto si 'my_value' es negativo. Solo quiero un espacio si el valor es positivo, de modo que los valores negativos y positivos se alineen (similar a lo que hace std :: Showpos, excepto un espacio en lugar de un '+'). –

2

¿Qué tal

std::cout << (d >= 0 ? " ":"") << d << std::endl; 
6

Puede utilizar setfill y setw, así:

cout << setw(4) << setfill(' ') << 1.2 << endl; 
cout << setw(4) << setfill(' ') << -1.2 << endl; 

Thi s produce el siguiente resultado:

1.2 
-1.2 

No se olvide de incluir <iomanip> para que este compilar (link to ideone).

+0

Eso solo funciona si ambos números tienen la misma precisión. Si los valores son 1.2 y -1.0, no funcionarán. –

+0

Puede usar 'std :: showpoint' para forzar' -1.0' a imprimir como '-1.0' en lugar de' -1'. – Zoneur

+0

¿Y si los valores fueran 1.22 y -1.2? –

0

no tengo mi nivel conmigo y yo estoy haciendo esto muy pocas veces para estar seguros de ello: Hay dos ingredientes para lograr esto con iostreams:

  1. Uso std:: showpos de tener un indicador de valores positivos se muestran. Por defecto, esto usará +, por supuesto.
  2. I piensa+ se obtiene usando std::use_facet<std::ctype<char> >(s.get_loc()).widen('+'). Para convertir esto en un espacio, puede usar un std::locale con una faceta std::ctype<char> instalada respondiendo con un espacio a la solicitud ampliar+.

Es decir, algo como esto:

struct my_ctype: std::ctype<char> { 
    char do_widen(char c) const { 
     return c == '+'? ' ': this->std::ctype<char>::do_widen(c); 
    } 
}; 

int main() { 
    std::locale loc(std::locale(), new my_ctype); 
    std::cout.imbue(loc); 
    std::cout << std::showpos << 12.34 << '\n'; 
} 

(el código no se ha probado y probablemente plagado de errores).

Cuestiones relacionadas