Подробности

[В начало]

Проблема в реализации № 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

[В начало]