Я хотел бы читать и писать число Пи как 3,141592
вместо 3.141592
Так как использование запятой распространено во многих европейских странах. Как я могу сделать это с iostream
s? Другими словами
cout << 3.141592;
должен напечатать
3,141592
на стандартный вывод.
Вы должны использовать 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
при печати вашего номера.
Как сказал @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
имеет особый
функции и конструкторы для этого.)