8

Given the following code:

cout << 1000;

I would like the following output:

1,000

This can be done using std::locale, and the cout.imbue() function, but I fear I may be missing a step here. Can you spot it? I'm currently copying the current locale, and adding a thousands separator facet, but the comma never appears in my 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;
}
Cory Klein
  • 51,188
  • 43
  • 183
  • 243
  • Have you tried compiling the exact code you want us to believe you are using? – Fred Nurk Jan 18 '11 at 19:42
  • possible duplicate of [Is there a built-in function that comma-separates a number in C, C++, or JavaScript?](http://stackoverflow.com/questions/3479485/is-there-a-built-in-function-that-comma-separates-a-number-in-c-c-or-javascri) – Martin York Jan 18 '11 at 22:36
  • Is there a memleak? – Ch'en Meng Jul 05 '17 at 15:56

1 Answers1

6

The default implementation of do_thousands_sep already returns ','. It looks like you should override do_grouping instead. do_grouping returns an empty string by default, which means no grouping. This means groups of three digits each:

string do_grouping() const
{
    return "\03";
}
Yakov Galka
  • 70,775
  • 16
  • 139
  • 220
  • What does the "\03" represent? Is that ASCII for "end of text"? If so, why? – Cory Klein Jan 18 '11 at 20:47
  • 1
    @Cory: do_grouping returns a string that is treated as an array of one-char numbers that represent the size of the group. "\03" creates a string that has one and only one character with numeric value 3, which means that the groups will be of 3 digits each. – Yakov Galka Jan 18 '11 at 21:03
  • The default is not a ','. The C local uses no grouping, otherwise it is local specific. – Martin York Jan 18 '11 at 22:27
  • @Martin: I'm talking about the default returned form do_thousands_sep which is ','. It's not the same as 'default locale'. "Returns: A character for use as the digit group separator. The required specializations return ’,’ or L’,’." – Yakov Galka Jan 19 '11 at 07:11