10

多くのヨーロッパ諸国では​​コンマの使用が一般的であるため、 piの代わりにpiを読み書きしたいと思います。どうすればこれをsで達成できますか?言い換えると3,1415923.141592iostream

cout << 3.141592;

印刷する必要があります

3,141592

標準出力に。

4

2 に答える 2

17

を使用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_pointstd::numpunctは、カスタムセパレータを提供するために再定義できる仮想関数です。この仮想機能はnumpunct::decimal_point、番号を印刷するときに使用されます。

于 2013-03-05T10:25:23.190 に答える
12

@AkiRossが言ったように、ロケールを使用する必要があります。 一般に、作成するプログラムでは、最初のアクションの1つは、次のようにmain して、グローバルロケールをユーザーが選択したものに設定することです。

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

これは、人間のユーザーと対話するすべてのプログラムで体系的である必要があります。この後に開かれたすべてのファイルには、正しいロケールが自動的に組み込まれます。

または、使用するロケールを明示的に指定することもできます。

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

これに伴う問題は、ロケール名の標準がないことです。のようなもの"it_IT.UTF-8"はPosix標準に対応し、インターネットで使用されます。Windowsは従来、別の形式を使用していました(ただし、最近のWindowsもこの形式を受け入れているようです)。

どちらを残すかstd::cinstd::coutそしてstd::cerr。これらは入力する前に開かれるmainため、新しいロケールを組み込む必要があります。(現在のグローバルロケールのコピーを取得するには、のデフォルトコンストラクターを使用しますstd::locale。)

最後に、バイナリファイルを開く場合は、それらにもグローバルロケールが組み込まれていることに注意してください。これはコード変換を行う可能性があります。このような場合は、明示的にを吹き込むか、のファセットをグローバルロケールの他のファセットとマージstd::locale::classic()して新しいロケールを作成する必要があります。(このための特別な関数とコンストラクターがあります。)codecvtstd::locale::classic()std::locale

于 2013-03-05T10:47:41.463 に答える