在C ++中,我有一个float / double变量。

当我用例如cout打印时,结果字符串是以句点分隔的。

cout << 3.1415 << endl
$> 3.1415

是否有一种简单的方法可以强制用逗号打印双精度?

cout << 3.1415 << endl
$> 3,1415
有帮助吗?

解决方案

imbue() cout localenumpunct 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());
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top