質問
C ++にはfloat / double変数があります。
たとえばcoutでこれを印刷すると、結果の文字列はピリオドで区切られます。
cout << 3.1415 << endl
$> 3.1415
ダブルをカンマで強制的に印刷する簡単な方法はありますか?
cout << 3.1415 << endl
$> 3,1415
解決
imbue() cout
とlocale
のnumpunct
ファセットのdecimal_point()
メンバー関数はコンマを返します。
このようなstd::locale("fr")
を取得するには、いくつかの方法があります。システムで使用可能な名前付きロケール(do_decimal_point()
など)を使用できます。あるいは、独自のnumpuctを派生させ、その中に<=>メンバーを実装することもできます。
2番目のアプローチの例:
template<typename CharT>
class DecimalSeparator : public std::numpunct<CharT>
{
public:
DecimalSeparator(CharT Separator)
: m_Separator(Separator)
{}
protected:
CharT do_decimal_point()const
{
return m_Separator;
}
private:
CharT m_Separator;
};
次の用途:
std::cout.imbue(std::locale(std::cout.getloc(), new DecimalSeparator<char>(',')));
他のヒント
ストリームを別のロケール、つまりnum_punct(iirc)ファセットがコンマを指定しているロケールで誘導する必要があります。
プラットフォームのロケールがカンマでフォーマットされている場合、
cout.imbue(locale(""));
十分なはずです。
これは、プログラムのロケールによって制御されます。
プログラムのデフォルトロケールの設定方法は、プラットフォームによって異なります。 POSIXタイプのプラットフォームでは、たとえばLANGおよびLC_ *環境変数が使用されます。
ios ++:imbueを呼び出すことにより、C ++プログラム内で特定のロケール(デフォルトとは異なる)を強制できます。このような何かが動作する可能性があります:
#include <locale>
cout.imbue(std::locale("German_germany"));
アイデアは、カンマが小数点記号であるロケールを強制することです。 <!> quot; German_germany <!> quot;の調整が必要になる場合があります。特定のプラットフォームで必要な動作を取得するための文字列。
正確には、これはstd::numpunct<charT>::decimal_point()
値によって制御されます。別のimbue()
decimal_point()
できます 古いスレッドですが、とにかく... std::locale
を使用すると、文字列<!> quot; pretty <!> quot;が作成され、正しい小数点、数千個の区切り文字、およびそうでないものに応じて、プラットフォームとロケール。ほとんどの場合、imbue()
を使用すると、書式設定後に文字列の解析が中断されます。例:
std::ostringstream s;
std::locale l("fr-fr");
s << "without locale: " << 1234.56L << std::endl;
s.imbue(l);
s << "with fr locale: " << 1234.56L << std::endl;
std::cout << s.str();
次の出力を提供します:
without locale: 1234.56
with fr locale: 1 234,56
2番目の文字列でstrtod()
などを使用すると、おそらくうまく機能しません...また、<!> quot; 1 <!> quot;の間のスペースおよび<!> quot; 2 <!> quot; 2番目の出力文字列は壊れない文字列で、文字列がさらにきれいになります:-)
非常に古いスレッドですが、とにかく... Gtkmm-3.0のテキストエントリに距離計算の結果を入力する問題がありました。物事を明確にするために、私が最後の日読んだいくつかの投稿の知恵を集めた例を追加します:
#include <locale>
// next not necessary, added only for clarity
#include <gtkmm-3.0/gtkmm.h>
Gtk::Entry m_Text;
// a distance measured in kilometers
double totalDistance = 35.45678;
std::stringstream str;
// I am using locale of Germany, pay attention to the _
str.imbue(std::locale("de_DE"));
// now we have decimal comma instead of point
str << std::fixed << std::setprecision(4) << std::setw(16) << totalDistance << " km";
// the wished formatting corresponds to "%16.4f km" in printf
m_Text.set_text(str.str());