[Bug libstdc++/52486] New: money_put/money_get/moneypunct interpreting localeconv() result incorrectly and inserting/requiring an extra space
jyasskin at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun Mar 4 22:32:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52486
Bug #: 52486
Summary: money_put/money_get/moneypunct interpreting
localeconv() result incorrectly and
inserting/requiring an extra space
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: jyasskin@gcc.gnu.org
Created attachment 26829
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26829
Test program to show monetary formatting results
The attached test program produces the following output with trunk gcc and
Ubuntu EGLIBC 2.13-20ubuntu5. Note that reading and writing values in the US
locale requires two spaces between "USD" and the currency value, and writes an
extra space when showbase is false (meaning the currency symbol should be
omitted). In the French locale, we're getting an extra space at the very end of
the output string.
I believe glibc is setting the locale data correctly for C11, and it matches
the example table in paragraph 10 of "7.11.2.1 The localeconv function". In C99
I think the normative wording was ambiguous, but the example table showed the
opposite value for int_*_sep_by_space.
$ ~/src/gcc/install/bin/g++-4.8svn -Wall test.cc -o test && ./test en_US.UTF-8
Set locale to 'en_US.UTF-8'
lc->currency_symbol == '$'
lc->p_sep_by_space == 0
lc->n_sep_by_space == 0
lc->int_curr_symbol == 'USD '
lc->int_p_sep_by_space == 1
lc->int_n_sep_by_space == 1
'1.23' reads as: '0'
And advances the iterator from 0x227c028 to 0x227c028.
And leaves the stream in state failbit.
'USD 1.23' reads as: '0'
And advances the iterator from 0x227c028 to 0x227c02c.
And leaves the stream in state failbit.
'USD 1.23' reads as: '123'
And advances the iterator from 0x227c028 to 0x227c031.
And leaves the stream in state eofbit.
Testing 123:
!showbase: ' 1.23'; showbase: 'USD 1.23'
strfmon writes it/100 as: no-symbol: '1.23'; symbol: 'USD 1.23'
Testing -1:
!showbase: '- .01'; showbase: '-USD .01'
strfmon writes it/100 as: no-symbol: '-0.01'; symbol: '-USD 0.01'
$ ~/src/gcc/install/bin/g++-4.8svn -Wall test.cc -o test && ./test fr_FR.UTF-8
Set locale to 'fr_FR.UTF-8'
lc->currency_symbol == '€'
lc->p_sep_by_space == 1
lc->n_sep_by_space == 1
lc->int_curr_symbol == 'EUR '
lc->int_p_sep_by_space == 1
lc->int_n_sep_by_space == 1
'1.23' reads as: '0'
And advances the iterator from 0x1c8f028 to 0x1c8f029.
And leaves the stream in state failbit.
'USD 1.23' reads as: '0'
And advances the iterator from 0x1c8f028 to 0x1c8f028.
And leaves the stream in state failbit.
'USD 1.23' reads as: '0'
And advances the iterator from 0x1c8f028 to 0x1c8f028.
And leaves the stream in state failbit.
Testing 123:
!showbase: '1,23 '; showbase: '1,23 EUR '
strfmon writes it/100 as: no-symbol: '1,23'; symbol: '1,23 EUR'
Testing -1:
!showbase: '-,01 '; showbase: '-,01 EUR '
strfmon writes it/100 as: no-symbol: '-0,01'; symbol: '-0,01 EUR'
jyasskin@abzu:~/tmp$
More information about the Gcc-bugs
mailing list