Подробности
[В начало]
Проблема в реализации № S0741
Краткое описание
money_get<> читает десятичную точку, когда frac_digits возвращает неположительную величину
Подробное описание
Из описания класса 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.
Тем не менее, money_get<charT>::do_get читает десятичную точку (decimal point) и следующие за ней цифры, даже если значение frac_digits() неположительно.
При запуске приведенного ниже примера поток будет считан до конца (в потоке останется ""), хотя должен быть считан до десятичной точки (frac_digits() возаращает 0).
Для сравнения, если grouping() сигнализирует (возвращая, например, пустую строку), что группировка цифр отключена, то разделитель групп цифр (thousands separator) не читается - если он встречается, то чтение числа прекращается.
Раздел стандарта
Linux Standard Base C++ Specification 3.2, Chapter 9. Libraries, 9.1. Interfaces for libstdcxx, который ссылается на ISO/IEC 14882: 2003 Programming languages --C++, section 22.2.2.1.2
Пример
#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; }
Компонент
libstdc++
Принято
GCC Bugzilla 38399
Статус
Исправлено в gcc-4.4.0
[В начало]