[C++] Utilisation <clocale> avec cout
Char Snipeur
Messages postés
9813
Date d'inscription
Statut
Contributeur
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour.
Voila, mon problème est simple, je veux sortir des nombres au format numérique français, c'est à dire avec des virgules, et non des points pour le séparateur des décimal.
J'utilise <clocale> et je fait :
setlocale(LC_ALL,"French");
mais ça ne fonctionne pas avec les flux.
ça fonctionne en revanche avec printf et fprintf, mais je voudrais le faire pour les flux type cout ou 'fstream'.
Merci de vos réponses
Voila, mon problème est simple, je veux sortir des nombres au format numérique français, c'est à dire avec des virgules, et non des points pour le séparateur des décimal.
J'utilise <clocale> et je fait :
setlocale(LC_ALL,"French");
mais ça ne fonctionne pas avec les flux.
ça fonctionne en revanche avec printf et fprintf, mais je voudrais le faire pour les flux type cout ou 'fstream'.
Merci de vos réponses
A voir également:
- [C++] Utilisation <clocale> avec cout
- Utilisation chromecast - Guide
- Télécharger gratuitement notice d'utilisation - Guide
- Cout recharge telephone - Guide
- Manuel utilisation shiver ks100 - Forum Création et production musicale
- Objectif 55 200 quelle utilisation - Forum Photo numérique
17 réponses
Bonjour,
je ne suis pas expert en C++, disons des notions de base.
Pour le paramètre, il existe une clé de régistre qui permet
le changement, toutefois une fois ce changement sur la clé
effectué, c'est valide pour tous le système.
dans un TP j'ai eu à surcharger le flux, c'est très vague dans mes
souvenir, bien que celle-ci était une demo sur ostream, elle est
transposable sur fstream je crois.
en voici le contenu :
ce pourrait-être une solution pour ce que tu veux !
Lupin
je ne suis pas expert en C++, disons des notions de base.
Pour le paramètre, il existe une clé de régistre qui permet
le changement, toutefois une fois ce changement sur la clé
effectué, c'est valide pour tous le système.
"pour les flux type cout ou 'fstream'. "
dans un TP j'ai eu à surcharger le flux, c'est très vague dans mes
souvenir, bien que celle-ci était une demo sur ostream, elle est
transposable sur fstream je crois.
en voici le contenu :
Nous traitons ici, la surcharge de l’opérateur ‘<<’, celui-ci étant extrêmement lié à l’instruction « cout ». Nous avons eu recours à la documentation et à l’internet pour cerner le partage d’accès à la données par l’entremise de la librairie <ostream>. Bien que cette notion soit nouvelle, nous avons établie qu’une syntaxe du style : // serieEntiers surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const serieEntiers & ); pouvait nous permettre de capturer la série au complet dans ce que nous appellerons le flux de données défini par le partage de la classe « ostream ». Nous soulignons ici, qu’en plus d’utiliser la surcharge de l’opérateur, nous nous associons avec un élément de la librairie, c'est-à-dire comme parrainé, encadré par la classe de la librairie « ostream », donc un plus grande sécurité d’accès à la donné.
ce pourrait-être une solution pour ce que tu veux !
Lupin
suite :
voici la fonction de ma classe :
en partant de cette exemple tu peux modeler l'affichage de la
donnée sans en modifié son contenu, son intégrité !.
Lupin
voici la fonction de ma classe :
ostream &operator<< (ostream &flux, const serieEntiers &s) { int j=0,k=0; flux << "\n\n\n {"; //lupin cout << endl; while ( k < tailleMax ) { cout << " "; while ( j < ( tailleMax / 10 ) ) // Description de la ligne { if ( s.tableauEntier[k] < 10 ) { if ( s.tableauEntier[k] == 1 ) flux << " " << k << " "; else flux << " "; // flux << s.tableauEntier[k] << " " ; // Ligne de déboggage j++; k++; } else { if ( s.tableauEntier[k] == 1 ) flux << k << " "; else flux << " "; // flux << s.tableauEntier[k] << " " ; // Ligne de déboggage j++; k++; } }; j = 0; // Ligne suivante cout << endl; }; flux << " }\n\n\n"; //lupin return flux; };
en partant de cette exemple tu peux modeler l'affichage de la
donnée sans en modifié son contenu, son intégrité !.
Lupin
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Merci pour vos réponse, je commençais à désespérer...
Je suis étonné que clocale ne fonctionne que avec printf, alors que avec un non pareil, c'est un en-tête C++, et que printf n'est pas conseillé en C++. Mystère.. (pour moi)
Sinon, Lupin, ton idée est a priori bonne, sauf qu'il me semble que je ne peut surcharger ostream operator<<(ostream,double) qui existe déjà. Pour surcharger cet operateur, il faut utilisé un type qui ne soit pas un type intégré. Ou alors j'ai mal compris. Mais de toute façon, ça me ferai trop de travail à faire, mieu vaut changer mon programme en remplaçant les cout par des printf()...
Merci pour vos réponse, je commençais à désespérer...
Je suis étonné que clocale ne fonctionne que avec printf, alors que avec un non pareil, c'est un en-tête C++, et que printf n'est pas conseillé en C++. Mystère.. (pour moi)
Sinon, Lupin, ton idée est a priori bonne, sauf qu'il me semble que je ne peut surcharger ostream operator<<(ostream,double) qui existe déjà. Pour surcharger cet operateur, il faut utilisé un type qui ne soit pas un type intégré. Ou alors j'ai mal compris. Mais de toute façon, ça me ferai trop de travail à faire, mieu vaut changer mon programme en remplaçant les cout par des printf()...
Re :
c'est toi qui voit, toutefois comme tu as dis, l'instruction [printf() ] ne fait partie partie des instructions standards de c++.
Je te recommande un formattage de la donnée avec quelque
chose du style :
il suffit alors d'afficher en trois partie, le modulo, la virgule
et le reste !
Lupin
c'est toi qui voit, toutefois comme tu as dis, l'instruction [printf() ] ne fait partie partie des instructions standards de c++.
Je te recommande un formattage de la donnée avec quelque
chose du style :
#include <iostream.h> #include <iomanip.h> int main() { double x = 100.453627; cout << setiosflags( ios::fixed | ios::showpoint ); for ( int loop = 0; loop <= 5; ++loop ) cout << setprecision( loop ) << "Arrondi \205 " << loop << " symbole(s) qui donne " << x << endl; return 0; } // setprecision défini la largeur de l'arrondi // Arondi à 0 symbole(s) qui donne 100. // Arondi à 0 symbole(s) qui donne 100.5 // Arondi à 0 symbole(s) qui donne 100.45 // Arondi à 0 symbole(s) qui donne 100.454 // Arondi à 0 symbole(s) qui donne 100.4536 // Arondi à 0 symbole(s) qui donne 100.45363
il suffit alors d'afficher en trois partie, le modulo, la virgule
et le reste !
Lupin
Salut,
Je ne pense pas que ça soit la peine, en farfouillant dans iostream, on arrive à une class locale qui semble servir pour cout.
Par contre, je n'ai pas compris comment l'utiliser. Et rien trouver sur le net.
Je ne pense pas que ça soit la peine, en farfouillant dans iostream, on arrive à une class locale qui semble servir pour cout.
Par contre, je n'ai pas compris comment l'utiliser. Et rien trouver sur le net.
Bonjour Char Sniper,
tel que dit au tout début, je n'ai que des bases, je ne code pas
régulièrement ... alors je ne voudrais pas nuire à tes recherches
disons simplement que le sujet m'intéresse.
ceci dit, j'aimerais savoir cette donnée vient de ou !
est-ce une variable pure, est-elle dans une classe, une structure ???
si elle est dans une classe, il n'y a aucun problème à créer une fonction ami "friends" avec ostream.
et effectivement dans la librairie iostream, tu trouveras tout le formattage de données.
ex.:
bah, mon exemple ne me semble pas "élégant" mais enfin !
Lupin
tel que dit au tout début, je n'ai que des bases, je ne code pas
régulièrement ... alors je ne voudrais pas nuire à tes recherches
disons simplement que le sujet m'intéresse.
ceci dit, j'aimerais savoir cette donnée vient de ou !
est-ce une variable pure, est-elle dans une classe, une structure ???
si elle est dans une classe, il n'y a aucun problème à créer une fonction ami "friends" avec ostream.
et effectivement dans la librairie iostream, tu trouveras tout le formattage de données.
ex.:
#include <iostream> #include <iomanip> using namespace std; int main() { double x = 100.453627; cout << (static_cast<int>(x)) << ',' << setprecision(0) << static_cast<int>((x - (static_cast<int>(x)))*1000) << endl; return 0; }
bah, mon exemple ne me semble pas "élégant" mais enfin !
Lupin
Salut.
Oui, c'est une bonne solution.
Un copain m'as dit sinon, de faire une class dérivé de cout qui pourrai alors surchargé l'operateur '<<'
J'ai trouvé une class 'locale' dans 'localefwd.h' mais ça al 'air assez compliquer à utilisé. J'ai trouver quelques exemple peu clair en tapant 'man use_facet' etc.. (fonctions contenues dans le .h) sur internet.
Mes données à afficher sont des double. L'intéret c'est de pouvoir ensuite importer directement les données sur Exel sans avoir à faire un changement de caractère qui est assez long.
Oui, c'est une bonne solution.
Un copain m'as dit sinon, de faire une class dérivé de cout qui pourrai alors surchargé l'operateur '<<'
J'ai trouvé une class 'locale' dans 'localefwd.h' mais ça al 'air assez compliquer à utilisé. J'ai trouver quelques exemple peu clair en tapant 'man use_facet' etc.. (fonctions contenues dans le .h) sur internet.
Mes données à afficher sont des double. L'intéret c'est de pouvoir ensuite importer directement les données sur Exel sans avoir à faire un changement de caractère qui est assez long.
re :
c'est ce que je te proposait en premier lieu. C'est à mon avis
ce qu'il y a de plus élégant. Ceci dit, je ne sais toujours pas
d'ou vient ta donnée.
Pour fabriquer une classe dérivé, il te faudra une certaine
structure. Là j'ai pas de temps, mais ce soir je pourrai te
donner un exemple assez clair !
Lupin
c'est ce que je te proposait en premier lieu. C'est à mon avis
ce qu'il y a de plus élégant. Ceci dit, je ne sais toujours pas
d'ou vient ta donnée.
Pour fabriquer une classe dérivé, il te faudra une certaine
structure. Là j'ai pas de temps, mais ce soir je pourrai te
donner un exemple assez clair !
Lupin
re :
alors voilà, j'ai refais mes devoirs et j'ai eu besoin de mes notes !
La classe dérivé :
et le fichier cpp de démonstration :
bon, j'ai laissé tous les [ cout ] de déboggage !
à cause des constructeurs, je trouve cela une bonne
pratique de les conserver tant que la classe est en
changement. Ceci dit tu peux y inclure tout ce que
tu souhaite comme donnée :-)
J'ai bien aimé l'exercice :-)
@+
Lupin
alors voilà, j'ai refais mes devoirs et j'ai eu besoin de mes notes !
La classe dérivé :
//********************************************************** // Fichier CaracFr.H (Lupin) // // Déclaration de la classe (modèle) CaracFranc // // Directives de précompilation qui empêchent de multiples // inclusion du fichier d'en-tête #ifndef CaracFranc_H #define CaracFranc_H #include <iostream> #include <iomanip> using std::ostream; using std::cout; using std::endl; using std::setprecision; const int tailleMax = 100; // Définition du type de données abstrait CaracFranc // LuPin Type : Type standard (structure) + // Type membres fonctions (méthode et propriété) class CaracFranc { // membre internes et publics ( les fonctions membres ) public: // Constructeur par défault (initialisation) CaracFranc(); // Constructeur #2 CaracFranc( double ); // serieEntiers surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const CaracFranc & ); // membre internes ( les données :-) ) private: // Structure Type Tableau d'entiers prédéfini double maVariable; }; CaracFranc::CaracFranc() // Initialisation de la variable = 0 { maVariable=0; cout << "Premier constructeur en action ! ->" << endl; }; CaracFranc::CaracFranc( double MaVar ) // Initialisation de la variable = 0 { maVariable=MaVar; cout << "Constructeur #2 en action ! ->" << endl; }; ostream &operator<< (ostream &flux , const CaracFranc &Ptr) { //lupin double UneVarDbl = Ptr.maVariable; flux << (static_cast<int>(UneVarDbl)) << ',' << setprecision(0) << static_cast<int>((UneVarDbl - (static_cast<int>(UneVarDbl)))*1000); //lupin return flux; }; #endif // Fin de fichier (Classe définie :-))
et le fichier cpp de démonstration :
//********************************************************************************** // Fichier CaracFr.cpp (Lupin) // // Démonstration de la classe #include "CaracFr.h" using std::cout; void main (void) { CaracFranc x,y(12.234),z(345.78); cout << "Ouverture du Programme" << endl; cout << x << endl << y << endl << z << endl; cout << "Fermeture du Programme" << endl; };
bon, j'ai laissé tous les [ cout ] de déboggage !
à cause des constructeurs, je trouve cela une bonne
pratique de les conserver tant que la classe est en
changement. Ceci dit tu peux y inclure tout ce que
tu souhaite comme donnée :-)
J'ai bien aimé l'exercice :-)
@+
Lupin
suite :
je me suis amusé !
voilà, j'ai fait une version "tableau de double" puisque tu as parlé d'excel !
la classe derivé !
le fichier de démonstration :
c'est pourquoi il faut connaitre le type de données à traiter :-)
Lupin
je me suis amusé !
voilà, j'ai fait une version "tableau de double" puisque tu as parlé d'excel !
la classe derivé !
//********************************************************** // Fichier CaracFr.H // // Déclaration de la classe (modèle) CaracFranc // // Les fonctions membres sont définies dans CaracFranc.cpp // // Directives de précompilation qui empêchent de multiples // inclusion du fichier d'en-tête #ifndef CaracFranc_H #define CaracFranc_H #include <iostream> #include <iomanip> using std::ostream; using std::cout; using std::endl; using std::ios; using std::setiosflags; using std::setprecision; const int tailleMax = 100; // Définition du type de données abstrait CaracFranc // LuPin Type : Type standard (structure) + // Type membres fonctions (méthode et propriété) class CaracFranc { // membre internes et publics ( les fonctions membres ) public: // Constructeur par défault (initialisation) CaracFranc(); // Constructeur #2 CaracFranc( double [] ); // serieEntiers surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const CaracFranc & ); // membre internes ( les données :-) ) private: // Structure Type Tableau d'entiers prédéfini double maVariable[tailleMax]; }; CaracFranc::CaracFranc() // Initialisation de la variable = 0 { memset(maVariable,0,sizeof(double)*tailleMax); cout << "Premier constructeur en action ! ->" << endl; }; CaracFranc::CaracFranc( double copie[] ) { for ( int i = 0 ; i < tailleMax ; i++ ) { maVariable[i] = copie[i]; }; cout << "Constructeur #2 en action ! ->" << endl; }; ostream &operator<< (ostream &flux , const CaracFranc &Ptr) { //lupin for ( int j = 0 ; j < (tailleMax/5) ; j++ ) { for ( int k = 0 ; k < (tailleMax/20) ; k++ ) { double UneVarDbl = Ptr.maVariable[j*k]; flux << (static_cast<int>(UneVarDbl)) << ',' << setiosflags ( ios::fixed | ios::showpoint ) << setprecision(0) << static_cast<int>((UneVarDbl - (static_cast<int>(UneVarDbl)))*1000); if ( k != ((tailleMax/20)-1) ) { flux << " - "; }; } flux << endl; } flux << endl; //lupin return flux; }; #endif // Fin de fichier (Classe définie :-))
le fichier de démonstration :
//*************************************************** // Fichier CaracFr.cpp // // Démonstration de la classe #include "CaracFr.h" using std::cout; void main (void) { double Boite[tailleMax]; CaracFranc x; cout << "Ouverture du Programme" << endl; for ( int a = 0 ; a < tailleMax ; a++ ) { Boite[a] = a * 3.14159; }; CaracFranc y(Boite); cout << x << y ; cout << "Fermeture du Programme" << endl; };
c'est pourquoi il faut connaitre le type de données à traiter :-)
Lupin
salut.
Beau travail !!! Je ne l'ai pas tester, mais ça me semble très bien. Merci !
Par contre, l'idée de mon copain, c'était de définir une class comme ça :
class cout2: public std::cout{template<typename T>friend cout2 operator(cout2& ,T);//reste de la class necessaire}
et ensuite, pour afficher en français, il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
pour afficher :
Beau travail !!! Je ne l'ai pas tester, mais ça me semble très bien. Merci !
Par contre, l'idée de mon copain, c'était de définir une class comme ça :
class cout2: public std::cout{template<typename T>friend cout2 operator(cout2& ,T);//reste de la class necessaire}
et ensuite, pour afficher en français, il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
pour afficher :
1,2 3 faux
re :
j'ai regardé un peu ta suggestion, malheureusement je n'ai
jamais vu cela, comme dit j'ai des connaissances de base.
la première classe devrait faire l'affaire si tu peux l'adapter.
ensuite une simple boucle sur le type :
debut
double valeur = pi ;
caracfranc nomvar=0;
for ( boucle = 0 ; boucle < taillemax ; boucle++ )
{
nomvar(valeur * boucle);
cout << (nomvar);
}
Lupin
j'ai regardé un peu ta suggestion, malheureusement je n'ai
jamais vu cela, comme dit j'ai des connaissances de base.
la première classe devrait faire l'affaire si tu peux l'adapter.
ensuite une simple boucle sur le type :
debut
double valeur = pi ;
caracfranc nomvar=0;
for ( boucle = 0 ; boucle < taillemax ; boucle++ )
{
nomvar(valeur * boucle);
cout << (nomvar);
}
Lupin
si le second constructeur ne suffit pas pour réalloué il suffit
d'implanter une fonction d'insertion :
bon je place tout le code la classe !
citation :
il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
il suffit alors de faire :
caracfr a(1.2);int b=3;bool d=false;
cout <<a<<b<<d;
ou encore :
caracfr a ; int b=3 ; bool d=false;
a.inseredonnee(1.2);
cout <<a<<b<<d;
Lupin
d'implanter une fonction d'insertion :
bon je place tout le code la classe !
class caracfranc { // membres internes, protégés et publics ( les fonctions membres ) public: // Constructeur par défault (initialisation) caracfranc(); // Constructeur #2 caracfranc( double ); inseredonnee( double ); // caracfranc surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const caracfranc & ); // membres internes ( les données :-) ) private: // Structure de Type "double" prédéfini double mavariable; }; caracfranc::caracfranc() // Initialisation de la variable = 0 { mavariable = 0; cout << "Premier constructeur en action ! ->" << endl; }; caracfranc::caracfranc( double copie ) { mavariable = copie; cout << "Constructeur #2 en action ! ->" << endl; }; caracfranc::inseredonnee( double donnee ) { mavariable = donnee; }; ostream &operator<< (ostream &flux , const caracfranc &Ptr) { //lupin double unevardbl = Ptr.mavariable; flux << (static_cast<int>(unevardbl)) << ',' << setiosflags ( ios::fixed | ios::showpoint ) << setprecision(0) << static_cast<int>((unevardbl - (static_cast<int>(unevardbl)))*1000); //lupin return flux; };
citation :
il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
il suffit alors de faire :
caracfr a(1.2);int b=3;bool d=false;
cout <<a<<b<<d;
ou encore :
caracfr a ; int b=3 ; bool d=false;
a.inseredonnee(1.2);
cout <<a<<b<<d;
Lupin
Salut.
J'ai parfaitement compris ce que tu fesai, merci.
En revanche, tu devrai t'intérésser à l'autre (cout2) Car c'est de l'héritage de class, notion primordiale dans la programmation objet.
J'ai parfaitement compris ce que tu fesai, merci.
En revanche, tu devrai t'intérésser à l'autre (cout2) Car c'est de l'héritage de class, notion primordiale dans la programmation objet.
re:
oui, tu as certes de bons conseils, en fait je suis "arrêté" au
polymorphisme, je ne sais trop pourquoi, ces 3 concepts mon
été présenté dans un ordre différent du bouquin .
class-polymorphisme-héritage, j'en suis au second !
mon bouquin les présentes plutôt ainsi :
class-héritage-polymorphisme
@+
Lupin
oui, tu as certes de bons conseils, en fait je suis "arrêté" au
polymorphisme, je ne sais trop pourquoi, ces 3 concepts mon
été présenté dans un ordre différent du bouquin .
class-polymorphisme-héritage, j'en suis au second !
mon bouquin les présentes plutôt ainsi :
class-héritage-polymorphisme
@+
Lupin