如何将小数分隔符设置为逗号?

10

我希望在使用 iostream 时,将 pi 表示为 3,141592 而不是 3.141592,因为在许多欧洲国家中使用逗号更为常见。我该如何实现这一点?换句话说

cout << 3.141592;

应该打印。
3,141592

输出到标准输出。


你的意思是在代码中吗?像 double x = 3.14; 这样的吗? - Andy Prowl
运行时不要有标准输出、输入、读写文件(编译时除外)。 - Ralph Tandetzky
7
场所,地点,现场,位置。 - PlasmaHH
1
我个人认为这不是另一个问题的完全重复。我发现这里给出的答案比其他问题的答案更有帮助。 - Ralph Tandetzky
2个回答

17
您应该使用basic_ios :: imbue来设置首选语言环境。
请查看这里:http://www.cplusplus.com/reference/ios/ios_base/imbue/ 语言环境允许您使用用户的首选方式,因此如果在意大利使用逗号分隔小数位的计算机,在美国仍然使用点。使用语言环境是一种良好的实践。
但是,如果您想显式地强制使用逗号,请查看这里: http://www.cplusplus.com/reference/locale/numpunct/decimal_point/ 这里是一个我刚刚用g ++制作的小例子,它强制使用字符“,”(将分隔符作为模板参数传递只是为了好玩,不是必需的)
#include <iostream>
#include <locale>

template <class charT, charT sep>
class punct_facet: public std::numpunct<charT> {
protected:
    charT do_decimal_point() const { return sep; }
};

int main(int argc, char **argv) {
    std::cout.imbue(std::locale(std::cout.getloc(), new punct_facet<char, ','>));
    std::cout << "My age is " << 3.1415 << " lightyears.\n";
}

请注意,使用cout.getloc()我只覆盖了当前设置的语言环境中的一个单独方面,也就是说,在cout的当前语言环境设置中,我仅更改了标点符号的方式。 do_decimal_pointstd::numpunct的虚函数,您可以重新定义它以提供自定义分隔符。当打印数字时,numpunct::decimal_point将使用此虚函数。

13

正如@AkiRoss所说,您需要使用本地化。 一般来说,在您编写的任何程序中,第一件要做的事情之一就是通过执行类似以下操作来将全局语言环境设置为用户选择:

main
std::locale::global( std::locale( "" ) );

这应该是系统化的,在与人类用户交互的每个程序中。此后打开的所有文件都将自动注入正确的区域设置。
或者,您可以明确指定要使用的区域设置:
std::locale::global( std::locale( locale_name ) );

这里的问题是没有标准的区域设置名称。像“it_IT.UTF-8”这样的东西对应于Posix标准,并在互联网上使用;Windows传统上使用不同的格式(尽管最近的Windows也似乎接受这种格式)。
这留下了std::cin、std::cout和std::cerr。它们在进入main之前就已打开,因此必须用新的locale来使其生效。(要获取当前全局locale的副本,请使用std::locale的默认构造函数。)
最后,如果您正在打开任何二进制文件,请注意它们也会受到全局locale的影响。这可能会进行代码翻译。在这种情况下,您应该明确地使用std::locale::classic()使它们生效,或者通过将std::locale::classic()的codecvt facet与全局locale的其他facets合并来创建一个新的locale。(std::locale具有专门的函数和构造函数用于此。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接