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

Я хотел бы читать и писать число Пи как 3,141592 вместо 3.141592Так как использование запятой распространено во многих европейских странах. Как я могу сделать это с iostreams? Другими словами

cout << 3.141592;

должен напечатать

3,141592

на стандартный вывод.

8

Решение

Вы должны использовать basic_ios::imbue установить предпочтительный язык.

Посмотрите здесь: http://www.cplusplus.com/reference/ios/ios_base/imbue/

Локали позволяют пользователю использовать предпочтительный способ, поэтому, если компьютер в Италии использует запятую для разделения десятичных цифр, в США точка все еще используется. Использование локалей — это хорошая практика.

Но если вы хотите явно использовать запятую, посмотрите здесь:
http://www.cplusplus.com/reference/locale/numpunct/decimal_point/

Вот небольшой пример, который я только что сделал с g ++, который применяет символ ‘,’ (передавая разделитель в качестве аргумента шаблона, просто для удовольствия, в действительности не нужно)

#include <iostream>
#include <locale>

template <class charT, charT sep>
class punct_facet: public std::numpunct<charT> {
protected:
charT do_decimal_point() const { return sep; }
};

int main(int argc, char **argv) {
std::cout.imbue(std::locale(std::cout.getloc(), new punct_facet<char, ','>));
std::cout << "My age is " << 3.1415 << " lightyears.\n";
}

Обратите внимание, что с помощью cout.getloc() Я переопределяю только один фасет в текущей установленной локали, то есть в текущих настройках локали cout я меняю только то, как делается пунктуация.

do_decimal_point это виртуальная функция std::numpunct что вы можете переопределить, чтобы предоставить свой пользовательский разделитель. Эта виртуальная функция будет использоваться numpunct::decimal_point при печати вашего номера.

14

Другие решения

Как сказал @AkiRoss, вам нужно использовать локали. В общем, в любой
Программа, которую вы пишете, одно из самых первых действий в main
следует установить глобальный языковой стандарт для выбора пользователей, выполнив
что-то вроде:

std::locale::global( std::locale( "" ) );

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

Кроме того, вы можете явно указать локаль, которую вы хотите
использовать:

std::locale::global( std::locale( locale_name ) );

Проблема в том, что нет стандарта для локали
имена. Что-то вроде "it_IT.UTF-8" соответствует Posix
стандарт и используется в интернете; Windows традиционно
использовал другой формат (хотя последние Windows, кажется,
принять этот формат, а также).

Какие листья std::cin, std::cout а также std::cerr, Это
открыт перед входом mainи так должно быть проникнуто
новая локаль. (Чтобы получить копию текущей глобальной локали, используйте
конструктор по умолчанию std::locale.)

Наконец, если вы открываете какие-либо двоичные файлы, имейте в виду, что они
также проникнутся глобальной локалью. Который может делать код
перевод. В таких случаях вам следует явно их наполнить
с std::locale::classic()или создайте новую локаль путем слияния
codecvt грань std::locale::classic() с другим
аспекты глобальной локали. (std::locale имеет особый
функции и конструкторы для этого.)

9

По вопросам рекламы [email protected]