如何将小数点分隔符设置为逗号
How can I set the decimal separator to be a comma?
我想把pi写成3,141592
而不是3.141592
,因为在许多欧洲国家使用逗号是很常见的。我如何用iostream
s实现这一点?换句话说
cout << 3.141592;
应该打印
3,141592
转换为标准输出。
您应该使用basic_ios::imbue
来设置首选区域设置。
看这里:http://www.cplusplus.com/reference/ios/ios_base/imbue/
locale允许您使用用户首选的方式,因此,如果意大利的计算机使用逗号来分隔十进制数字,那么在美国仍然使用点。使用区域设置是个好习惯。
但是如果你想明确地强制使用逗号,看看这里: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_point
是std::numpunct
的虚函数,您可以重新定义它以提供自定义分隔符。这个虚函数将被numpunct::decimal_point
在打印您的号码时使用。
正如@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
之前打开,因此必须充满新的语言环境。(要获取当前全局语言环境的副本,请使用(std::locale
的默认构造函数)
最后,如果您正在打开任何二进制文件,请注意它们还将被注入全球区域设置。可能会写代码翻译。在这种情况下,您应该显式地灌输它们使用std::locale::classic()
,或者通过合并创建新的区域设置std::locale::classic()
的codecvt
面与另一个全局区域设置的方面。(std::locale
有特别的
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 当用户键入分隔符时,停止getline()输入
- 将 strtok 分隔符设置为两个字符
- 我可以设置ostream分隔符吗?
- 如何将小数点分隔符设置为逗号
- c++设置迭代器后的下一个分隔符递归