Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
exemple :
int main(void)
{
int a = 1000000;
//fonction pour faire afficher 1 000 000
cout << a << endl;
return 0;
}
Si vous savez répondre à la même question en C je suis preneur aussi.
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
exemple :
int main(void)
{
int a = 1000000;
//fonction pour faire afficher 1 000 000
cout << a << endl;
return 0;
}
Si vous savez répondre à la même question en C je suis preneur aussi.
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
exemple :
int main(void)
{
int a = 1000000;
//fonction pour faire afficher 1 000 000
cout << a << endl;
return 0;
}
Si vous savez répondre à la même question en C je suis preneur aussi.
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
Si vous savez répondre à la même question en C je suis preneur aussi.
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
Si vous savez répondre à la même question en C je suis preneur aussi.
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
Si vous savez répondre à la même question en C je suis preneur aussi.
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin de
les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
exemple :
int main(void)
{
int a = 1000000;
//fonction pour faire afficher 1 000 000
cout << a << endl;
return 0;
}
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin de
les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
exemple :
int main(void)
{
int a = 1000000;
//fonction pour faire afficher 1 000 000
cout << a << endl;
return 0;
}
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin de
les rendre plus lisibles. J'ai regardé du coté de setf et setw sans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
exemple :
int main(void)
{
int a = 1000000;
//fonction pour faire afficher 1 000 000
cout << a << endl;
return 0;
}
KooK wrote on 04/07/2006 16:40:Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw s ans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
pourquoi pas:
ostream& format3(ostream& out, long value)
{
if (value < 1000)
out << value;
else {
register int digit = (int) log10(value);
int divider = (long) pow(10.0, digit - (digit % 3));
long temp = (value / divider) % 1000;
char buff[5];
sprintf(buff, "%i", temp);
out << buff;
for (divider /= 1000; divider > 0; divider /= 1000){
temp = (value / divider) % 1000;
sprintf(buff, " %.03i", temp);
out << buff;
}
}
return out;
}Si vous savez répondre à la même question en C je suis preneur au ssi.
ça doit marcher aussi.
KooK wrote on 04/07/2006 16:40:
Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw s ans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
pourquoi pas:
ostream& format3(ostream& out, long value)
{
if (value < 1000)
out << value;
else {
register int digit = (int) log10(value);
int divider = (long) pow(10.0, digit - (digit % 3));
long temp = (value / divider) % 1000;
char buff[5];
sprintf(buff, "%i", temp);
out << buff;
for (divider /= 1000; divider > 0; divider /= 1000){
temp = (value / divider) % 1000;
sprintf(buff, " %.03i", temp);
out << buff;
}
}
return out;
}
Si vous savez répondre à la même question en C je suis preneur au ssi.
ça doit marcher aussi.
KooK wrote on 04/07/2006 16:40:Bonjour,
Je voudrais écrire les nombres avec un espace tous les 3 chiffres afin
de les rendre plus lisibles. J'ai regardé du coté de setf et setw s ans
succès. Suis-je passé à côté ? Quel fonction utiliser ?
pourquoi pas:
ostream& format3(ostream& out, long value)
{
if (value < 1000)
out << value;
else {
register int digit = (int) log10(value);
int divider = (long) pow(10.0, digit - (digit % 3));
long temp = (value / divider) % 1000;
char buff[5];
sprintf(buff, "%i", temp);
out << buff;
for (divider /= 1000; divider > 0; divider /= 1000){
temp = (value / divider) % 1000;
sprintf(buff, " %.03i", temp);
out << buff;
}
}
return out;
}Si vous savez répondre à la même question en C je suis preneur au ssi.
ça doit marcher aussi.
Pourquoi faire simple quand on peut faire compliqué, n'est-ce
pas ? Pour le C++, Arnaud a donné la bonne réponse.
Pourquoi faire simple quand on peut faire compliqué, n'est-ce
pas ? Pour le C++, Arnaud a donné la bonne réponse.
Pourquoi faire simple quand on peut faire compliqué, n'est-ce
pas ? Pour le C++, Arnaud a donné la bonne réponse.
Le fait que la locale appelle delete sur punct dans son destructeur, je
l'observe bien dans mon implémentation (VC2005), mais je n'ai pas
réussi à trouver de documentation "officielle" (ni dans le Josuttis,
ni dans la norme) qui spécifie clairement que c'est un comportement
normal, et comme je trouve que c'est une API un peu bizarre, je me
demande s'il n'y a pas un loup...
Ceci-dit, toute l'API des locale est "bizarre" ;-) Si quelqu'un a une
explication claire sur les règles de gestion des durées de vie des
facets par rapport aux locales, je suis preneur....
Le fait que la locale appelle delete sur punct dans son destructeur, je
l'observe bien dans mon implémentation (VC2005), mais je n'ai pas
réussi à trouver de documentation "officielle" (ni dans le Josuttis,
ni dans la norme) qui spécifie clairement que c'est un comportement
normal, et comme je trouve que c'est une API un peu bizarre, je me
demande s'il n'y a pas un loup...
Ceci-dit, toute l'API des locale est "bizarre" ;-) Si quelqu'un a une
explication claire sur les règles de gestion des durées de vie des
facets par rapport aux locales, je suis preneur....
Le fait que la locale appelle delete sur punct dans son destructeur, je
l'observe bien dans mon implémentation (VC2005), mais je n'ai pas
réussi à trouver de documentation "officielle" (ni dans le Josuttis,
ni dans la norme) qui spécifie clairement que c'est un comportement
normal, et comme je trouve que c'est une API un peu bizarre, je me
demande s'il n'y a pas un loup...
Ceci-dit, toute l'API des locale est "bizarre" ;-) Si quelqu'un a une
explication claire sur les règles de gestion des durées de vie des
facets par rapport aux locales, je suis preneur....
Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?
Pour le C++, Arnaud a donné la bonne réponse. En C, c'est
moins évident,
mais dans les deux cas, la première chose à
faire, c'est de voir s'il n'y a pas un locale tout fait
Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?
Pour le C++, Arnaud a donné la bonne réponse. En C, c'est
moins évident,
mais dans les deux cas, la première chose à
faire, c'est de voir s'il n'y a pas un locale tout fait
Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?
Pour le C++, Arnaud a donné la bonne réponse. En C, c'est
moins évident,
mais dans les deux cas, la première chose à
faire, c'est de voir s'il n'y a pas un locale tout fait
mais dans les deux cas, la première chose à
faire, c'est de voir s'il n'y a pas un locale tout fait
tout fait ou pas, mon locale à moi ((c) 1995 by P.J. Plauger, du Platform
SDK Microsoft 2005) ne contient aucun constructeur avec le prototype (??,
numpunct<?>*); je mets un "??" pour le "std::cout.getLoc()" car je n'ai
pas trouvé de std::cout non plus.
mais dans les deux cas, la première chose à
faire, c'est de voir s'il n'y a pas un locale tout fait
tout fait ou pas, mon locale à moi ((c) 1995 by P.J. Plauger, du Platform
SDK Microsoft 2005) ne contient aucun constructeur avec le prototype (??,
numpunct<?>*); je mets un "??" pour le "std::cout.getLoc()" car je n'ai
pas trouvé de std::cout non plus.
mais dans les deux cas, la première chose à
faire, c'est de voir s'il n'y a pas un locale tout fait
tout fait ou pas, mon locale à moi ((c) 1995 by P.J. Plauger, du Platform
SDK Microsoft 2005) ne contient aucun constructeur avec le prototype (??,
numpunct<?>*); je mets un "??" pour le "std::cout.getLoc()" car je n'ai
pas trouvé de std::cout non plus.
Pourquoi faire simple quand on peut faire compliqué,
n'est-ce pas ? Pour le C++, Arnaud a donné la bonne réponse.
J'ai un petit doute sur la réponse que j'ai donné magré tout :
int main()
{
MyNumPunct* punct=new MyNumPunct(); //will be destroyed by the
locale
destructor
//create a new locale based on cout, but using our specific numpunct
std::locale loc(std::cout.getloc (), punct);
....
Le fait que la locale appelle delete sur punct dans son
destructeur, je l'observe bien dans mon implémentation
(VC2005), mais je n'ai pas réussi à trouver de documentation
"officielle" (ni dans le Josuttis, ni dans la norme) qui
spécifie clairement que c'est un comportement normal, et comme
je trouve que c'est une API un peu bizarre, je me demande s'il
n'y a pas un loup...
Ceci-dit, toute l'API des locale est "bizarre" ;-)
Si quelqu'un a une explication claire sur les règles de
gestion des durées de vie des facets par rapport aux locales,
je suis preneur....
Pourquoi faire simple quand on peut faire compliqué,
n'est-ce pas ? Pour le C++, Arnaud a donné la bonne réponse.
J'ai un petit doute sur la réponse que j'ai donné magré tout :
int main()
{
MyNumPunct* punct=new MyNumPunct(); //will be destroyed by the
locale
destructor
//create a new locale based on cout, but using our specific numpunct
std::locale loc(std::cout.getloc (), punct);
....
Le fait que la locale appelle delete sur punct dans son
destructeur, je l'observe bien dans mon implémentation
(VC2005), mais je n'ai pas réussi à trouver de documentation
"officielle" (ni dans le Josuttis, ni dans la norme) qui
spécifie clairement que c'est un comportement normal, et comme
je trouve que c'est une API un peu bizarre, je me demande s'il
n'y a pas un loup...
Ceci-dit, toute l'API des locale est "bizarre" ;-)
Si quelqu'un a une explication claire sur les règles de
gestion des durées de vie des facets par rapport aux locales,
je suis preneur....
Pourquoi faire simple quand on peut faire compliqué,
n'est-ce pas ? Pour le C++, Arnaud a donné la bonne réponse.
J'ai un petit doute sur la réponse que j'ai donné magré tout :
int main()
{
MyNumPunct* punct=new MyNumPunct(); //will be destroyed by the
locale
destructor
//create a new locale based on cout, but using our specific numpunct
std::locale loc(std::cout.getloc (), punct);
....
Le fait que la locale appelle delete sur punct dans son
destructeur, je l'observe bien dans mon implémentation
(VC2005), mais je n'ai pas réussi à trouver de documentation
"officielle" (ni dans le Josuttis, ni dans la norme) qui
spécifie clairement que c'est un comportement normal, et comme
je trouve que c'est une API un peu bizarre, je me demande s'il
n'y a pas un loup...
Ceci-dit, toute l'API des locale est "bizarre" ;-)
Si quelqu'un a une explication claire sur les règles de
gestion des durées de vie des facets par rapport aux locales,
je suis preneur....
kanze wrote on 05/07/2006 10:29:Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?
tu as raison, j'aurais du écrire:
ostream& format3(ostream& out, long value){
register int digit = (int) log10(value);
long divider = (long) pow(10.0, digit - (digit % 3));
out << ((value / divider) % 1000);
for (divider /= 1000; divider > 0; divider /= 1000){
char buff[5];
sprintf(buff, " %.03i", (value / divider) % 1000);
out << buff;
}
return out;
}
(je laisse le "if (value<0){ out <<'-'; value = -value; }" à
la discrétion du lecteur).Pour le C++, Arnaud a donné la bonne réponse. En C, c'est
moins évident,
en C++ comme en C, qu'est-ce que ostream et string peuvent utiliser
d'autre que sprintf ??
"ils" ont raison, coder un subset sur les mêmes bases est mal
? intéressant ...
une chose plus intéressante aurait été de préférer une
fonction retournant un std::string afin de l'utiliser dans un
chainage de << (tout en permettant le formatage à destination
d'un string (basic_string n'héritant pas de ostream) ou,
indirectement, d'un ostream).
mais dans les deux cas, la première chose à faire, c'est de
voir s'il n'y a pas un locale tout fait
tout fait ou pas, mon locale à moi ((c) 1995 by P.J. Plauger,
du Platform SDK Microsoft 2005) ne contient aucun constructeur
avec le prototype (??, numpunct<?>*); je mets un "??" pour le
"std::cout.getLoc()" car je n'ai pas trouvé de std::cout non
plus.
<hs> d'ailleurs je me demande si ce n'est pas un peu pour cela
que je préfère la complexité de mes fonctions de 8 lignes
dignes d'une première matinée d'initiation au C à la
simplicité des include ""opaques"" de la stl. </hs>
kanze wrote on 05/07/2006 10:29:
Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?
tu as raison, j'aurais du écrire:
ostream& format3(ostream& out, long value){
register int digit = (int) log10(value);
long divider = (long) pow(10.0, digit - (digit % 3));
out << ((value / divider) % 1000);
for (divider /= 1000; divider > 0; divider /= 1000){
char buff[5];
sprintf(buff, " %.03i", (value / divider) % 1000);
out << buff;
}
return out;
}
(je laisse le "if (value<0){ out <<'-'; value = -value; }" à
la discrétion du lecteur).
Pour le C++, Arnaud a donné la bonne réponse. En C, c'est
moins évident,
en C++ comme en C, qu'est-ce que ostream et string peuvent utiliser
d'autre que sprintf ??
"ils" ont raison, coder un subset sur les mêmes bases est mal
? intéressant ...
une chose plus intéressante aurait été de préférer une
fonction retournant un std::string afin de l'utiliser dans un
chainage de << (tout en permettant le formatage à destination
d'un string (basic_string n'héritant pas de ostream) ou,
indirectement, d'un ostream).
mais dans les deux cas, la première chose à faire, c'est de
voir s'il n'y a pas un locale tout fait
tout fait ou pas, mon locale à moi ((c) 1995 by P.J. Plauger,
du Platform SDK Microsoft 2005) ne contient aucun constructeur
avec le prototype (??, numpunct<?>*); je mets un "??" pour le
"std::cout.getLoc()" car je n'ai pas trouvé de std::cout non
plus.
<hs> d'ailleurs je me demande si ce n'est pas un peu pour cela
que je préfère la complexité de mes fonctions de 8 lignes
dignes d'une première matinée d'initiation au C à la
simplicité des include ""opaques"" de la stl. </hs>
kanze wrote on 05/07/2006 10:29:Pourquoi faire simple quand on peut faire compliqué, n'est-ce pas?
tu as raison, j'aurais du écrire:
ostream& format3(ostream& out, long value){
register int digit = (int) log10(value);
long divider = (long) pow(10.0, digit - (digit % 3));
out << ((value / divider) % 1000);
for (divider /= 1000; divider > 0; divider /= 1000){
char buff[5];
sprintf(buff, " %.03i", (value / divider) % 1000);
out << buff;
}
return out;
}
(je laisse le "if (value<0){ out <<'-'; value = -value; }" à
la discrétion du lecteur).Pour le C++, Arnaud a donné la bonne réponse. En C, c'est
moins évident,
en C++ comme en C, qu'est-ce que ostream et string peuvent utiliser
d'autre que sprintf ??
"ils" ont raison, coder un subset sur les mêmes bases est mal
? intéressant ...
une chose plus intéressante aurait été de préférer une
fonction retournant un std::string afin de l'utiliser dans un
chainage de << (tout en permettant le formatage à destination
d'un string (basic_string n'héritant pas de ostream) ou,
indirectement, d'un ostream).
mais dans les deux cas, la première chose à faire, c'est de
voir s'il n'y a pas un locale tout fait
tout fait ou pas, mon locale à moi ((c) 1995 by P.J. Plauger,
du Platform SDK Microsoft 2005) ne contient aucun constructeur
avec le prototype (??, numpunct<?>*); je mets un "??" pour le
"std::cout.getLoc()" car je n'ai pas trouvé de std::cout non
plus.
<hs> d'ailleurs je me demande si ce n'est pas un peu pour cela
que je préfère la complexité de mes fonctions de 8 lignes
dignes d'une première matinée d'initiation au C à la
simplicité des include ""opaques"" de la stl. </hs>