1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <locale>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class money_put<charT, OutputIterator>
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//               long double units) const;
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <locale>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <ios>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <streambuf>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
2183e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h"
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2383e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "platform_support.h" // locale name macros
24c0d0cbad9ed434267a7af9531bdeeae52eb6d706Howard Hinnant
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypedef std::money_put<char, output_iterator<char*> > Fn;
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass my_facet
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public Fn
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit my_facet(std::size_t refs = 0)
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : Fn(refs) {}
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass my_facetw
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public Fw
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit my_facetw(std::size_t refs = 0)
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : Fw(refs) {}
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    std::ios ios(0);
48c0d0cbad9ed434267a7af9531bdeeae52eb6d706Howard Hinnant    std::string loc_name(LOCALE_zh_CN_UTF_8);
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.imbue(std::locale(ios.getloc(),
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          new std::moneypunct_byname<char, false>(loc_name)));
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.imbue(std::locale(ios.getloc(),
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          new std::moneypunct_byname<char, true>(loc_name)));
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.imbue(std::locale(ios.getloc(),
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          new std::moneypunct_byname<wchar_t, false>(loc_name)));
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.imbue(std::locale(ios.getloc(),
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          new std::moneypunct_byname<wchar_t, true>(loc_name)));
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const my_facet f(1);
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // char, national
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "0.00");
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "-0.01");
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "1,234,567.89");
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "-1,234,567.89");
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero, showbase
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "\xEF\xBF\xA5""0.00");
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one, showbase
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "\xEF\xBF\xA5""-0.01");
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive, showbase
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "\xEF\xBF\xA5""1,234,567.89");
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "\xEF\xBF\xA5""-1,234,567.89");
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, left
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        left(ios);
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, ' ', v);
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "\xEF\xBF\xA5""-1,234,567.89    ");
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, internal
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        internal(ios);
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, ' ', v);
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "\xEF\xBF\xA5""-    1,234,567.89");
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, right
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        right(ios);
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, ' ', v);
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "    \xEF\xBF\xA5""-1,234,567.89");
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // char, international
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    noshowbase(ios);
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.unsetf(std::ios_base::adjustfield);
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "0.00");
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "-0.01");
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "1,234,567.89");
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "-1,234,567.89");
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero, showbase
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "CNY 0.00");
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one, showbase
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "CNY -0.01");
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive, showbase
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "CNY 1,234,567.89");
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "CNY -1,234,567.89");
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, left
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        left(ios);
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, ' ', v);
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "CNY -1,234,567.89   ");
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, internal
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        internal(ios);
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, ' ', v);
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "CNY -   1,234,567.89");
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, right
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        right(ios);
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char str[100];
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<char*> iter = f.put(output_iterator<char*>(str),
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, ' ', v);
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::string ex(str, iter.base());
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == "   CNY -1,234,567.89");
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const my_facetw f(1);
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // wchar_t, national
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    noshowbase(ios);
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.unsetf(std::ios_base::adjustfield);
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"0.00");
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"-0.01");
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"1,234,567.89");
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"-1,234,567.89");
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero, showbase
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"\xFFE5""0.00");
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one, showbase
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"\xFFE5""-0.01");
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive, showbase
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"\xFFE5""1,234,567.89");
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, '*', v);
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"\xFFE5""-1,234,567.89");
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, left
347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        left(ios);
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, ' ', v);
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"\xFFE5""-1,234,567.89      ");
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, internal
359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        internal(ios);
363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, ' ', v);
366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"\xFFE5""-      1,234,567.89");
368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, right
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        right(ios);
375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            false, ios, ' ', v);
378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"      \xFFE5""-1,234,567.89");
380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // wchar_t, international
384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    noshowbase(ios);
385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios.unsetf(std::ios_base::adjustfield);
386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero
387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"0.00");
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one
395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"-0.01");
401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive
403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"1,234,567.89");
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"-1,234,567.89");
417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // zero, showbase
419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 0;
420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"CNY 0.00");
426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative one, showbase
428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -1;
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"CNY -0.01");
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // positive, showbase
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = 123456789;
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"CNY 1,234,567.89");
444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, '*', v);
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"CNY -1,234,567.89");
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, left
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        left(ios);
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, ' ', v);
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"CNY -1,234,567.89   ");
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, internal
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        internal(ios);
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, ' ', v);
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"CNY -   1,234,567.89");
476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {   // negative, showbase, right
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        long double v = -123456789;
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        showbase(ios);
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios.width(20);
482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        right(ios);
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t str[100];
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str),
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                            true, ios, ' ', v);
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        std::wstring ex(str, iter.base());
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ex == L"   CNY -1,234,567.89");
488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(ios.width() == 0);
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
492