我想将{em> pi 读作3,141592
而不是3.141592
,因为在许多欧洲国家/地区使用逗号很常见。如何使用iostream
来完成此操作?换句话说
cout << 3.141592;
应该打印
3,141592
到标准输出。
答案 0 :(得分: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";
}
请注意,使用cout.getloc()
我只覆盖当前设置的语言环境中的单个方面,也就是说,在cout的当前语言环境设置中,我只更改标点符号的完成方式。
do_decimal_point
是std::numpunct
的虚函数,您可以重新定义以提供自定义分隔符。打印号码时,numpunct::decimal_point
将使用此虚拟功能。
答案 1 :(得分:10)
正如@AkiRoss所说,你需要使用locales。 一般,任何
你写的程序,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
之前打开,所以必须充满了。{
新的语言环境。 (要获取当前全局区域设置的副本,请使用
std::locale
的默认构造函数。)
最后,如果您要打开任何二进制文件,请注意它们
也将充满全球语言环境。哪个可以做代码
翻译。在这种情况下,你应该明确地灌输它们
使用std::locale::classic()
,或通过合并创建新的区域设置
codecvt
的{{1}}方面与另一方面std::locale::classic()
方面
全局区域的方面。 (std::locale
有特殊之处
函数和构造函数。)