Newsgroup: it.comp.lang.c++
Titolo: Formattare i numeri

Ciao a tutti,
	esiste secondo voi un metodo standard per formattare i numeri, esempio 
all'italiana, con i punti che separano le migliaia e la virgola per i 
decimali?
Ho provato con il "locale", ma l'unica cosa che ottengo e' la virgola, 
forse non ho provato abbastanza...
Grazie
	 Stefano

Ma non stai parlando di Java?
Se si, guarda che qui sei su it.comp.lang.c++
--
Luigi
http://web.tiscali.it/luigi_web
byte...@hotmail.com
ICQ 46240443

 Se si, guarda che qui sei su it.comp.lang.c++
Perche' pensi che il C++ non abbia il supporto per i
locale ?
Ciao
Gaetano
--
#exclude <windows>
printf("\t\t\b\b\b\b\b\b");.
printf("\t\t\b\b\b\b\b\b");
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

locale ?
Non conosco qesto aspetto del C++ ma  mi sembra molto complicato, o
sbaglio?
-- 
Marco Barisione (ICQ 84277092)

 sbaglio?
Ho comprato il libro
"Standard C++ IOStream and Locales" 
e non ho avuto ancora il piacere di aprirlo.


 
No, non sbagli! :-)

 
No, sto parlando di C++, anche perche' non so programmare in java, non 
avendone un grande interesse...
Ciao Stefano

sbaglio?
Anche io lo conosco maluccio e non lo utilizzo. Ho anche
scoperto sulla mia pelle che si tratta di una di quelle
aree su cui i compilatori tendono ad avere problemi (o
almeno li ha VC++). Certamente non si tratta di un
argomento spinoso da affrontare.
A volte io sarei tentato di conquistare il mondo e
uniformare tutto all'inglese :))) (usando pero' il
sistema metrico invece di quelle misure anglosassoni
che trovo assurde). Della serie... perche' non
eliminare il problema alla radice ?
Andrea

 uniformare tutto all'inglese :))) 
Beh, io accetteri tranquillamente anche una qualisiasi altra lingua che si
possa scrivere da sinistra a destra usando esclusivamente caratteri ASCII,
il che però esclude tutte le lingue europee, tranne forse l'olandese.
Il giapponese in trascrizione romaji potrebbe essere un'opzione
interessante. :)
Max

 sbaglio?
 
non ho mai (per ora) 1letto nulla sull'argomento, ma dall'home-page di 
B.S. e` possibile scaricare l'appendice del suo libro che parla proprio 
dei locales.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 ha scritto nel messaggio
news:3C2D0FFB...@libero.it...

La cosa è fattibile senza troppe complicazioni.
Ti riporto la sintassi per la formattazione dei numeri, come riportato
nell'ultimo draft dello standard:
The syntax for number formats is as follows, where digit represents the radix
set specified by the
fmtflags argument value, whitespace is as determined by the facet ctype<charT>
(22.2.1.1), and
thousands-sep and decimal-point are the results of corresponding numpunct<charT>
members.
Integer values have the format:
    integer ::= [sign] units
    sign ::= plusminus [whitespace]
    plusminus ::= '+' | '­'
    units ::= digits [thousands-sep units]
    digits ::= digit [digits]
and floating-point values have:
    floatval ::= [sign] units [decimal-point [digits]] [e [sign] digits] |
                 [sign] decimal-point digits [e [sign] digits]
    e ::= 'e' | 'E'
where the number of digits between thousands-seps is as specified by
do_grouping(). For parsing,
if the digits portion contains no thousands-separators, no grouping constraint
is applied.
La sintassi per do_grouping è:
A basic_string<char> vec used as a vector of integer values, in which each
element vec[i]
represents the number of digits(*) in the group at position i, starting with
position 0 as
the rightmost group.
If vec.size() <= i, the number is the same as group (i­-1);
if ( i<0 || vec[i]<=0 || vec[i]==CHAR_MAX), the size of the digit group is
unlimited.
The base class implementation returns the empty string, indicating no grouping.
(*)Thus, the string "\003" specifies groups of 3 digits each, and "3" probably
   indicates groups of 51 (!) digits each.
Ecco un esempio pratico:
#include <iostream>
#include <locale>
class My_punct: public std::numpunct<char>
{
   public:
      typedef char char_type;
      typedef std::string string_type;
      // r == 0 significa che  il lifetime di questo oggetto viene controllato
      // dal locale
      explicit My_punct(size_t r = 0)
      : std::numpunct<char>(r) { }
   protected:
      char_type do_decimal_point() const
      {
         return ',';
      }
      char_type do_thousands_sep() const { return '.'; }
      string_type do_grouping() const { return "\003"; }
};
int main()
{
   std::locale loc(std::locale(), new My_punct);
   std::cout.imbue(loc);
   double x = 1234567.123456;
   std::cout << "x = " << std::setprecision(13) << x << '\n';
}

 
 >[...]
Grazie mille, adesso lo provo :-)
Ciao.
			Stefano