Newsgroup: it.comp.lang.c++
Titolo: Locale

Ciao a tutti.
Esiste una modo, usando le librerie standard del C++, di ottenere il 
locale corrente?
Devo leggere una data memorizzata in un file di testo e mi serve il 
locale della macchina per poter memorizzare correttamente la data in 
un'apposita struttura.
Grazie.


Non direttamente, pero' di default la locale globale e' quella
ritornata da std::locale::classic(), altrimenti l'hai impostata tu e
sai qual'e'. Nella peggiore delle ipotesi puoi fare qualcosa come
std::locale l = std::locale::global(std::locale::classic());
std::string nome = 
l.name
();
std::locale::global(l);
Ciao,
Nicola

 ritornata da std::locale::classic()
sei sicuro?  a memoria, ritorna il locale "C" che e' garantito
esistere comunque.  in genere, per avere il locale scrivo qualcosa
come:
  std::locale l;
  try {
    l = std::locale("");  // lancia una eccezione se l'utente non
                          // ha esplicitamente settato un locale
  } catch (std::exception & e) {
                          // in questo caso si usa il C...
    std::cerr << "*** EXCEPTION - " << e.what() << " - C locale assumed\n";
    l = std::locale::classic();
  }
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

   }
Non sono sicuro che questo sia portabile.
Ciao,
Nicola


In realta' dovrebbe bastare qualcosa come
std::locale().name()
Ciao,
Nicola

 std::locale().name()
Mh, mi sa che ha ragione Maurizio.
In effetti questa invocazione restituisce "C", che non e` certo il 
locale della macchina, ma un locale inizializzato dal linguaggio, credo.
A dire il vero, fino a questo punto ero arrivato pure io, mi manca il 
passo successivo: ottenere il locale di macchina (per poi eventualmente 
impostarlo a manina facendo un imbue() ). Mi sa, pero` che non ce la 
faccio con le librerie standard, vero? Ho idea che dovro` usare librerie 
specifiche di sistema...
Che dite?

 installata globalmente di default.
ecco del toycode funzionante:
$ uname -a
Linux 
mlinux.pd.infn.it
 2.4.21-37.ELsmp #1 SMP Wed Sep 28 12:13:44 CDT 2005 i686 GNU/Linux
$ printenv | grep LC
$ g++ --version
g++ (GCC) 4.1.1
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat foo.cxx
#include <ctime>
#include <iostream>
#include <locale>
#include <stdexcept>
#include <sstream>
using namespace std;
int main() {
  time_t     now = time(0);
  struct tm *ptm = localtime(&now);
  locale l;
  try {
    l = locale("");
  } catch (const exception & e) {
    cerr << "*** EXCEPTION - " << e.what() << " - C locale assumed\n";
    l = locale::classic();
  }
  ostringstream s;
  s.imbue(l);
  const char fmt[]  = "%c";
  const char * const fmtEnd = fmt + sizeof(fmt);
  use_facet< time_put<char> >(l).put(
    ostreambuf_iterator<char>(s), s, s.fill(), ptm, fmt, fmtEnd);
  cout << s.str() << endl;
}
$ g++ -std=c++98 -pedantic -W -Wall -o foo foo.cxx
$ ./foo
Mon Jun 12 08:46:07 2006
$ LC_TIME=it_IT ./foo
lun 12 giu 2006 08:46:21 CEST
$ LC_TIME=ru_RU ./foo
Пнд 12 Июн 2006 08:46:33
$ LC_TIME=de_DE ./foo
Mo 12 Jun 2006 08:46:51 CEST
$ LC_TIME=invalid ./foo
*** EXCEPTION - locale::facet::_S_create_c_locale name not valid - C locale assumed
Mon Jun 12 08:47:17 2006
$
