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

时间:2013-03-05 10:00:39

标签: c++ formatting iostream comma decimal-point

我想将{em> pi 读作3,141592而不是3.141592,因为在许多欧洲国家/地区使用逗号很常见。如何使用iostream来完成此操作?换句话说

cout << 3.141592;

应该打印

3,141592

到标准输出。

2 个答案:

答案 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_pointstd::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::cinstd::coutstd::cerr。这些是 在您输入main之前打开,所以必须充满了。{ 新的语言环境。 (要获取当前全局区域设置的副本,请使用 std::locale的默认构造函数。)

最后,如果您要打开任何二进制文件,请注意它们 也将充满全球语言环境。哪个可以做代码 翻译。在这种情况下,你应该明确地灌输它们 使用std::locale::classic(),或通过合并创建新的区域设置 codecvt的{​​{1}}方面与另一方面std::locale::classic()方面 全局区域的方面。 (std::locale有特殊之处 函数和构造函数。)