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 // REQUIRES: locale.zh_CN.UTF-8 11 12 // <locale> 13 14 // class money_get<charT, InputIterator> 15 16 // iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob, 17 // ios_base::iostate& err, long double& v) const; 18 19 // TODO For zh_CN GLIBC puts the negative sign after the currency symbol. 20 // XFAIL: linux-gnu 21 22 #include <locale> 23 #include <ios> 24 #include <streambuf> 25 #include <cassert> 26 #include "test_iterators.h" 27 28 #include "platform_support.h" // locale name macros 29 30 typedef std::money_get<char, input_iterator<const char*> > Fn; 31 32 class my_facet 33 : public Fn 34 { 35 public: 36 explicit my_facet(std::size_t refs = 0) 37 : Fn(refs) {} 38 }; 39 40 typedef std::money_get<wchar_t, input_iterator<const wchar_t*> > Fw; 41 42 class my_facetw 43 : public Fw 44 { 45 public: 46 explicit my_facetw(std::size_t refs = 0) 47 : Fw(refs) {} 48 }; 49 50 int main() 51 { 52 std::ios ios(0); 53 std::string loc_name(LOCALE_zh_CN_UTF_8); 54 ios.imbue(std::locale(ios.getloc(), 55 new std::moneypunct_byname<char, false>(loc_name))); 56 ios.imbue(std::locale(ios.getloc(), 57 new std::moneypunct_byname<char, true>(loc_name))); 58 ios.imbue(std::locale(ios.getloc(), 59 new std::moneypunct_byname<wchar_t, false>(loc_name))); 60 ios.imbue(std::locale(ios.getloc(), 61 new std::moneypunct_byname<wchar_t, true>(loc_name))); 62 { 63 const my_facet f(1); 64 // char, national 65 { // zero 66 std::string v = "0.00"; 67 typedef input_iterator<const char*> I; 68 long double ex; 69 std::ios_base::iostate err = std::ios_base::goodbit; 70 I iter = f.get(I(v.data()), I(v.data() + v.size()), 71 false, ios, err, ex); 72 assert(iter.base() == v.data() + v.size()); 73 assert(err == std::ios_base::eofbit); 74 assert(ex == 0); 75 } 76 { // negative one 77 std::string v = "-0.01"; 78 typedef input_iterator<const char*> I; 79 long double ex; 80 std::ios_base::iostate err = std::ios_base::goodbit; 81 I iter = f.get(I(v.data()), I(v.data() + v.size()), 82 false, ios, err, ex); 83 assert(iter.base() == v.data() + v.size()); 84 assert(err == std::ios_base::eofbit); 85 assert(ex == -1); 86 } 87 { // positive 88 std::string v = "1,234,567.89"; 89 typedef input_iterator<const char*> I; 90 long double ex; 91 std::ios_base::iostate err = std::ios_base::goodbit; 92 I iter = f.get(I(v.data()), I(v.data() + v.size()), 93 false, ios, err, ex); 94 assert(iter.base() == v.data() + v.size()); 95 assert(err == std::ios_base::eofbit); 96 assert(ex == 123456789); 97 } 98 { // negative 99 std::string v = "-1,234,567.89"; 100 typedef input_iterator<const char*> I; 101 long double ex; 102 std::ios_base::iostate err = std::ios_base::goodbit; 103 I iter = f.get(I(v.data()), I(v.data() + v.size()), 104 false, ios, err, ex); 105 assert(iter.base() == v.data() + v.size()); 106 assert(err == std::ios_base::eofbit); 107 assert(ex == -123456789); 108 } 109 { // negative 110 std::string v = "-1234567.89"; 111 typedef input_iterator<const char*> I; 112 long double ex; 113 std::ios_base::iostate err = std::ios_base::goodbit; 114 I iter = f.get(I(v.data()), I(v.data() + v.size()), 115 false, ios, err, ex); 116 assert(iter.base() == v.data() + v.size()); 117 assert(err == std::ios_base::eofbit); 118 assert(ex == -123456789); 119 } 120 { // zero, showbase 121 std::string v = "\xEF\xBF\xA5""0.00"; 122 typedef input_iterator<const char*> I; 123 long double ex; 124 std::ios_base::iostate err = std::ios_base::goodbit; 125 I iter = f.get(I(v.data()), I(v.data() + v.size()), 126 false, ios, err, ex); 127 assert(iter.base() == v.data() + v.size()); 128 assert(err == std::ios_base::eofbit); 129 assert(ex == 0); 130 } 131 { // zero, showbase 132 std::string v = "\xEF\xBF\xA5""0.00"; 133 showbase(ios); 134 typedef input_iterator<const char*> I; 135 long double ex; 136 std::ios_base::iostate err = std::ios_base::goodbit; 137 I iter = f.get(I(v.data()), I(v.data() + v.size()), 138 false, ios, err, ex); 139 assert(iter.base() == v.data() + v.size()); 140 assert(err == std::ios_base::eofbit); 141 assert(ex == 0); 142 noshowbase(ios); 143 } 144 { // negative one, showbase 145 std::string v = "\xEF\xBF\xA5""-0.01"; 146 typedef input_iterator<const char*> I; 147 long double ex; 148 std::ios_base::iostate err = std::ios_base::goodbit; 149 I iter = f.get(I(v.data()), I(v.data() + v.size()), 150 false, ios, err, ex); 151 assert(iter.base() == v.data() + v.size()); 152 assert(err == std::ios_base::eofbit); 153 assert(ex == -1); 154 } 155 { // negative one, showbase 156 std::string v = "\xEF\xBF\xA5""-0.01"; 157 showbase(ios); 158 typedef input_iterator<const char*> I; 159 long double ex; 160 std::ios_base::iostate err = std::ios_base::goodbit; 161 I iter = f.get(I(v.data()), I(v.data() + v.size()), 162 false, ios, err, ex); 163 assert(iter.base() == v.data() + v.size()); 164 assert(err == std::ios_base::eofbit); 165 assert(ex == -1); 166 noshowbase(ios); 167 } 168 { // positive, showbase 169 std::string v = "\xEF\xBF\xA5""1,234,567.89"; 170 typedef input_iterator<const char*> I; 171 long double ex; 172 std::ios_base::iostate err = std::ios_base::goodbit; 173 I iter = f.get(I(v.data()), I(v.data() + v.size()), 174 false, ios, err, ex); 175 assert(iter.base() == v.data() + v.size()); 176 assert(err == std::ios_base::eofbit); 177 assert(ex == 123456789); 178 } 179 { // positive, showbase 180 std::string v = "\xEF\xBF\xA5""1,234,567.89"; 181 showbase(ios); 182 typedef input_iterator<const char*> I; 183 long double ex; 184 std::ios_base::iostate err = std::ios_base::goodbit; 185 I iter = f.get(I(v.data()), I(v.data() + v.size()), 186 false, ios, err, ex); 187 assert(iter.base() == v.data() + v.size()); 188 assert(err == std::ios_base::eofbit); 189 assert(ex == 123456789); 190 noshowbase(ios); 191 } 192 { // negative, showbase 193 std::string v = "\xEF\xBF\xA5""-1,234,567.89"; 194 showbase(ios); 195 typedef input_iterator<const char*> I; 196 long double ex; 197 std::ios_base::iostate err = std::ios_base::goodbit; 198 I iter = f.get(I(v.data()), I(v.data() + v.size()), 199 false, ios, err, ex); 200 assert(iter.base() == v.data() + v.size()); 201 assert(err == std::ios_base::eofbit); 202 assert(ex == -123456789); 203 noshowbase(ios); 204 } 205 { // negative, showbase 206 std::string v = "CNY -1,234,567.89"; 207 showbase(ios); 208 typedef input_iterator<const char*> I; 209 long double ex; 210 std::ios_base::iostate err = std::ios_base::goodbit; 211 I iter = f.get(I(v.data()), I(v.data() + v.size()), 212 false, ios, err, ex); 213 assert(iter.base() == v.data() + 0); 214 assert(err == std::ios_base::failbit); 215 noshowbase(ios); 216 } 217 { // negative, showbase 218 std::string v = "CNY -1,234,567.89"; 219 typedef input_iterator<const char*> I; 220 long double ex; 221 std::ios_base::iostate err = std::ios_base::goodbit; 222 I iter = f.get(I(v.data()), I(v.data() + v.size()), 223 false, ios, err, ex); 224 assert(iter.base() == v.data() + 0); 225 assert(err == std::ios_base::failbit); 226 } 227 } 228 { 229 const my_facet f(1); 230 // char, international 231 { // zero 232 std::string v = "0.00"; 233 typedef input_iterator<const char*> I; 234 long double ex; 235 std::ios_base::iostate err = std::ios_base::goodbit; 236 I iter = f.get(I(v.data()), I(v.data() + v.size()), 237 true, ios, err, ex); 238 assert(iter.base() == v.data() + v.size()); 239 assert(err == std::ios_base::eofbit); 240 assert(ex == 0); 241 } 242 { // negative one 243 std::string v = "-0.01"; 244 typedef input_iterator<const char*> I; 245 long double ex; 246 std::ios_base::iostate err = std::ios_base::goodbit; 247 I iter = f.get(I(v.data()), I(v.data() + v.size()), 248 true, ios, err, ex); 249 assert(iter.base() == v.data() + v.size()); 250 assert(err == std::ios_base::eofbit); 251 assert(ex == -1); 252 } 253 { // positive 254 std::string v = "1,234,567.89"; 255 typedef input_iterator<const char*> I; 256 long double ex; 257 std::ios_base::iostate err = std::ios_base::goodbit; 258 I iter = f.get(I(v.data()), I(v.data() + v.size()), 259 true, ios, err, ex); 260 assert(iter.base() == v.data() + v.size()); 261 assert(err == std::ios_base::eofbit); 262 assert(ex == 123456789); 263 } 264 { // negative 265 std::string v = "-1,234,567.89"; 266 typedef input_iterator<const char*> I; 267 long double ex; 268 std::ios_base::iostate err = std::ios_base::goodbit; 269 I iter = f.get(I(v.data()), I(v.data() + v.size()), 270 true, ios, err, ex); 271 assert(iter.base() == v.data() + v.size()); 272 assert(err == std::ios_base::eofbit); 273 assert(ex == -123456789); 274 } 275 { // negative 276 std::string v = "-1234567.89"; 277 typedef input_iterator<const char*> I; 278 long double ex; 279 std::ios_base::iostate err = std::ios_base::goodbit; 280 I iter = f.get(I(v.data()), I(v.data() + v.size()), 281 true, ios, err, ex); 282 assert(iter.base() == v.data() + v.size()); 283 assert(err == std::ios_base::eofbit); 284 assert(ex == -123456789); 285 } 286 { // zero, showbase 287 std::string v = "CNY 0.00"; 288 typedef input_iterator<const char*> I; 289 long double ex; 290 std::ios_base::iostate err = std::ios_base::goodbit; 291 I iter = f.get(I(v.data()), I(v.data() + v.size()), 292 true, ios, err, ex); 293 assert(iter.base() == v.data() + v.size()); 294 assert(err == std::ios_base::eofbit); 295 assert(ex == 0); 296 } 297 { // zero, showbase 298 std::string v = "CNY 0.00"; 299 showbase(ios); 300 typedef input_iterator<const char*> I; 301 long double ex; 302 std::ios_base::iostate err = std::ios_base::goodbit; 303 I iter = f.get(I(v.data()), I(v.data() + v.size()), 304 true, ios, err, ex); 305 assert(iter.base() == v.data() + v.size()); 306 assert(err == std::ios_base::eofbit); 307 assert(ex == 0); 308 noshowbase(ios); 309 } 310 { // negative one, showbase 311 std::string v = "CNY -0.01"; 312 typedef input_iterator<const char*> I; 313 long double ex; 314 std::ios_base::iostate err = std::ios_base::goodbit; 315 I iter = f.get(I(v.data()), I(v.data() + v.size()), 316 true, ios, err, ex); 317 assert(iter.base() == v.data() + v.size()); 318 assert(err == std::ios_base::eofbit); 319 assert(ex == -1); 320 } 321 { // negative one, showbase 322 std::string v = "CNY -0.01"; 323 showbase(ios); 324 typedef input_iterator<const char*> I; 325 long double ex; 326 std::ios_base::iostate err = std::ios_base::goodbit; 327 I iter = f.get(I(v.data()), I(v.data() + v.size()), 328 true, ios, err, ex); 329 assert(iter.base() == v.data() + v.size()); 330 assert(err == std::ios_base::eofbit); 331 assert(ex == -1); 332 noshowbase(ios); 333 } 334 { // positive, showbase 335 std::string v = "CNY 1,234,567.89"; 336 typedef input_iterator<const char*> I; 337 long double ex; 338 std::ios_base::iostate err = std::ios_base::goodbit; 339 I iter = f.get(I(v.data()), I(v.data() + v.size()), 340 true, ios, err, ex); 341 assert(iter.base() == v.data() + v.size()); 342 assert(err == std::ios_base::eofbit); 343 assert(ex == 123456789); 344 } 345 { // positive, showbase 346 std::string v = "CNY 1,234,567.89"; 347 showbase(ios); 348 typedef input_iterator<const char*> I; 349 long double ex; 350 std::ios_base::iostate err = std::ios_base::goodbit; 351 I iter = f.get(I(v.data()), I(v.data() + v.size()), 352 true, ios, err, ex); 353 assert(iter.base() == v.data() + v.size()); 354 assert(err == std::ios_base::eofbit); 355 assert(ex == 123456789); 356 noshowbase(ios); 357 } 358 { // negative, showbase 359 std::string v = "CNY -1,234,567.89"; 360 showbase(ios); 361 typedef input_iterator<const char*> I; 362 long double ex; 363 std::ios_base::iostate err = std::ios_base::goodbit; 364 I iter = f.get(I(v.data()), I(v.data() + v.size()), 365 true, ios, err, ex); 366 assert(iter.base() == v.data() + v.size()); 367 assert(err == std::ios_base::eofbit); 368 assert(ex == -123456789); 369 noshowbase(ios); 370 } 371 { // negative, showbase 372 std::string v = "\xEF\xBF\xA5""-1,234,567.89"; 373 showbase(ios); 374 typedef input_iterator<const char*> I; 375 long double ex; 376 std::ios_base::iostate err = std::ios_base::goodbit; 377 I iter = f.get(I(v.data()), I(v.data() + v.size()), 378 true, ios, err, ex); 379 assert(iter.base() == v.data() + 0); 380 assert(err == std::ios_base::failbit); 381 noshowbase(ios); 382 } 383 { // negative, showbase 384 std::string v = "\xEF\xBF\xA5""-1,234,567.89"; 385 typedef input_iterator<const char*> I; 386 long double ex; 387 std::ios_base::iostate err = std::ios_base::goodbit; 388 I iter = f.get(I(v.data()), I(v.data() + v.size()), 389 true, ios, err, ex); 390 assert(iter.base() == v.data() + 0); 391 assert(err == std::ios_base::failbit); 392 } 393 } 394 { 395 const my_facetw f(1); 396 // wchar_t, national 397 { // zero 398 std::wstring v = L"0.00"; 399 typedef input_iterator<const wchar_t*> I; 400 long double ex; 401 std::ios_base::iostate err = std::ios_base::goodbit; 402 I iter = f.get(I(v.data()), I(v.data() + v.size()), 403 false, ios, err, ex); 404 assert(iter.base() == v.data() + v.size()); 405 assert(err == std::ios_base::eofbit); 406 assert(ex == 0); 407 } 408 { // negative one 409 std::wstring v = L"-0.01"; 410 typedef input_iterator<const wchar_t*> I; 411 long double ex; 412 std::ios_base::iostate err = std::ios_base::goodbit; 413 I iter = f.get(I(v.data()), I(v.data() + v.size()), 414 false, ios, err, ex); 415 assert(iter.base() == v.data() + v.size()); 416 assert(err == std::ios_base::eofbit); 417 assert(ex == -1); 418 } 419 { // positive 420 std::wstring v = L"1,234,567.89"; 421 typedef input_iterator<const wchar_t*> I; 422 long double ex; 423 std::ios_base::iostate err = std::ios_base::goodbit; 424 I iter = f.get(I(v.data()), I(v.data() + v.size()), 425 false, ios, err, ex); 426 assert(iter.base() == v.data() + v.size()); 427 assert(err == std::ios_base::eofbit); 428 assert(ex == 123456789); 429 } 430 { // negative 431 std::wstring v = L"-1,234,567.89"; 432 typedef input_iterator<const wchar_t*> I; 433 long double ex; 434 std::ios_base::iostate err = std::ios_base::goodbit; 435 I iter = f.get(I(v.data()), I(v.data() + v.size()), 436 false, ios, err, ex); 437 assert(iter.base() == v.data() + v.size()); 438 assert(err == std::ios_base::eofbit); 439 assert(ex == -123456789); 440 } 441 { // negative 442 std::wstring v = L"-1234567.89"; 443 typedef input_iterator<const wchar_t*> I; 444 long double ex; 445 std::ios_base::iostate err = std::ios_base::goodbit; 446 I iter = f.get(I(v.data()), I(v.data() + v.size()), 447 false, ios, err, ex); 448 assert(iter.base() == v.data() + v.size()); 449 assert(err == std::ios_base::eofbit); 450 assert(ex == -123456789); 451 } 452 { // zero, showbase 453 std::wstring v = L"\xFFE5""0.00"; 454 typedef input_iterator<const wchar_t*> I; 455 long double ex; 456 std::ios_base::iostate err = std::ios_base::goodbit; 457 I iter = f.get(I(v.data()), I(v.data() + v.size()), 458 false, ios, err, ex); 459 assert(iter.base() == v.data() + v.size()); 460 assert(err == std::ios_base::eofbit); 461 assert(ex == 0); 462 } 463 { // zero, showbase 464 std::wstring v = L"\xFFE5""0.00"; 465 showbase(ios); 466 typedef input_iterator<const wchar_t*> I; 467 long double ex; 468 std::ios_base::iostate err = std::ios_base::goodbit; 469 I iter = f.get(I(v.data()), I(v.data() + v.size()), 470 false, ios, err, ex); 471 assert(iter.base() == v.data() + v.size()); 472 assert(err == std::ios_base::eofbit); 473 assert(ex == 0); 474 noshowbase(ios); 475 } 476 { // negative one, showbase 477 std::wstring v = L"\xFFE5""-0.01"; 478 typedef input_iterator<const wchar_t*> I; 479 long double ex; 480 std::ios_base::iostate err = std::ios_base::goodbit; 481 I iter = f.get(I(v.data()), I(v.data() + v.size()), 482 false, ios, err, ex); 483 assert(iter.base() == v.data() + v.size()); 484 assert(err == std::ios_base::eofbit); 485 assert(ex == -1); 486 } 487 { // negative one, showbase 488 std::wstring v = L"\xFFE5""-0.01"; 489 showbase(ios); 490 typedef input_iterator<const wchar_t*> I; 491 long double ex; 492 std::ios_base::iostate err = std::ios_base::goodbit; 493 I iter = f.get(I(v.data()), I(v.data() + v.size()), 494 false, ios, err, ex); 495 assert(iter.base() == v.data() + v.size()); 496 assert(err == std::ios_base::eofbit); 497 assert(ex == -1); 498 noshowbase(ios); 499 } 500 { // positive, showbase 501 std::wstring v = L"\xFFE5""1,234,567.89"; 502 typedef input_iterator<const wchar_t*> I; 503 long double ex; 504 std::ios_base::iostate err = std::ios_base::goodbit; 505 I iter = f.get(I(v.data()), I(v.data() + v.size()), 506 false, ios, err, ex); 507 assert(iter.base() == v.data() + v.size()); 508 assert(err == std::ios_base::eofbit); 509 assert(ex == 123456789); 510 } 511 { // positive, showbase 512 std::wstring v = L"\xFFE5""1,234,567.89"; 513 showbase(ios); 514 typedef input_iterator<const wchar_t*> I; 515 long double ex; 516 std::ios_base::iostate err = std::ios_base::goodbit; 517 I iter = f.get(I(v.data()), I(v.data() + v.size()), 518 false, ios, err, ex); 519 assert(iter.base() == v.data() + v.size()); 520 assert(err == std::ios_base::eofbit); 521 assert(ex == 123456789); 522 noshowbase(ios); 523 } 524 { // negative, showbase 525 std::wstring v = L"\xFFE5""-1,234,567.89"; 526 showbase(ios); 527 typedef input_iterator<const wchar_t*> I; 528 long double ex; 529 std::ios_base::iostate err = std::ios_base::goodbit; 530 I iter = f.get(I(v.data()), I(v.data() + v.size()), 531 false, ios, err, ex); 532 assert(iter.base() == v.data() + v.size()); 533 assert(err == std::ios_base::eofbit); 534 assert(ex == -123456789); 535 noshowbase(ios); 536 } 537 { // negative, showbase 538 std::wstring v = L"CNY -1,234,567.89"; 539 showbase(ios); 540 typedef input_iterator<const wchar_t*> I; 541 long double ex; 542 std::ios_base::iostate err = std::ios_base::goodbit; 543 I iter = f.get(I(v.data()), I(v.data() + v.size()), 544 false, ios, err, ex); 545 assert(iter.base() == v.data() + 0); 546 assert(err == std::ios_base::failbit); 547 noshowbase(ios); 548 } 549 { // negative, showbase 550 std::wstring v = L"CNY -1,234,567.89"; 551 typedef input_iterator<const wchar_t*> I; 552 long double ex; 553 std::ios_base::iostate err = std::ios_base::goodbit; 554 I iter = f.get(I(v.data()), I(v.data() + v.size()), 555 false, ios, err, ex); 556 assert(iter.base() == v.data() + 0); 557 assert(err == std::ios_base::failbit); 558 } 559 } 560 { 561 const my_facetw f(1); 562 // wchar_t, international 563 { // zero 564 std::wstring v = L"0.00"; 565 typedef input_iterator<const wchar_t*> I; 566 long double ex; 567 std::ios_base::iostate err = std::ios_base::goodbit; 568 I iter = f.get(I(v.data()), I(v.data() + v.size()), 569 true, ios, err, ex); 570 assert(iter.base() == v.data() + v.size()); 571 assert(err == std::ios_base::eofbit); 572 assert(ex == 0); 573 } 574 { // negative one 575 std::wstring v = L"-0.01"; 576 typedef input_iterator<const wchar_t*> I; 577 long double ex; 578 std::ios_base::iostate err = std::ios_base::goodbit; 579 I iter = f.get(I(v.data()), I(v.data() + v.size()), 580 true, ios, err, ex); 581 assert(iter.base() == v.data() + v.size()); 582 assert(err == std::ios_base::eofbit); 583 assert(ex == -1); 584 } 585 { // positive 586 std::wstring v = L"1,234,567.89"; 587 typedef input_iterator<const wchar_t*> I; 588 long double ex; 589 std::ios_base::iostate err = std::ios_base::goodbit; 590 I iter = f.get(I(v.data()), I(v.data() + v.size()), 591 true, ios, err, ex); 592 assert(iter.base() == v.data() + v.size()); 593 assert(err == std::ios_base::eofbit); 594 assert(ex == 123456789); 595 } 596 { // negative 597 std::wstring v = L"-1,234,567.89"; 598 typedef input_iterator<const wchar_t*> I; 599 long double ex; 600 std::ios_base::iostate err = std::ios_base::goodbit; 601 I iter = f.get(I(v.data()), I(v.data() + v.size()), 602 true, ios, err, ex); 603 assert(iter.base() == v.data() + v.size()); 604 assert(err == std::ios_base::eofbit); 605 assert(ex == -123456789); 606 } 607 { // negative 608 std::wstring v = L"-1234567.89"; 609 typedef input_iterator<const wchar_t*> I; 610 long double ex; 611 std::ios_base::iostate err = std::ios_base::goodbit; 612 I iter = f.get(I(v.data()), I(v.data() + v.size()), 613 true, ios, err, ex); 614 assert(iter.base() == v.data() + v.size()); 615 assert(err == std::ios_base::eofbit); 616 assert(ex == -123456789); 617 } 618 { // zero, showbase 619 std::wstring v = L"CNY 0.00"; 620 typedef input_iterator<const wchar_t*> I; 621 long double ex; 622 std::ios_base::iostate err = std::ios_base::goodbit; 623 I iter = f.get(I(v.data()), I(v.data() + v.size()), 624 true, ios, err, ex); 625 assert(iter.base() == v.data() + v.size()); 626 assert(err == std::ios_base::eofbit); 627 assert(ex == 0); 628 } 629 { // zero, showbase 630 std::wstring v = L"CNY 0.00"; 631 showbase(ios); 632 typedef input_iterator<const wchar_t*> I; 633 long double ex; 634 std::ios_base::iostate err = std::ios_base::goodbit; 635 I iter = f.get(I(v.data()), I(v.data() + v.size()), 636 true, ios, err, ex); 637 assert(iter.base() == v.data() + v.size()); 638 assert(err == std::ios_base::eofbit); 639 assert(ex == 0); 640 noshowbase(ios); 641 } 642 { // negative one, showbase 643 std::wstring v = L"CNY -0.01"; 644 typedef input_iterator<const wchar_t*> I; 645 long double ex; 646 std::ios_base::iostate err = std::ios_base::goodbit; 647 I iter = f.get(I(v.data()), I(v.data() + v.size()), 648 true, ios, err, ex); 649 assert(iter.base() == v.data() + v.size()); 650 assert(err == std::ios_base::eofbit); 651 assert(ex == -1); 652 } 653 { // negative one, showbase 654 std::wstring v = L"CNY -0.01"; 655 showbase(ios); 656 typedef input_iterator<const wchar_t*> I; 657 long double ex; 658 std::ios_base::iostate err = std::ios_base::goodbit; 659 I iter = f.get(I(v.data()), I(v.data() + v.size()), 660 true, ios, err, ex); 661 assert(iter.base() == v.data() + v.size()); 662 assert(err == std::ios_base::eofbit); 663 assert(ex == -1); 664 noshowbase(ios); 665 } 666 { // positive, showbase 667 std::wstring v = L"CNY 1,234,567.89"; 668 typedef input_iterator<const wchar_t*> I; 669 long double ex; 670 std::ios_base::iostate err = std::ios_base::goodbit; 671 I iter = f.get(I(v.data()), I(v.data() + v.size()), 672 true, ios, err, ex); 673 assert(iter.base() == v.data() + v.size()); 674 assert(err == std::ios_base::eofbit); 675 assert(ex == 123456789); 676 } 677 { // positive, showbase 678 std::wstring v = L"CNY 1,234,567.89"; 679 showbase(ios); 680 typedef input_iterator<const wchar_t*> I; 681 long double ex; 682 std::ios_base::iostate err = std::ios_base::goodbit; 683 I iter = f.get(I(v.data()), I(v.data() + v.size()), 684 true, ios, err, ex); 685 assert(iter.base() == v.data() + v.size()); 686 assert(err == std::ios_base::eofbit); 687 assert(ex == 123456789); 688 noshowbase(ios); 689 } 690 { // negative, showbase 691 std::wstring v = L"CNY -1,234,567.89"; 692 showbase(ios); 693 typedef input_iterator<const wchar_t*> I; 694 long double ex; 695 std::ios_base::iostate err = std::ios_base::goodbit; 696 I iter = f.get(I(v.data()), I(v.data() + v.size()), 697 true, ios, err, ex); 698 assert(iter.base() == v.data() + v.size()); 699 assert(err == std::ios_base::eofbit); 700 assert(ex == -123456789); 701 noshowbase(ios); 702 } 703 { // negative, showbase 704 std::wstring v = L"\xFFE5""-1,234,567.89"; 705 showbase(ios); 706 typedef input_iterator<const wchar_t*> I; 707 long double ex; 708 std::ios_base::iostate err = std::ios_base::goodbit; 709 I iter = f.get(I(v.data()), I(v.data() + v.size()), 710 true, ios, err, ex); 711 assert(iter.base() == v.data() + 0); 712 assert(err == std::ios_base::failbit); 713 noshowbase(ios); 714 } 715 { // negative, showbase 716 std::wstring v = L"\xFFE5""-1,234,567.89"; 717 typedef input_iterator<const wchar_t*> I; 718 long double ex; 719 std::ios_base::iostate err = std::ios_base::goodbit; 720 I iter = f.get(I(v.data()), I(v.data() + v.size()), 721 true, ios, err, ex); 722 assert(iter.base() == v.data() + 0); 723 assert(err == std::ios_base::failbit); 724 } 725 } 726 } 727