locale_facets.tcc (money_put<>::_M_insert): Deal properly with empty __digits and negative frac_digits, clean-up a bit.
2004-03-03 Paolo Carlini <pcarlini@suse.de> * include/bits/locale_facets.tcc (money_put<>::_M_insert): Deal properly with empty __digits and negative frac_digits, clean-up a bit. From-SVN: r78844
This commit is contained in:
parent
f9957958fe
commit
039e3c5c45
|
@ -1,3 +1,9 @@
|
||||||
|
2004-03-03 Paolo Carlini <pcarlini@suse.de>
|
||||||
|
|
||||||
|
* include/bits/locale_facets.tcc (money_put<>::_M_insert):
|
||||||
|
Deal properly with empty __digits and negative frac_digits,
|
||||||
|
clean-up a bit.
|
||||||
|
|
||||||
2004-03-03 Jonathan Wakely <redi@gcc.gnu.org>
|
2004-03-03 Jonathan Wakely <redi@gcc.gnu.org>
|
||||||
|
|
||||||
* docs/html/documentation.html: Regenerate.
|
* docs/html/documentation.html: Regenerate.
|
||||||
|
|
|
@ -1441,7 +1441,6 @@ namespace std
|
||||||
// Determine if negative or positive formats are to be used, and
|
// Determine if negative or positive formats are to be used, and
|
||||||
// discard leading negative_sign if it is present.
|
// discard leading negative_sign if it is present.
|
||||||
const char_type* __beg = __digits.data();
|
const char_type* __beg = __digits.data();
|
||||||
const char_type* __end = __beg + __digits.size();
|
|
||||||
|
|
||||||
money_base::pattern __p;
|
money_base::pattern __p;
|
||||||
const char_type* __sign;
|
const char_type* __sign;
|
||||||
|
@ -1452,7 +1451,7 @@ namespace std
|
||||||
__sign = __lc->_M_positive_sign;
|
__sign = __lc->_M_positive_sign;
|
||||||
__sign_size = __lc->_M_positive_sign_size;
|
__sign_size = __lc->_M_positive_sign_size;
|
||||||
}
|
}
|
||||||
else
|
else if (__digits.size())
|
||||||
{
|
{
|
||||||
__p = __lc->_M_neg_format;
|
__p = __lc->_M_neg_format;
|
||||||
__sign = __lc->_M_negative_sign;
|
__sign = __lc->_M_negative_sign;
|
||||||
|
@ -1461,21 +1460,23 @@ namespace std
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for valid numbers in the ctype facet within input digits.
|
// Look for valid numbers in the ctype facet within input digits.
|
||||||
__end = __ctype.scan_not(ctype_base::digit, __beg, __end);
|
size_type __len = __ctype.scan_not(ctype_base::digit, __beg,
|
||||||
if (__beg != __end)
|
__beg + __digits.size()) - __beg;
|
||||||
|
if (__len)
|
||||||
{
|
{
|
||||||
// Assume valid input, and attempt to format.
|
// Assume valid input, and attempt to format.
|
||||||
// Break down input numbers into base components, as follows:
|
// Break down input numbers into base components, as follows:
|
||||||
// final_value = grouped units + (decimal point) + (digits)
|
// final_value = grouped units + (decimal point) + (digits)
|
||||||
string_type __value;
|
string_type __value;
|
||||||
size_type __len = __end - __beg;
|
|
||||||
__value.reserve(2 * __len);
|
__value.reserve(2 * __len);
|
||||||
|
|
||||||
// Add thousands separators to non-decimal digits, per
|
// Add thousands separators to non-decimal digits, per
|
||||||
// grouping rules.
|
// grouping rules.
|
||||||
const int __paddec = __lc->_M_frac_digits - __len;
|
int __paddec = __len - __lc->_M_frac_digits;
|
||||||
if (__paddec < 0)
|
if (__paddec > 0)
|
||||||
{
|
{
|
||||||
|
if (__lc->_M_frac_digits < 0)
|
||||||
|
__paddec = __len;
|
||||||
if (__lc->_M_grouping_size)
|
if (__lc->_M_grouping_size)
|
||||||
{
|
{
|
||||||
_CharT* __ws =
|
_CharT* __ws =
|
||||||
|
@ -1485,24 +1486,23 @@ namespace std
|
||||||
std::__add_grouping(__ws, __lc->_M_thousands_sep,
|
std::__add_grouping(__ws, __lc->_M_thousands_sep,
|
||||||
__lc->_M_grouping,
|
__lc->_M_grouping,
|
||||||
__lc->_M_grouping_size,
|
__lc->_M_grouping_size,
|
||||||
__beg, __end - __lc->_M_frac_digits);
|
__beg, __beg + __paddec);
|
||||||
__value.assign(__ws, __ws_end - __ws);
|
__value.assign(__ws, __ws_end - __ws);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
__value.assign(__beg, -__paddec);
|
__value.assign(__beg, __paddec);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deal with decimal point, decimal digits.
|
// Deal with decimal point, decimal digits.
|
||||||
if (__lc->_M_frac_digits > 0)
|
if (__lc->_M_frac_digits > 0)
|
||||||
{
|
{
|
||||||
__value += __lc->_M_decimal_point;
|
__value += __lc->_M_decimal_point;
|
||||||
if (__paddec <= 0)
|
if (__paddec >= 0)
|
||||||
__value.append(__end - __lc->_M_frac_digits,
|
__value.append(__beg + __paddec, __lc->_M_frac_digits);
|
||||||
__lc->_M_frac_digits);
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Have to pad zeros in the decimal position.
|
// Have to pad zeros in the decimal position.
|
||||||
__value.append(__paddec, __lit[_S_zero]);
|
__value.append(-__paddec, __lit[_S_zero]);
|
||||||
__value.append(__beg, __len);
|
__value.append(__beg, __len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue