10

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

cout << 3.141592;

应该打印

3,141592

到标准输出。

4

2 回答 2

17

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

于 2013-03-05T10:25:23.190 回答
12

正如@AkiRoss 所说,您需要使用语言环境。 一般来说,在您编写的任何程序中,首先要做的一个操作main 应该是将全局语言环境设置为用户的选择,方法是:

std::locale::global( std::locale( "" ) );

在与人类用户交互的每个程序中,这应该是系统的。在此之后打开的所有文件都将自动使用正确的语言环境。

或者,您可以明确指定要使用的语言环境:

std::locale::global( std::locale( locale_name ) );

问题在于语言环境名称没有标准。类似的东西"it_IT.UTF-8"对应于 Posix 标准,并且在 Internet 上使用;Windows 传统上使用不同的格式(尽管最近的 Windows 似乎也接受这种格式)。

哪个叶子std::cin和。这些是在您进入之前打开的,因此必须充满新的语言环境。(要获取当前全局语言环境的副本,请使用 的默认构造函数。)std::coutstd::cerrmainstd::locale

最后,如果您要打开任何二进制文件,请注意它们也将包含全局语言环境。哪个可以做代码翻译。在这种情况下,您应该显式地为它们灌输,或者通过将 的方面与全局语言环境的其他方面std::locale::classic()合并来创建新的语言环境。(为此具有特殊的功能和构造函数。)codecvtstd::locale::classic()std::locale

于 2013-03-05T10:47:41.463 回答