函数
<iomanip>

std::get_money

template <class moneyT>/*unspecified*/ get_money (moneyT& mon, bool intl = false);
获取货币值
从其应用到的输入流中提取字符,并将它们解释为货币表达式,然后存储在 mon 的值中。

在内部,该函数首先构造一个类型为 basic_istream::sentry 的对象(其中 noskipws 设置为 false)来访问输入序列。然后(如果 sentry 对象评估为 true),它调用 money_get::get(使用流的选定区域设置)来执行提取和解析操作,并相应地调整流的内部状态标志。最后,在返回之前销毁 sentry 对象。

此操纵符在头文件 <iomanip> 中声明。

参数

mon
存储货币值的对象。
moneyT 必须是 long doublebasic_string 的实例化。
intl
true 表示国际表示法,否则为 false
这在内部用于实例化正确的 moneypunct 类。

返回值

未指定。此函数只应作为流操纵符使用(见示例)。

错误通过修改流的内部状态标志来指示。
flag错误
eofbit输入序列没有更多可用字符(达到文件结尾)。
failbit未提取任何字符,或者提取的字符无法解释为有效的货币值。
badbit流错误(例如,当此函数捕获由内部操作抛出的异常时)。
设置为此标志时,流的完整性可能受到影响。
一次操作可能设置多个标志。

如果操作在流上设置了一个使用其成员 exceptions 注册的内部状态标志,则函数会抛出类型为 ios_base::failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// get_money manipulator example
#include <iostream>     // std::cin, std::cout
#include <iomanip>      // std::get_money

int main ()
{
  long double price;
  std::cout << "Please, enter the price: ";
  std::cin >> std::get_money(price);

  if (std::cin.fail()) std::cout << "Error reading price\n";
  else std::cout << "The price entered is: " << price << '\n';

  return 0;
}


数据竞争

修改 mon 以及从中提取的流对象。
并发访问同一流对象可能导致数据竞争,但标准流对象 cinwcin与 stdio 同步时除外(在这种情况下,不会引发数据竞争,尽管对于提取的字符归属到线程的顺序不提供任何保证)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果最终的错误状态标志不是 goodbit 且成员 exceptions 被设置为针对该状态抛出,则它会抛出成员类型为 failure 的异常。
由内部操作抛出的任何异常都会被函数捕获和处理,并设置 badbit。如果在最后一次调用 exceptions 时设置了 badbit,则函数会重新抛出捕获到的异常。

另见