如何用逗号打印双精度数

时间:2009-09-14 15:08:37

标签: c++ floating-point double

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

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

cout << 3.1415 << endl
$> 3.1415

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

cout << 3.1415 << endl
$> 3,1415

6 个答案:

答案 0 :(得分:11)

imbue() cout locale numpunct facet的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>(',')));

答案 1 :(得分:3)

您需要使用不同的语言环境来插入流,其中num_punct(iirc)facet指定逗号。

如果您的平台区域设置使用逗号格式,则

cout.imbue(locale(""));

应该足够了。

答案 2 :(得分:2)

这由您的程序的区域设置控制。

如何设置程序的默认语言环境取决于平台。例如,在POSIX类型平台上,它使用LANG和LC_ *环境变量。

您可以通过调用ios :: imbue强制在C ++程序中使用特定的语言环境(与默认语言环境不同)。这样的事情可能有用:

#include <locale>
cout.imbue(std::locale("German_germany"));

这个想法是强制一个逗号是小数分隔符的语言环境。您可能需要调整“German_germany”字符串以获得您在特定平台上所需的行为。

答案 3 :(得分:1)

准确地说,这是由std::numpunct<charT>::decimal_point()值控制的。您可以使用其他imbue()

decimal_point()另一个区域设置

答案 4 :(得分:0)

旧线程,但无论如何......应该知道使用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”之间的空格是不间断的,使得字符串更漂亮: - )

答案 5 :(得分:0)

非常老的线程,但无论如何......我有问题在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());