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
ºÃÏñÊÇÓÉ¡£
¶þ´Î
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
Ϊ¸Ãº¯ÊýÌṩÁËÒ»¸ö¸ü¼òµ¥µÄ½Ó¿Ú¡£
Àý
¶þ´Î
#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");
}
¶þ´Î
²ú³ö£º
¶þ´Î
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) |
? cppreference.com
ÔÚCreativeCommonsAttributionÏÂÊÚȨ-ShareAlikeδÒÆÖ²Ðí¿Év3.0¡£
±¾ÎĵµÏµÌÚѶÔÆ¿ª·¢ÕßÉçÇø³ÉÔ±¹²Í¬Î¬»¤£¬ÈçÓÐÎÊÌâÇëÁªÏµ cloudcommunity@tencent.com