2013-07-17 2 views
7

Я хочу сделать оператором < <, которые используют локальные настройки или, если не хотя бы вручную, смогут изменить использование «.». для десятичного разделителя на ",". Мне нравится способ сделать поток (iostream, fstream и т. Д.) Для этого, а не для создания строки, а затем распечатать ее.Как сделать запятую запятой, а не точкой?

Возможно ли это?

+0

Должен ли использоваться пользовательский язык? Если нет, imbue() одно в потоке – Pete

+3

Не имеете в виду «запятую», а не «двоеточие»? – Michael

+3

также, ',' представляет собой запятую, а не двоеточие. – Pete

ответ

13

Вы можете наполнить оглушающую фасетку на свой поток. Я считаю, что то, как это должно работать для вас:

template <typename T> 
struct comma_separator : std::numpunct<T> 
{ 
    typename std::numpunct<T>::char_type do_decimal_point() const 
    { 
     return ','; 
    } 
}; 

template <typename T> 
std::basic_ostream<T>& comma_sep(std::basic_ostream<T>& os) 
{ 
    os.imbue(std::locale(std::locale(""), new comma_separator<T>)); 
    return os; 
} 

int main() 
{ 
    std::cout << comma_sep << 3.14; // 3,14 
} 

Here is a demo.


Сокращенный решение, которое использует европейский языковой стандарт:

std::cout.imbue(
    std::locale(
     std::cout.getloc(), new std::numpunct_byname<char>("de_DE.utf8"))); 

Но в конечном счете, зависит от языковых стандартов, ваша система обеспечивает.

+2

+1 Никогда не знал, что это так просто. – dyp

+5

Не было бы лучше использовать фасет, соответствующий языку ОС, чем сделать такой пользовательский? –

+0

@MarkRansom зависит - прямо не отвечает на вопрос OP в этом случае - что, если он в Америке и хочет, чтобы мы сделали американцев, видите ли запятые? кто знает истинное намерение –

Смежные вопросы