【问题标题】:How can I set the decimal separator to be a comma?如何将小数点分隔符设置为逗号?
【发布时间】:2013-02-19 16:19:59
【问题描述】:

我想将 pi 读写为 3,141592 而不是 3.141592,因为在许多欧洲国家/地区使用逗号很常见。我怎样才能用iostreams 做到这一点?换句话说

cout << 3.141592;

应该打印

3,141592

到标准输出。

【问题讨论】:

  • 你的意思是,在代码中?喜欢double x = 3,14;
  • 运行时(不是编译时)在标准输出、输入、读写文件中没有。
  • 一个词:语言环境。
  • 我个人认为这与另一个问题并不完全相同。我发现这里给出的答案比其他问题的答案更有帮助。

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


【解决方案1】:

您应该使用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 打印您的号码时将使用此虚拟功能。

【讨论】:

    【解决方案2】:

    正如@AkiRoss 所说,您需要使用语言环境。 一般,在任何 您编写的程序,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(),或通过合并创建一个新的语言环境 std::locale::classic()codecvt 方面与另一个方面 全球语言环境的各个方面。 (std::locale有特别的 函数和构造函数。)

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多