27 votes

std :: ostringstream place le signe au mauvais endroit?

Je suis en utilisant std::ostringstream pour formater une double chaîne avec un format spécifique (à l'aide de l'apostrophe comme des séparateurs de milliers). Cependant, dans certains cas, ostringstream m'a donné un résultat différent de ce que j'attendais.

Aussi loin que je peux dire, il est attendu que le code ci-dessous doit être "+01"; au lieu de cela, il renvoie "0+1". Ce que je fais mal ici, et comment puis-je obtenir le résultat dont j'ai besoin?

#include <iomanip>
#include <iostream>
#include <sstream>

int main() 
{
    std::ostringstream stream;
    stream << std::showpos; // Always show sign
    stream << std::setw(3); // Minimum 3 characters
    stream << std::setfill( '0' ); // Zero-padded
    stream << 1; // Expected output: "+01"

    std::cout << stream.str(); // Output: "0+1"
    return 0;
}

Code sur ideone

38voto

Bo Persson Points 42821

Il existe trois options pour le rembourrage, left , right et internal .

Vous voulez un remplissage entre internal , entre le signe et la valeur.

 stream << std::setfill( '0' ) << std::internal; // Zero-padded
 

12voto

informaticienzero Points 876

Vous pouvez utiliser std::internal juste avant std::showpos (comme indiqué ici ).

Nous devons ajouter l'indicateur std :: internal pour indiquer au flux d'insérer un "remplissage interne" - c'est-à-dire que le remplissage doit être inséré entre le signe et le reste du nombre.

 #include <iomanip>
#include <iostream>
#include <sstream>

int main() 
{
    std::ostringstream stream;

    stream << std::setfill('0');
    stream << std::setw(3);
    stream << std::internal;
    stream << std::showpos;
    stream << 1; 

    std::cout << stream.str(); // Output: "+01"
    return 0;
}
 

9voto

Pete Becker Points 27371

Le caractère de remplissage est utilisé avec n'importe quel type pour remplir une largeur donnée. Par défaut, les caractères de remplissage vont à gauche de la valeur, et c'est ce que vous voyez avec ces zéros. La solution consiste à remplacer cette valeur par défaut et à indiquer au flux de placer les caractères de remplissage à l' intérieur du texte:

 std::cout << std::internal << std::setfill(0) << std::setw(3) << 1 << '\n';
 

Vous pouvez également utiliser std::left ou std::right pour placer les caractères de remplissage à gauche de la valeur ou à droite de la valeur.

1voto

Dúthomhas Points 1163

C'est malheureusement ainsi que cela est censé fonctionner. Le «0» est utilisé comme caractère de remplissage et non comme partie du nombre.

Pour le corriger, vous devez sortir le + ou - séparément:

 std::ostringstream oss;
oss << "+-"[x<0];
oss << std::setw(2) << std::setfill('0') << std::abs(x);
return/cout/whatever oss.str();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X