在C ++中我有一个浮点/双精度变量。
当我打印此与例如COUT得到的字符串是句点分隔。
cout << 3.1415 << endl
$> 3.1415
有一个简单的方法来强制打印用逗号双?
cout << 3.1415 << endl
$> 3,1415
在C ++中我有一个浮点/双精度变量。
当我打印此与例如COUT得到的字符串是句点分隔。
cout << 3.1415 << endl
$> 3.1415
有一个简单的方法来强制打印用逗号双?
cout << 3.1415 << endl
$> 3,1415
imbue() cout
与locale
,其numpunct
方面的decimal_point()
成员函数返回一个逗号。
获得了这样的locale
可以通过多种方式来完成。 你可以使用可用的命名区域您的系统上( std::locale("fr")
也许)。 或者,你可以派生自己numpuct,实现do_decimal_point()
成员在里面。
第二种方法的实施例:
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)小指定一个逗号impue流。
如果您的平台区域设置格式用逗号,然后
cout.imbue(locale(""));
应该足够了。
这是由你的程序的语言环境来控制。
您如何设置程序的默认语言环境取决于平台。 在POSIX式平台,它与LANG和LC_ *环境变量,例如。
通过调用的ios ::灌输一个C ++程序中 - 您可以强制特定的语言环境 - 不同于默认。 这样的事情可能工作:
#include <locale>
cout.imbue(std::locale("German_germany"));
这样做是为了迫使区域,其中逗号是小数点分隔符。 您可能需要调整“German_germany”字符串来获得您的特定平台上你想要的行为。
确切地说,这是通过受控std::numpunct<charT>::decimal_point()
值。 您可以imbue()
的另一个区域与其他decimal_point()
旧线,但无论如何...每个人都应该知道,使用std::locale
,使字符串“漂亮”,完全与正确的小数点,千位分隔符,什么不可以,因平台和语言环境。 最可能的是,使用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
使用strtod()
或第二串类似可能不会在第二输出字符串很好地工作......此外,“1”之间的空间,“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());