[C++] Utilisation <clocale> avec cout

Fermé
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 21 mars 2006 à 10:15
 Utilisateur anonyme - 8 avril 2006 à 17:06
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
A voir également:

17 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
27 mars 2006 à 16:29
personne ne sai?
Mettre un std::cout<<a; de façon à afficher en français.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
31 mars 2006 à 21:22
Personne ne sais au moins si c'est impossible ou pas?
0
tafiscobar Messages postés 1277 Date d'inscription jeudi 7 décembre 2000 Statut Contributeur Dernière intervention 26 février 2009 177
2 avril 2006 à 13:39
salut, j'avais oublié de poster, j'ai essayé mais j'ai eu le même résultat que toi. j'ai regardé un peu sur le net, mais j'ai rien trouvé et j'ai rien trouvé.
0
Utilisateur anonyme
2 avril 2006 à 15:40
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.

"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
0
Utilisateur anonyme
2 avril 2006 à 16:16
suite :

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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
2 avril 2006 à 19:23
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()...
0
Utilisateur anonyme
3 avril 2006 à 14:14
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 :

#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
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 avril 2006 à 21:56
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.
0
Utilisateur anonyme
4 avril 2006 à 02:41
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.:
#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
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
4 avril 2006 à 11:07
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.
0
Utilisateur anonyme
4 avril 2006 à 13:01
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
0
Utilisateur anonyme
5 avril 2006 à 02:52
re :

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
0
Utilisateur anonyme
5 avril 2006 à 04:46
suite :

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
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 avril 2006 à 12:33
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 :
1,2 3 faux
0
Utilisateur anonyme
7 avril 2006 à 00:57
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
0
Utilisateur anonyme
7 avril 2006 à 03:36
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 !
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
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
7 avril 2006 à 09:43
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.
0
Utilisateur anonyme
8 avril 2006 à 17:06
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
0