如何打印用逗号双(How to print a double with a comma)

2019-07-18 00:10发布

在C ++中我有一个浮点/双精度变量。

当我打印此与例如COUT得到的字符串是句点分隔。

cout << 3.1415 << endl
$> 3.1415

有一个简单的方法来强制打印用逗号双?

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

Answer 1:

imbue() coutlocale ,其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>(',')));


Answer 2:

你需要用不同的语言环境,指其num_punct(IIRC)小指定一个逗号impue流。

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

cout.imbue(locale(""));

应该足够了。



Answer 3:

这是由你的程序的语言环境来控制。

您如何设置程序的默认语言环境取决于平台。 在POSIX式平台,它与LANG和LC_ *环境变量,例如。

通过调用的ios ::灌输一个C ++程序中 - 您可以强制特定的语言环境 - 不同于默认。 这样的事情可能工作:

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

这样做是为了迫使区域,其中逗号是小数点分隔符。 您可能需要调整“German_germany”字符串来获得您的特定平台上你想要的行为。



Answer 4:

确切地说,这是通过受控std::numpunct<charT>::decimal_point()值。 您可以imbue()的另一个区域与其他decimal_point()



Answer 5:

旧线,但无论如何...每个人都应该知道,使用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”是一个非换一个,使字符串更漂亮: - )



Answer 6:

很老的线程,但无论如何...我不得不填补距离计算的结果的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());


文章来源: How to print a double with a comma