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