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

Ral*_*zky 9 c++ formatting iostream decimal-point comma

我想读写PI作为3,141592代替3.141592,如使用逗号是许多欧洲国家普遍.我怎样才能用iostreams 实现这个目标?换一种说法

cout << 3.141592;
Run Code Online (Sandbox Code Playgroud)

应该打印

3,141592
Run Code Online (Sandbox Code Playgroud)

到标准输出.

Aki*_*oss 15

您应该使用basic_ios::imbue设置首选区域设置.

看看这里:http://www.cplusplus.com/reference/ios/ios_base/imbue/

区域设置允许您使用用户的首选方式,因此如果意大利的计算机使用逗号分隔十进制数字,则在美国仍然使用点.使用语言环境是一种良好实践.

但是如果你想明确强制使用逗号,请看一下:http: //www.cplusplus.com/reference/locale/numpunct/decimal_point/

这里是一个我用g ++制作的小例子,它强制执行char','(将分隔符作为模板参数传递只是为了好玩,不是真的有必要)

#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";
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用cout.getloc()我只覆盖当前设置的语言环境中的单个方面,也就是说,在cout的当前语言环境设置中,我只更改标点符号的完成方式.

do_decimal_point是一个虚拟功能std::numpunct,您可以重新定义以提供自定义分隔符.numpunct::decimal_point打印您的号码时将使用此虚拟功能.


Jam*_*nze 11

正如@AkiRoss所说,你需要使用locales. 通常,在您编写的任何程序中,最初的操作之一main 应该是通过执行以下操作将全局区域设置设置为用户选择:

std::locale::global( std::locale( "" ) );
Run Code Online (Sandbox Code Playgroud)

在与人类用户交互的每个程序中,这应该是系统的.之后打开的所有文件将自动充满正确的区域设置.

或者,您可以显式指定要使用的区域设置:

std::locale::global( std::locale( locale_name ) );
Run Code Online (Sandbox Code Playgroud)

这个问题是区域设置名称没有标准.类似于"it_IT.UTF-8"Posix标准的东西,在互联网上使用; Windows传统上使用不同的格式(尽管最近的Windows似乎也接受这种格式).

离开了std::cin,std::coutstd::cerr.这些在您输入之前打开main,因此必须使用新的区域设置.(要获取当前全局语言环境的副本,请使用默认构造函数std::locale.)

最后,如果您打开任何二进制文件,请注意它们也将充满全局区域设置.哪个可以做代码翻译.在这种情况下,您应该明确地使用它们std::locale::classic(),或者通过将codecvtfacet std::locale::classic()与全局语言环境的其他方面合并来创建新的语言环境.(std::locale具有特殊功能和构造函数.)