2013-03-05 24 views
8

Mi piacerebbe leggere e scrivere pi come 3,141592 anziché 3.141592, in quanto l'utilizzo della virgola è comune in molti paesi europei. Come posso realizzare questo con iostream s? In altre paroleCome posso impostare il separatore decimale come una virgola?

cout << 3.141592; 

dovrebbe stampare

3,141592 

sullo standard output.

+0

Intendi, nel codice? Come 'double x = 3,14;'? –

+0

No in uscita standard, input, lettura e scrittura di file in fase di esecuzione (non in fase di compilazione). –

+6

una parola: locales. – PlasmaHH

risposta

14

È necessario utilizzare basic_ios::imbue per impostare le impostazioni locali preferite.

dare uno sguardo qui: http://www.cplusplus.com/reference/ios/ios_base/imbue/

versioni locali consentono di utilizzare il modo preferito dall'utente, per cui se un computer in Italia utilizza virgola per cifre decimali separate, negli Stati Uniti, il punto è ancora usato. Usare locali è una buona pratica.

Ma se si vuole forzare esplicitamente l'uso della virgola, date un'occhiata qui: http://www.cplusplus.com/reference/locale/numpunct/decimal_point/

Ecco un piccolo esempio che ho appena fatto con g ++ che rafforza il carattere '' (passando il separatore come modello argomento è solo per divertimento, non è davvero necessario)

#include <iostream> 
#include <locale> 

template <class charT, charT sep> 
class punct_facet: public std::numpunct<charT> { 
protected: 
    charT do_decimal_point() const { return sep; } 
}; 

int main(int argc, char **argv) { 
    std::cout.imbue(std::locale(std::cout.getloc(), new punct_facet<char, ','>)); 
    std::cout << "My age is " << 3.1415 << " lightyears.\n"; 
} 

noti che usare cout.getloc() sto override solo un singolo aspetto nel locale attualmente impostato, cioè, nelle impostazioni correnti di localizzazione cout, sto cambiando solo come è fatta la punteggiatura.

do_decimal_point è una funzione virtuale di std::numpunct che è possibile ridefinire per fornire il separatore personalizzato. Questa funzione virtuale verrà utilizzata da numpunct::decimal_point quando si stampa il proprio numero.

9

Come ha detto @AkiRoss, è necessario utilizzare le impostazioni locali. In generale, in qualsiasi programma si scrive, una delle prime azioni in main dovrebbe essere quello di impostare il locale globale per la scelta degli utenti, facendo qualcosa come:

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

Questo dovrebbe essere sistematico , nel ogni programma che interagisce con con un utente umano. Tutti i file aperti dopo questo saranno automaticamente impregnati con le impostazioni internazionali corrette.

In alternativa, è possibile specificare in modo esplicito il locale che si desidera uso:

std::locale::global(std::locale(locale_name)); 

Il problema di questo è che non esiste uno standard per il locale nomi. Qualcosa come "it_IT.UTF-8" corrisponde allo standard Posix e viene utilizzato su Internet; Windows ha tradizionalmente utilizzato un formato diverso (anche se Windows recente sembra che accetti anche questo formato).

che lascia std::cin, std::cout e std::cerr.Questi sono aperti prima di inserire main e quindi devono essere imbevuti della nuova locale . (Per ottenere una copia della corrente locale globale, utilizzare il costruttore di default di std::locale.)

Infine, se si sta aprendo tutti i file binari, essere consapevoli del fatto che essi anche saranno impregnati con il locale globale. Quale può fare la traduzione di codice . In tali casi, dovresti renderli esplicitamente con std::locale::classic() oppure creare una nuova locale unendo la faccetta di std::locale::classic() con le altre faccette delle impostazioni internazionali globali. (std::locale ha funzioni speciali e costruttori per questo.)

Problemi correlati