2011-01-18 16 views
7

Biorąc pod uwagę następujący kod:Jak ustawić ustawienia regionalne cout, aby wstawiać przecinki jako separatory tysięcy?

cout << 1000; 

chciałbym następujący wynik:

1,000 

Można to zrobić za pomocą std :: lokum, a cout.imbue() funkcji, ale obawiam Być może brakuje mi tu kroku. Czy możesz to zauważyć? Obecnie kopiuję bieżące ustawienia narodowe i dodaje aspekt separatora tysięcy, ale przecinek nigdy nie pojawia się w moich wynikach.

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

Czy próbowałeś skompilować dokładny kod, który według nas ma być używany? –

+0

możliwy duplikat [Czy istnieje wbudowana funkcja, która przecina przecinkami liczbę w C, C++ lub JavaScript?] (Http://stackoverflow.com/questions/3479485/is-there-a-built-in- funkcja-to-przecinki-separuje-a-numer-in-cc-lub-javascri) –

+0

Czy jest jakiś memelak? –

Odpowiedz

6

Domyślna implementacja do_thousands_sep już wraca ','. Wygląda na to, że zamiast tego należy zastąpić do_grouping. do_grouping zwraca domyślnie pusty ciąg znaków, co oznacza brak grupowania. Oznacza to, że grupy składają się z trzech cyfr:

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

Co oznacza symbol "\ 03"? Czy to ASCII dla "końca tekstu"? Jeśli tak, dlaczego? –

+1

@Cory: do_grouping zwraca ciąg znaków, który jest traktowany jako tablica jednokolorowych liczb reprezentujących rozmiar grupy. "\ 03" tworzy ciąg, który ma jeden i tylko jeden znak o wartości numerycznej 3, co oznacza, że ​​grupy będą miały 3 cyfry. – ybungalobill

+0

Ustawieniem domyślnym nie jest ",". Lokalny C nie używa grupowania, w przeciwnym razie jest lokalny. –

Powiązane problemy