多くのヨーロッパ諸国ではコンマの使用が一般的であるため、 piの代わりにpiを読み書きしたいと思います。どうすればこれをsで達成できますか?言い換えると3,141592
3.141592
iostream
cout << 3.141592;
印刷する必要があります
3,141592
標準出力に。
多くのヨーロッパ諸国ではコンマの使用が一般的であるため、 piの代わりにpiを読み書きしたいと思います。どうすればこれをsで達成できますか?言い換えると3,141592
3.141592
iostream
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/を参照してください。
ここでは、char'、'を強制する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";
}
現在設定されているロケールで1つのファセットのみをオーバーライドしていることに注意してください。つまりcout.getloc()
、coutの現在のロケール設定では、句読点の実行方法のみを変更しています。
do_decimal_point
std::numpunct
は、カスタムセパレータを提供するために再定義できる仮想関数です。この仮想機能はnumpunct::decimal_point
、番号を印刷するときに使用されます。
@AkiRossが言ったように、ロケールを使用する必要があります。 一般に、作成するプログラムでは、最初のアクションの1つは、次のように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