2011-01-18 11 views
7

Dato il seguente codice:Come si imposta la locale di cout per inserire virgole come separatori di migliaia?

cout << 1000; 

Vorrei il seguente output:

1,000 

Questo può essere fatto utilizzando std :: locale, e la funzione cout.imbue(), ma temo Potrei perdere un passaggio qui. Puoi individuarlo? Attualmente sto copiando le impostazioni locali correnti e aggiungendo un facet separatore di migliaia, ma la virgola non viene mai visualizzata nel mio output.

template<typename T> class ThousandsSeparator : public numpunct<T> { 
public: 
    ThousandsSeparator(T Separator) : m_Separator(Separator) {} 

protected: 
    T do_thousands_sep() const { 
     return m_Separator; 
    } 

private: 
    T m_Separator; 
} 

main() { 
    cout.imbue(locale(cout.getloc(), new ThousandsSeparator<char>(','))); 
    cout << 1000; 
} 
+0

Hai provato a compilare il codice esatto che vuoi farci credere che stai usando? –

+0

possibile duplicato di [Esiste una funzione built-in che separa una virgola un numero in C, C++ o JavaScript?] (Http://stackoverflow.com/questions/3479485/is-there-a-built-in- function-that-comma-separates-a-number-in-cc-or-javascri) –

+0

C'è un memleak? –

risposta

6

L'implementazione predefinita di do_thousands_sep restituisce già ','. Sembra che tu debba sostituire il do_grouping. do_grouping restituisce una stringa vuota per impostazione predefinita, il che significa nessun raggruppamento. Questo significa gruppi di tre cifre ciascuno:

string do_grouping() const 
{ 
    return "\03"; 
} 
+0

Che cosa rappresenta "\ 03"? Questo è ASCII per "fine del testo"? Se è così, perché? –

+1

@Cory: do_grouping restituisce una stringa che viene considerata come una matrice di numeri a un carattere che rappresentano la dimensione del gruppo. "\ 03" crea una stringa che ha uno e un solo carattere con valore numerico 3, il che significa che i gruppi avranno 3 cifre ciascuno. – ybungalobill

+0

Il valore predefinito non è un ','. Il locale C non usa raggruppamenti, altrimenti è specifico locale. –