首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

do_get

Defined in header <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%29个公共成员函数,调用成员函数do_get最派生的类。

3-4%29从输入迭代器读取字符。beg对象指定的规则格式化的货币值。std::ctype小面str.getloc()%28ct对于本页的其余部分%29,std::moneypunct<CharT, intl>小面str.getloc()%28mp对于本页的其余部分%29,以及从str.flags()...

如果输入迭代器beg变成等于end在解析完成之前,将两者都设置为failbiteofbiterr如果解析因其他原因而失败,则设置failbiterr任何一种方式,都不会修改输出参数%28%28。unitsdigits%29的错误。

如果解析成功,则不会更改。err,并将结果存储在unitsdigits...

格式化pattern此函数使用的总是mp.neg_format()...

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

如果money_base::spacemoney_base::none中的最后一个元素。pattern,解析器在解析货币值的其他组件后不会尝试使用任何空白。否则,将在以下位置使用一个或多个空白字符:money_base::space出现了。

如果showbase标志设置在str.flags(),则需要货币符号或货币字符串,如果没有设置,则货币符号是可选的。

如果字符串的第一个字符返回mp.positive_sign()mp.negative_sign()money_base::sign格式化模式的位置,它被消耗,该字符串中的其余字符在货币值的所有其他组件之后被期望和使用。如果两者都是mp.positive_sign()mp.negative_sign()是非空的,符号是必需的,必须与其中一个字符串的第一个字符匹配。如果其中一个字符串为空,则符号为可选的%28,如果没有,则结果的符号对应于空%29的字符串。如果两个字符串都是空的,或者具有相同的第一个字符,则结果将给出正号。如果输出参数为字符串%28digits%29,结果为负值。ct.widen('-')作为结果的第一个字符存储。

从输入中提取数字,以使其出现并放置在digits加宽后为28%ct.widen()如有必要,%29,或进入临时缓冲区buf1的价值units好像是由。

二次

代码语言:javascript
复制
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);

二次

%28n从输入中提取并存储在buf1buf2是另一个足够大的字符缓冲区%29。

返回值

一个迭代器,指向上一个字符之后的一个迭代器,该字符被识别为货币字符串输入的有效部分。

注记

这些货币单位被认为是这种货币最小的非小数单位:在美国是美分,在日本是日元。因此,输入序列"$1,056.23"在美国地区产生的数字105623.0units或者一根绳子"105623"digits...

因为货币符号是可选的,如果showbase是关闭的,但是整个多字符negative_sign()是必需的,给定格式模式。{sign, value, space, symbol}带着showbase关负[医]标志"-",弦"-1.23 €"解析为-123并在输入流中留下“eurove”未被消耗,但如果为负数则为空。[医]标志是"()",弦"(1.23 €)"完全被消耗掉了。

I/O机械手std::get_money为该函数提供了一个更简单的接口。

二次

代码语言:javascript
复制
#include <iostream>
#include <sstream>
#include <locale>
 
void demo_money_get(std::locale loc, const std::string& input)
{
    std::istringstream str(input);
    str.imbue(loc);
    long double units;
// note, the following can be written simple with 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);
    if(str) {
        std::cout << "Successfully parsed '" << str.str() << "' as "
                  << units/100 << " units\n";
        if(ret != std::istreambuf_iterator<char>()) {
            std::cout << "Remaining content: '";
            std::copy(ret, std::istreambuf_iterator<char>(),
                           std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        } else {
            std::cout << "The input was fully consumed\n";
        }
    } else {
            std::cout << "Parse failed. Unparsed string: '";
            std::copy(ret, std::istreambuf_iterator<char>(),
                           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");
}

二次

产出:

二次

代码语言:javascript
复制
Successfully parsed '-$5.12 abc' as -5.12 units
Remaining content: ' abc'
Successfully parsed '(RM5.12) def' as -5.12 units
Remaining content: ' def'

二次

另见

moneypunct

defines monetary formatting parameters used by std::money_get and std::money_put (class template)

money_get

parses and constructs a monetary value from an input character sequence (class template)

get_money (C++11)

parses a monetary value (function template)

代码语言:txt
复制
 © cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券