题
在C ++中,我有一个float / double变量。
当我用例如cout打印时,结果字符串是以句点分隔的。
cout << 3.1415 << endl
$> 3.1415
是否有一种简单的方法可以强制用逗号打印双精度?
cout << 3.1415 << endl
$> 3,1415
解决方案
imbue() cout
locale
其numpunct
facet的decimal_point()
成员函数返回逗号。
获得这样的std::locale("fr")
可以通过多种方式完成。您可以使用系统上可用的命名区域设置(也许是do_decimal_point()
)。或者,您可以派生自己的numpuct,在其中实现<=>成员。
第二种方法的例子:
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)facet指定逗号。
如果您的平台区域设置使用逗号格式,则
cout.imbue(locale(""));
应该足够了。
这由您的程序的区域设置控制。
如何设置程序的默认语言环境取决于平台。例如,在POSIX类型平台上,它使用LANG和LC_ *环境变量。
您可以通过调用ios :: imbue强制在C ++程序中使用特定的语言环境(与默认语言环境不同)。这样的事情可能有用:
#include <locale>
cout.imbue(std::locale("German_germany"));
这个想法是强制一个逗号是小数分隔符的语言环境。您可能需要调整<!> quot; 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());