Как настроить локаль cout для вставки запятых в качестве разделителей тысяч?

Учитывая следующий код:

cout << 1000;

Я хотел бы получить следующий результат:

1,000

Это можно сделать с помощью std::locale и функции cout.imbue(), но я боюсь, что могу пропустить здесь один шаг. Вы можете заметить это? В настоящее время я копирую текущую локаль и добавляю разделитель тысяч, но запятая никогда не появляется в моем выводе.

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;
}

person Cory Klein    schedule 18.01.2011    source источник
comment
Вы пытались скомпилировать точный код, который вы хотите, чтобы мы поверили, что вы используете?   -  person Fred Nurk    schedule 18.01.2011
comment
comment
Есть мемлейк?   -  person Ch'en Meng    schedule 05.07.2017


Ответы (1)


Реализация по умолчанию do_thousands_sep уже возвращает ','. Похоже, вместо этого вы должны переопределить do_grouping. do_grouping по умолчанию возвращает пустую строку, что означает отсутствие группировки. Это означает группы из трех цифр в каждой:

string do_grouping() const
{
    return "\03";
}
person Yakov Galka    schedule 18.01.2011
comment
Что означает \03? Это ASCII для конца текста? Если да, то почему? - person Cory Klein; 18.01.2011
comment
@Cory: do_grouping возвращает строку, которая обрабатывается как массив односимвольных чисел, представляющих размер группы. \03 создает строку, содержащую один и только один символ с числовым значением 3, что означает, что каждая группа будет состоять из 3 цифр. - person Yakov Galka; 19.01.2011
comment
По умолчанию это не ','. Локальный язык C не использует группировку, в противном случае он является локальным. - person Martin York; 19.01.2011
comment
@Martin: я говорю о возвращаемой по умолчанию форме do_thousands_sep, которая равна ','. Это не то же самое, что «локаль по умолчанию». Возвращает: символ для использования в качестве разделителя группы цифр. Требуемые специализации возвращают ',' или L','. - person Yakov Galka; 19.01.2011