From 577f406186438493eac86d0dd14e92b9f92c47bb Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 18 Feb 2002 22:23:26 +0100 Subject: [PATCH] locale_facets.tcc (money_put::do_put): For the space field use __fill instead of ' ', uniformly. 2002-02-18 Paolo Carlini libstdc++/5708 * include/bits/locale_facets.tcc (money_put::do_put): For the space field use __fill instead of ' ', uniformly. * testsuite/22_locale/money_put_members_char.cc: Add test05 distilled from PR. (test01-02-03): Trim some '*' to ' '. * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto. From-SVN: r49847 --- libstdc++-v3/ChangeLog | 10 +++ libstdc++-v3/include/bits/locale_facets.tcc | 2 +- .../22_locale/money_put_members_char.cc | 67 +++++++++++++++---- .../22_locale/money_put_members_wchar_t.cc | 67 +++++++++++++++---- 4 files changed, 117 insertions(+), 29 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 18d68ff4bf6..060a48ea6b9 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2002-02-18 Paolo Carlini + + libstdc++/5708 + * include/bits/locale_facets.tcc (money_put::do_put): + For the space field use __fill instead of ' ', uniformly. + * testsuite/22_locale/money_put_members_char.cc: + Add test05 distilled from PR. + (test01-02-03): Trim some '*' to ' '. + * testsuite/22_locale/money_put_members_wchar_t.cc: Ditto. + 2002-02-18 Loren Rittle libstdc++/5697 diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 9d275c16c4c..02ae96eeb51 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1230,7 +1230,7 @@ namespace std if (__testipad) __res += string_type(__width - __len, __fill); else - __res += __ctype.widen(' '); + __res += __ctype.widen(__fill); break; case money_base::none: if (__testipad) diff --git a/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc b/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc index eefd1c2df58..72915dbc07d 100644 --- a/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc +++ b/libstdc++-v3/testsuite/22_locale/money_put_members_char.cc @@ -79,12 +79,12 @@ void test01() const money_put& mon_put = use_facet >(oss.getloc()); - iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); string result1 = oss.str(); VERIFY( result1 == "7.200.000.000,00 "); oss.str(empty); - iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); string result2 = oss.str(); VERIFY( result2 == "7.200.000.000,00 "); @@ -95,12 +95,12 @@ void test01() oss.setf(ios_base::showbase); oss.str(empty); - iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); string result3 = oss.str(); VERIFY( result3 == "7.200.000.000,00 DEM "); oss.str(empty); - iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); string result4 = oss.str(); VERIFY( result4 == "7.200.000.000,00 DM"); @@ -112,26 +112,26 @@ void test01() // test sign of more than one digit, say hong kong. oss.imbue(loc_hk); oss.str(empty); - iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); string result5 = oss.str(); VERIFY( result5 == "HK$7,200,000,000.00"); oss.str(empty); - iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, '*', digits2); + iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits2); string result6 = oss.str(); VERIFY( result6 == "(HKD 100,000,000,000.00)"); // test one-digit formats without zero padding oss.imbue(loc_c); oss.str(empty); - iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4); + iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4); string result7 = oss.str(); VERIFY( result7 == "1"); // test one-digit formats with zero padding, zero frac widths oss.imbue(loc_hk); oss.str(empty); - iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4); + iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4); string result8 = oss.str(); VERIFY( result8 == "(HKD .01)"); @@ -139,7 +139,7 @@ void test01() // test bunk input oss.str(empty); - iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, '*', digits3); + iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits3); string result9 = oss.str(); VERIFY( result9 == ""); @@ -151,7 +151,7 @@ void test01() oss.width(20); iterator_type os_it10 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4); string result10 = oss.str(); - VERIFY( result10 == "***************-,01 "); + VERIFY( result10 == "***************-,01*"); oss.str(empty); oss.width(20); @@ -210,12 +210,12 @@ void test02() const money_put& mon_put = use_facet >(oss.getloc()); - iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); string result1 = oss.str(); VERIFY( result1 == "7.200.000.000,00 "); oss.str(empty); - iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); string result2 = oss.str(); VERIFY( result2 == "7.200.000.000,00 "); @@ -226,12 +226,12 @@ void test02() oss.setf(ios_base::showbase); oss.str(empty); - iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); string result3 = oss.str(); VERIFY( result3 == "7.200.000.000,00 DEM "); oss.str(empty); - iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); string result4 = oss.str(); VERIFY( result4 == "7.200.000.000,00 DM"); @@ -303,11 +303,50 @@ void test04() #endif } +struct My_money_io : public std::moneypunct +{ + char_type do_decimal_point() const { return '.'; } + char_type do_thousands_sep() const { return ','; } + std::string do_grouping() const { return "\003"; } + + std::string do_negative_sign() const { return "()"; } + + int do_frac_digits() const { return 2; } + + pattern do_neg_format() const + { + static pattern pat = { { symbol, space, sign, value } }; + return pat; + } +}; + +// libstdc++/5708 +void test05() +{ + using namespace std; + typedef ostreambuf_iterator OutIt; + + locale loc(locale::classic(), new My_money_io); + + bool intl = false; + + string val("-123456"); + const money_put& mp = + use_facet >(loc); + + ostringstream fmt; + fmt.imbue(loc); + OutIt out(fmt); + mp.put(out,intl,fmt,'*',val); + VERIFY( fmt.str() == "*(1,234.56)" ); +} + int main() { test01(); test02(); test03(); test04(); + test05(); return 0; } diff --git a/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc b/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc index 0103bc41133..0688a65e8d0 100644 --- a/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc +++ b/libstdc++-v3/testsuite/22_locale/money_put_members_wchar_t.cc @@ -79,12 +79,12 @@ void test01() const money_put& mon_put = use_facet >(oss.getloc()); - iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); wstring result1 = oss.str(); VERIFY( result1 == L"7.200.000.000,00 "); oss.str(empty); - iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); wstring result2 = oss.str(); VERIFY( result2 == L"7.200.000.000,00 "); @@ -95,12 +95,12 @@ void test01() oss.setf(ios_base::showbase); oss.str(empty); - iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); wstring result3 = oss.str(); VERIFY( result3 == L"7.200.000.000,00 DEM "); oss.str(empty); - iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); wstring result4 = oss.str(); VERIFY( result4 == L"7.200.000.000,00 DM"); @@ -112,26 +112,26 @@ void test01() // test sign of more than one digit, say hong kong. oss.imbue(loc_hk); oss.str(empty); - iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it05 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); wstring result5 = oss.str(); VERIFY( result5 == L"HK$7,200,000,000.00"); oss.str(empty); - iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, '*', digits2); + iterator_type os_it06 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits2); wstring result6 = oss.str(); VERIFY( result6 == L"(HKD 100,000,000,000.00)"); // test one-digit formats without zero padding oss.imbue(loc_c); oss.str(empty); - iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4); + iterator_type os_it07 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4); wstring result7 = oss.str(); VERIFY( result7 == L"1"); // test one-digit formats with zero padding, zero frac widths oss.imbue(loc_hk); oss.str(empty); - iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4); + iterator_type os_it08 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits4); wstring result8 = oss.str(); VERIFY( result8 == L"(HKD .01)"); @@ -139,7 +139,7 @@ void test01() // test bunk input oss.str(empty); - iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, '*', digits3); + iterator_type os_it09 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits3); wstring result9 = oss.str(); VERIFY( result9 == L""); @@ -151,7 +151,7 @@ void test01() oss.width(20); iterator_type os_it10 = mon_put.put(oss.rdbuf(), true, oss, '*', digits4); wstring result10 = oss.str(); - VERIFY( result10 == L"***************-,01 "); + VERIFY( result10 == L"***************-,01*"); oss.str(empty); oss.width(20); @@ -210,12 +210,12 @@ void test02() const money_put& mon_put = use_facet >(oss.getloc()); - iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it01 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); wstring result1 = oss.str(); VERIFY( result1 == L"7.200.000.000,00 "); oss.str(empty); - iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it02 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); wstring result2 = oss.str(); VERIFY( result2 == L"7.200.000.000,00 "); @@ -226,12 +226,12 @@ void test02() oss.setf(ios_base::showbase); oss.str(empty); - iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, '*', digits1); + iterator_type os_it03 = mon_put.put(oss.rdbuf(), true, oss, ' ', digits1); wstring result3 = oss.str(); VERIFY( result3 == L"7.200.000.000,00 DEM "); oss.str(empty); - iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, '*', digits1); + iterator_type os_it04 = mon_put.put(oss.rdbuf(), false, oss, ' ', digits1); wstring result4 = oss.str(); VERIFY( result4 == L"7.200.000.000,00 DM"); @@ -302,6 +302,44 @@ void test04() } #endif } + +struct My_money_io : public std::moneypunct +{ + char_type do_decimal_point() const { return L'.'; } + char_type do_thousands_sep() const { return L','; } + std::string do_grouping() const { return "\003"; } + + std::wstring do_negative_sign() const { return L"()"; } + + int do_frac_digits() const { return 2; } + + pattern do_neg_format() const + { + static pattern pat = { { symbol, space, sign, value } }; + return pat; + } +}; + +// libstdc++/5708 +void test05() +{ + using namespace std; + typedef ostreambuf_iterator OutIt; + + locale loc(locale::classic(), new My_money_io); + + bool intl = false; + + wstring val(L"-123456"); + const money_put& mp = + use_facet >(loc); + + wostringstream fmt; + fmt.imbue(loc); + OutIt out(fmt); + mp.put(out,intl,fmt,L'*',val); + VERIFY( fmt.str() == L"*(1,234.56)" ); +} #endif int main() @@ -311,6 +349,7 @@ int main() test02(); test03(); test04(); + test05(); #endif return 0; }