Namespaces
Variants

std::money_get<CharT,InputIt>:: get, do_get

From cppreference.net
std::money_get
Member functions
money_get::get money_get::do_get
定义于头文件 <locale>
public :

iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(1)
iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(2)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(3)
virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(4)

从输入迭代器解析货币值并将结果写入 long double 或字符串。

1,2) 公开成员函数,调用最派生类的成员函数 do_get
3,4) 从输入迭代器 beg 读取字符,期望找到根据以下规则格式化的货币值:由 str. getloc ( ) 中植入的 std:: ctype 面(本页后续简称 ct )、 str. getloc ( ) 中植入的 std:: moneypunct < CharT, intl > 面(本页后续简称 mp ),以及从 str. flags ( ) 获取的流格式化标志所指定的规则。

如果输入迭代器 beg 在解析完成前达到 end ,将在 err 中同时设置 failbit eofbit 。若因其他原因导致解析失败,将在 err 中设置 failbit 。无论哪种情况,在出错时都不会修改输出参数( units digits )。

如果解析成功,不会更改 err ,并将结果存储在 units digits 中。

该函数使用的格式化 模式 始终为 mp. neg_format ( )

如果 mp. grouping ( ) 不允许千位分隔符,遇到的第一个分隔符将被视为解析错误,否则它们将被视为可选的。

money_base::space money_base::none pattern 中的最后一个元素,解析器在完成货币值其他组件的解析后不会尝试消耗任何空白字符。否则,在出现 money_base::space 的位置会消耗一个或多个空白字符。

如果 showbase 标志在 str. flags ( ) 中被设置,则必须显示货币符号或货币字符串;如果未设置,货币符号则为可选显示。

如果 mp. positive_sign ( ) mp. negative_sign ( ) 返回的字符串首字符在格式化模式的 money_base::sign 位置被找到,该字符将被消耗,且该字符串中剩余字符需在货币值所有其他组成部分之后被期望并消耗。若 mp. positive_sign ( ) mp. negative_sign ( ) 均非空,则符号必须存在且需匹配其中一个字符串的首字符。若其中一个字符串为空,则符号为可选(若未提供符号,结果符号对应于空字符串的情况)。若两个字符串均为空,或具有相同的首字符,则结果采用正号。若输出参数为字符串( digits )且结果为负值,则值 ct. widen ( '-' ) 将作为结果的首字符存储。

输入中的数字按其出现顺序被提取,并放入 digits (必要时通过 ct. widen ( ) 进行扩展),或存入临时缓冲区 buf1 ,随后 units 的值将基于此缓冲区构建,其过程如同执行以下操作:

static const char src[] = "0123456789-";
CharT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);
for (int i = 0; i < n; ++i)
buf2[i] = src[find(atoms, atoms+sizeof(src), buf1[i]) - atoms];
buf2[n] = 0;
sscanf(buf2, "%Lf", &units);

(其中 n 表示从输入中提取并存储到 buf1 的字符数量,而 buf2 是另一个足够大的字符缓冲区)。

目录

返回值

一个迭代器,指向在货币字符串输入中被识别为有效部分的最后一个字符之后的位置。

注释

货币单位被假定为该货币的最小非分数单位:在美国是美分,在日本是日元。因此,在美国区域设置中,输入序列 "$1,056.23" 会在 units 中生成数字 105623.0 ,或在 digits 中生成字符串 "105623"

由于当 showbase 关闭时货币符号是可选的,但完整的多字符 negative_sign() 是必需的,给定格式化模式 { sign, value, space, symbol } showbase 关闭、负号为 "-" 时,字符串 "-1.23 €" 会被解析为 - 123 并将 "€" 保留在输入流中未被消耗;但如果负号为 "()" ,则字符串 "(1.23 €)" 会被完全消耗。

I/O 操纵器 std::get_money 为此函数提供了更简洁的接口。

示例

#include <iostream>
#include <locale>
#include <sstream>
void demo_money_get(std::locale loc, const std::string& input)
{
    std::istringstream str(input);
    str.imbue(loc);
    long double units;
    // 以下代码可使用 std::get_money(units) 简化实现
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::money_get<char>>(loc).get(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            false, str, err, units);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
    if (str)
    {
        std::cout << "成功解析 '" << str.str() << "' 为 "
                  << units / 100 << " 单位\n";
        if (ret != last)
        {
            std::cout << "剩余内容: '";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        }
        else
            std::cout << "输入已完全消耗\n";
    }
    else
    {
        std::cout << "解析失败。未解析字符串: '";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        std::cout << "'\n";
    }
}
int main()
{
    demo_money_get(std::locale("en_US.utf8"), "-$5.12 abc");
    demo_money_get(std::locale("ms_MY.utf8"), "(RM5.12) def");
}

输出:

成功解析 '-$5.12 abc' 为 -5.12 单位
剩余内容: ' abc'
成功解析 '(RM5.12) def' 为 -5.12 单位
剩余内容: ' def'

参见

定义由 std::money_get std::money_put 使用的货币格式化参数
(类模板)
从输入字符序列解析并构造货币值
(类模板)
(C++11)
解析货币值
(函数模板)