标准库已经有一些处理货币值的代码。在C++98/03中,使用起来非常痛苦,可能不值得麻烦,但是在C++11中,添加了一些I/O操作符,使它们变得非常容易使用。
在默认的“C”语言环境中,它们可能没有太多用处,但在本地化的语言环境中,它们将按照该语言环境通常期望的方式格式化货币。例如:
#include <iostream>
#include <iomanip>
int main(){
long double amt;
std::cin.imbue(std::locale(""));
std::cout.imbue(std::locale(""));
std::cin >> std::get_money(amt);
std::cout << std::put_money(amt) << "\n";
}
这里使用的是
""
语言环境,它根据操作系统配置选择语言环境。例如,在我的情况下,操作系统配置为美国英语,因此选择了美国英语环境。
基于环境的不同,这将根据该环境通常显示货币的方式来显示货币(程序员猜测)。例如,如果我输入“10” (小数点后带或不带零),它会以
10.00
的形式打印出来。
如果我愿意,可以指定一个特定的语言环境 - 例如,我可以指定“de”以获取德语环境。在这种情况下,值将(至少使用我手头可用的编译器)使用德国约定打印出来(点作为千位分隔符,逗号作为小数点分隔符)。还要注意,我可以将
std::cin
的语言环境与
std::cout
的语言环境分别指定,因此我可以(例如)将
cin
设置为美国英语,将
cout
设置为德语。如果我这样做,可以输入
1,234,567.89
作为输入,并获得
1.234.567,89
作为输出。(请注意,虽然它会将格式从美国约定转换为德国约定,但它不会自动将我输入的美元货币转换为欧元货币输出)。
请注意,
put_money
还会在完成操作后自动恢复以前的格式。例如,如果我将上面的最后一行更改为:
std::cout << std::put_money(amt) << "\n";
,然后将
10
作为输入,则得到
10.00 10
。
此外,请注意(至少在VC++中),
std::get_money
实际上将值存储为美分的整数计数,这将防止大多数舍入误差。因此,如果我输入
10
,实际上存储的是
1000
,然后重新缩放为输出时显示为
10.00
。
如果你使用较旧的编译器,不包括
std::get_money
和
std::put_money
,最简单的方法可能是从标准库中复制它们的定义,将它们放入自己的头文件中,并仍要使用它们。如果您不想这样做,可以考虑定义一个
money
类来存储金额,并重载
operator>>
和 (特别是)
operator<<
来处理所需的格式,这样写出货币数值将变得非常简单。
money m(10);
std::cout << m;
...而且operator<<
会处理所有的std::setprecision
等内容,以在小数点后显示两位数字。
std::cout.unsetf(std::ios::fixed)
。 - user425495