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

How can I set the decimal separator to be a comma?

本文关键字:设置 分隔符 小数点      更新时间:2023-10-16

我想把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_pointstd::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::coutstd::cerr。这些都是在输入main之前打开,因此必须充满新的语言环境。(要获取当前全局语言环境的副本,请使用(std::locale的默认构造函数)

最后,如果您正在打开任何二进制文件,请注意它们还将被注入全球区域设置。可能会写代码翻译。在这种情况下,您应该显式地灌输它们使用std::locale::classic(),或者通过合并创建新的区域设置std::locale::classic()codecvt面与另一个全局区域设置的方面。(std::locale有特别的