PDA

View Full Version : C++: Settare il locale globale una volta per tutte


verloc
23-04-2003, 09:03
per uno stream lo so fare:

...
cout.imbue(std::locale(""));
...
Così si puo usare la virgola come sep decimale...

ma vorrei sapere come si setta la proprietà global (one-shoot) .
perchè non capisco la sintassi da adoperare.

Esempiuccio please :)

verloc
24-04-2003, 07:13
Scusate se uppo,mi serve davvero. :)

cionci
24-04-2003, 09:13
E' questo per caso ?

std::locale::global(const locale& x);

Se è questo mi faresti un esempio di utilizzo di queste cose ?

verloc
24-04-2003, 15:53
Originally posted by "cionci"

E' questo per caso ?

std::locale::global(const locale& x);

Se è questo mi faresti un esempio di utilizzo di queste cose ?

Si,il metodo è quello:
non capivo come fare la chiamata che a questo punto dovrebbe (correggimi se sbaglio) essere questa

std::locale::global(std::locale(""));


Il più importante è quello che ti consente di leggere nella locale nativo un input stream (sopratutto ifstream e stringstream).

Esempio: leggere un double da file in italiano considerando la virgola come separatore decimale e il punto come separatore di migliaia.


Sembra che molti programmatori italiani abbiano l'inclinazione ad usare il punto anche quando l'applicazione è specificamente rivolta ad italiani.
Cosicchè se come è normale, tu hai in windows\impostazioni internazionali la virgola,il programma si rincogl****sce come minimo.


Oppure come fa un programma ingegneristico (800 euro) che conosco
che ti avverte di cambiare le impostazioni internazionali se no non si avvia il programma :rolleyes: :mad: (perchè il fesso ha comprato un componente che fa schifo ;) )

invece il metodo di cui parliamo prende automaticamente l'impostazione dalla variabile globale (separatore) e le altre ,in base a cosa hai settato nel SO.

Ora normalmente lo iostream viene inizializzato con il locale standard "C"
che usa il punto.Il mio intento è settare il locale nativo all'inizio del programma. ;)

Spero cionci di essere stato chiaro :)

provo a vedere se la chiamata funziona :D

PS Ti pare che uno debba spendere 800 euro per un programma fatto in questo modo? :muro:

cionci
24-04-2003, 16:32
Concordo ed è persino molto utile ;)

verloc
25-04-2003, 10:23
Piccolo inconveniente:
se setti solamente il locale globale e poi usi normalmente uno stream:crasha.

Questo è dovuto al fatto che allo startup gli stream vengono inizializzati con il default locale "C" (Inglese Americano ASCI);quindi comunque
bisogna risettarli al locale scelto con

cout.imbue(std::locale("")); (setta il locale del SO)

oppure se vuoi l'italiano:

cout.imbue(std::locale("Italian_Italy.850"));

molto utile a runtime la proprietà name per settare ad esempio
al volo una stringa messaggio nella lingua scelta. :)


Mi sembra sia tutto.

Grazie Cionci per essere stato a sentirmi ed avermi aiutato ;)

cionci
25-04-2003, 10:37
Bene è molto interessante...

la vecchia libreria C aveva setlocale...magari quella puoi aiutarti a settare il locale di default anche per gli stream...