Details
[Home]
Issue of the Implementation # S0741
Brief
money_get<> reads decimal point when frac_digits return nonpositive value
Detailed Description
From the description of class moneypunct<> (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.
Nevetheless, money_get<charT>::do_get reads decimal point and digits following it, even when frac_digits() return non-positive value.
In the sample program below the stream will be read up to end (rest of stream is ""), though should be read up to decimal point (frac_digits() returns 0).
For compare, if grouping() indicates (returning, e.g., empty string) that digits grouping is disabled, then thousands separator isn't read - if it appears in the stream, then reading of the number stops.
Problem location(s) in the standard
Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx that refers ISO/IEC 14882: 2003 Programming languages --C++, section 22.2.2.1.2
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.455");
ss.imbue(loc);
string digits;
ios_base::iostate err;
istreambuf_iterator<char> iter =
use_facet<money_get<char> >(loc).get(ss, 0, false, ss, err, digits);
string rest = string(iter, istreambuf_iterator<char>());
cout << "digits is \"" << digits << "\"\n";
cout << "rest of stream is \"" << rest << "\"\n";
return 0;
}
Component
libstdc++
Accepted
GCC Bugzilla 38399
Status
Fixed in gcc-4.4.0
[Home]