2013-03-05 7 views
8

多くのヨーロッパ諸国では​​コンマを使用しているため、3.141592の代わりにpi3,141592として読み書きしたいと思います。 iostreamでこれをどのように達成できますか?言い換えれば小数点記号をカンマに設定するにはどうすればよいですか?

cout << 3.141592; 

は標準出力に

3,141592 

を印刷する必要があります。

+0

'double x = 3,14;'のように? –

+0

標準出力では、実行時(コンパイル時ではなく)にファイルを入力、読み込み、書き込みすることはできません。 –

+6

1ワード:ロケール。 – PlasmaHH

答えて

14

basic_ios::imbueを使用して優先ロケールを設定する必要があります。

はこちらをご覧ください:http://www.cplusplus.com/reference/ios/ios_base/imbue/

ロケールは米国でドットがまだ使用されている、イタリアのコンピュータが別の小数点以下の桁にカンマを使用していますので、もしあなたが、ユーザーによる好ましい方法を使用することができます。ロケールを使用することは良い習慣です。

しかし、あなたが明示的にカンマの使用を強制したい場合は、ここで見てみましょう: http://www.cplusplus.com/reference/locale/numpunct/decimal_point/

ここで私はちょうど文字を強制グラム++で作られた小さな例「」(テンプレートとしてのセパレータを渡します引数には、私は現在設定されているロケールに1つだけのファセットをオーバーライドしていcout.getloc()を使っつまり、COUTの現在のロケール設定で、私は変更てること

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

)本当に、楽しみのためだけに注意必要はありません句読点がどのように行われるかだけです。

do_decimal_pointは、カスタムセパレータを提供するために再定義できるstd::numpunctの仮想関数です。この仮想関数は、番号を印刷するときにnumpunct::decimal_pointによって使用されます。

9

@AkiRossによると、ロケールを使用する必要があります。これは、体系的でなければなりません

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

main で非常に最初のアクションのいずれかが同じよう 何かをすることによって、ユーザーの選択にグローバルロケールを設定するべきであるあなたが書いたすべての プログラム、一般に、 、 と人間のユーザとの相互作用のすべてのプログラム。この後に開くすべてのファイルは、 に自動的に正しいロケールが埋め込まれます。

また、あなたが明示的 使用したいロケールを指定することができます。

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には、このための特別な 関数とコンストラクタがあります)。

関連する問題