>From description of moneypunct<> facet(22.2.6.3, p3): The format of the numeric monetary value is a decimal number:
value ::= units [ decimal-point [ digits ]] | decimal-point digits if frac_digits() returns a positive value, or value ::= units otherwise. But the implementation of money_get<>::do_get() reads from input stream decimal point and digits after it and write them to the result(units or digits), even when frac_digits() return nonpositive value. In similar situation with grouping, when grouping string indicates that grouping shouldn't not be applied, implementation stops read when it encounters thousands separator. Example: #include <locale> #include <sstream> #include <iostream> using namespace std; class my_moneypunct : public moneypunct<char> { protected: //this should disable fraction part of monetary value int do_frac_digits()const {return 0;} }; int main() { locale loc(locale(), new my_moneypunct()); stringstream ss("123.456"); ss.imbue(loc); string digits; ios_base::iostate err; use_facet<money_get<char> >(loc).get(ss, 0, false, ss, err, digits); string rest(istreambuf_iterator<char>(ss), istreambuf_iterator<char>()); cout << "digits is \"" << digits << "\"\n"; cout << "rest of stream is \"" << rest << "\"\n"; return 0; } [EMAIL PROTECTED] money_get_frac_digits]$ g++ ./test.cpp && ./a.out digits is "123456" rest of stream is "" [EMAIL PROTECTED] money_get_frac_digits]$ g++ --version g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -- Summary: money_get<> read decimal point when frac_digits() <= 0 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: tsyvarev at ispras dot ru http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38399