Ê×Ò³
ѧϰ
»î¶¯
רÇø
¹¤¾ß
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ÔÚ½âÎöÍê³É֮ǰ£¬½«Á½Õ߶¼ÉèÖÃΪfailbitºÍeofbitÔÚerrÈç¹û½âÎöÒòÆäËûÔ­Òò¶øʧ°Ü£¬ÔòÉèÖÃfailbitÔÚerrÈκÎÒ»ÖÖ·½Ê½£¬¶¼²»»áÐÞ¸ÄÊä³ö²ÎÊý%28%28¡£units»òdigits%29µÄ´íÎó¡£

Èç¹û½âÎö³É¹¦£¬Ôò²»»á¸ü¸Ä¡£err£¬²¢½«½á¹û´æ´¢ÔÚunits»òdigits...

¸ñʽ»¯pattern´Ëº¯ÊýʹÓõÄ×ÜÊÇmp.neg_format()...

Èç¹ûmp.grouping()²»ÔÊÐíÊýǧ¸ö·Ö¸ô·û£¬Óöµ½µÄµÚÒ»¸ö·Ö¸ô·û±»ÊÓΪ½âÎö´íÎ󣬷ñÔòËüÃDZ»ÊÓΪ¿ÉÑ¡µÄ¡£

Èç¹û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()ÊǷǿյģ¬·ûºÅÊDZØÐèµÄ£¬±ØÐëÓëÆäÖÐÒ»¸ö×Ö·û´®µÄµÚÒ»¸ö×Ö·ûÆ¥Åä¡£Èç¹ûÆäÖÐÒ»¸ö×Ö·û´®Îª¿Õ£¬Ôò·ûºÅΪ¿ÉÑ¡µÄ%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´ÓÊäÈëÖÐÌáÈ¡²¢´æ´¢ÔÚbuf1ºÍbuf2ÊÇÁíÒ»¸ö×ã¹»´óµÄ×Ö·û»º³åÇø%29¡£

·µ»ØÖµ

Ò»¸öµü´úÆ÷£¬Ö¸ÏòÉÏÒ»¸ö×Ö·ûÖ®ºóµÄÒ»¸öµü´úÆ÷£¬¸Ã×Ö·û±»Ê¶±ðΪ»õ±Ò×Ö·û´®ÊäÈëµÄÓÐЧ²¿·Ö¡£

×¢¼Ç

ÕâЩ»õ±Òµ¥Î»±»ÈÏΪÊÇÕâÖÖ»õ±Ò×îСµÄ·ÇСÊýµ¥Î»£ºÔÚÃÀ¹úÊÇÃÀ·Ö£¬ÔÚÈÕ±¾ÊÇÈÕÔª¡£Òò´Ë£¬ÊäÈëÐòÁÐ"$1,056.23"ÔÚÃÀ¹úµØÇø²úÉúµÄÊý×Ö105623.0ÔÚunits»òÕßÒ»¸ùÉþ×Ó"105623"ÔÚdigits...

ÒòΪ»õ±Ò·ûºÅÊÇ¿ÉÑ¡µÄ£¬Èç¹ûshowbaseÊǹرյģ¬µ«ÊÇÕû¸ö¶à×Ö·ûnegative_sign()ÊDZØÐèµÄ£¬¸ø¶¨¸ñʽģʽ¡£{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¡£

ɨÂë¹Ø×¢ÌÚѶÔÆ¿ª·¢Õß

ÁìÈ¡ÌÚѶÔÆ´ú½ðȯ

http://www.vxiaotou.com