1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*********************************************************************** 259d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (c) 1997-2013, International Business Machines Corporation 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and others. All Rights Reserved. 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ***********************************************************************/ 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "numrgts.h" 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <float.h> // DBL_MIN, DBL_MAX 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dcfmtsym.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/locid.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/resbund.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/datefmt.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucurr.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass MyNumberFormatTest : public NumberFormat 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UClassID getDynamicClassID(void) const; 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& format( double number, 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& toAppendTo, 3254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionIterator* posIter, 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) const 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return NumberFormat::format(number, toAppendTo, posIter, status); 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Just keep this here to make some of the compilers happy */ 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& format(const Formattable& obj, 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& toAppendTo, 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& pos, 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) const 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NumberFormat::format(obj, toAppendTo, pos, status); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Just use one of the format functions */ 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& format( double /* number */, 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& toAppendTo, 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& /* pos */) const 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toAppendTo = ""; 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return toAppendTo; 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public Number parse(String text, ParsePosition parsePosition) 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { return new Integer(0); } 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Just use one of the parse functions */ 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void parse( const UnicodeString& /* text */, 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable& result, 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition& /* parsePosition */) const 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.setLong((int32_t)0); 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void parse( const UnicodeString& text, 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable& result, 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) const 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::parse(text, result, status); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual Format* clone() const 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { return NULL; } 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& format(int32_t, 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& foo, 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition&) const 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { return foo.remove(); } 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual UnicodeString& format(int64_t, 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& foo, 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition&) const 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { return foo.remove(); } 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru virtual void applyPattern(const UnicodeString&, UParseError&, UErrorCode&){ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t gMyNumberFormatTestClassID; 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUClassID MyNumberFormatTest::getDynamicClassID() const 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UClassID)&gMyNumberFormatTestClassID; 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ***************************************************************************** 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class NumberFormatRegressionTest 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ***************************************************************************** 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest"); 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (index) { 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(0,Test4075713); 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(1,Test4074620); 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(2,Test4088161); 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(3,Test4087245); 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(4,Test4087535); 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(5,Test4088503); 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(6,Test4066646); 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(7,Test4059870); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(8,Test4083018); 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(9,Test4071492); 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(10,Test4086575); 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(11,Test4068693); 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(12,Test4069754); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(13,Test4087251); 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(14,Test4090489); 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(15,Test4090504); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(16,Test4095713); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(17,Test4092561); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(18,Test4092480); 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(19,Test4087244); 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(20,Test4070798); 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(21,Test4071005); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(22,Test4071014); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(23,Test4071859); 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(24,Test4093610); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(25,Test4098741); 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(26,Test4074454); 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(27,Test4099404); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(28,Test4101481); 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(29,Test4052223); 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(30,Test4061302); 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(31,Test4062486); 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(32,Test4108738); 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(33,Test4106658); 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(34,Test4106662); 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(35,Test4114639); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(36,Test4106664); 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(37,Test4106667); 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(38,Test4110936); 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(39,Test4122840); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(40,Test4125885); 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(41,Test4134034); 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(42,Test4134300); 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(43,Test4140009); 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(44,Test4141750); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(45,Test4145457); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(46,Test4147295); 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(47,Test4147706); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(48,Test4162198); 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(49,Test4162852); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(50,Test4167494); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(51,Test4170798); 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(52,Test4176114); 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(53,Test4179818); 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(54,Test4212072); 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(55,Test4216742); 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(56,Test4217661); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(57,Test4161100); 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(58,Test4243011); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(59,Test4243108); 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CASE(60,TestJ691); 171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho CASE(61,Test8199); 172103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius CASE(62,Test9109); 17354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius CASE(63,Test9780); 17454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius CASE(64,Test9677); 17559d709d503bab6e2b61931737e662dd293b40578ccornelius CASE(65,Test10361); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: name = ""; break; 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 1826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const Locale& l, UBool possibleDataError) 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 1856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (possibleDataError) { 1866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(UnicodeString("FAIL: ", "") + msg 1876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),"")); 1886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 1896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, UnicodeString("FAIL: ", "") + msg 1906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),"")); 1916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 1996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const char *l, UBool possibleDataError) 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 2026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (possibleDataError) { 2036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(UnicodeString("FAIL: ", "") + msg 2046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, "")); 2056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 2066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, UnicodeString("FAIL: ", "") + msg 2076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, "")); 2086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 2166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, UBool possibleDataError) 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 2196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (possibleDataError) { 2206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln(UnicodeString("FAIL: ", "") + msg 2216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); 2226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 2236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, UnicodeString("FAIL: ", "") + msg 2246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "")); 2256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convert Java-style strings with \u Unicode escapes into UnicodeString objects 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString str(const char *input) 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return CharsToUnicodeString(input); 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4075713 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.equals comparing with null should always return false. 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} kind of silly in C++, just checking for new success 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4075713(void) 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MyNumberFormatTest *tmp = new MyNumberFormatTest(); 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(tmp != NULL) 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("NumberFormat.equals passed"); 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (NullPointerException e) { 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("(new MyNumberFormatTest()).equals(null) throws unexpected exception"); 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete tmp; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4074620 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.equals comparing two obj equal even the setGroupingUsed 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * flag is different. 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4074620(void) 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MyNumberFormatTest *nf1 = new MyNumberFormatTest(); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru MyNumberFormatTest *nf2 = new MyNumberFormatTest(); 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf1->setGroupingUsed(FALSE); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf2->setGroupingUsed(TRUE); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(nf1 == nf2) 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4074620 failed"); 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Test for bug 4074620 passed."); 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf1; 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf2; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4088161 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() incorrectly uses maxFractionDigits setting. 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4088161 (void) 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 2886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "new DecimalFormat", "")) { 2896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru double d = 100; 2906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru df->setMinimumFractionDigits(0); 2916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru df->setMaximumFractionDigits(16); 2926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString sBuf1; 2936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition fp1(0); 2946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln(UnicodeString("d = ") + d); 2958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln(UnicodeString("maxFractionDigits = ") + df->getMaximumFractionDigits()); 2968393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 2976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln(" format(d) = '" + df->format(d, sBuf1, fp1) + "'"); 2986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru df->setMaximumFractionDigits(17); 2996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString sBuf2; 3006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition fp2(0); 3018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius logln(UnicodeString("maxFractionDigits = ") + df->getMaximumFractionDigits()); 3026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru sBuf2 = df->format(d, sBuf2, fp2); 3036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if(sBuf2 != "100") 3046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(" format(d) = '" + sBuf2 + "'"); 3056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087245 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormatSymbols should be cloned in the ctor DecimalFormat. 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat(String, DecimalFormatSymbols). 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087245 (void) 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *symbols = new DecimalFormatSymbols(status); 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormatSymbols", ""); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} One note about this test: if you pass in a pointer 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // to the symbols, they are adopted and this test will fail, 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // even though that is the correct behavior. To test the cloning 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // of the symbols, it is necessary to pass in a reference to the symbols 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat("#,##0.0", *symbols, status); 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat with symbols", ""); 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t n = 123; 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buf1; 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buf2; 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("format(") + n + ") = " + 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(n, buf1, pos)); 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbols->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, UnicodeString((UChar)0x70)); // change value of field 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("format(") + n + ") = " + 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(n, buf2, pos)); 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(buf1 != buf2) 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4087245 failed"); 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete symbols; 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087535 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() incorrectly formats 0.0 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087535 (void) 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat", ""); 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMinimumIntegerDigits(0); 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double n = 0; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buffer; 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer = df->format(n, buffer, pos); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer.length() == 0) 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(/*n + */": '" + buffer + "'"); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru n = 0.1; 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer = df->format(n, buffer, pos); 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer.length() == 0) 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(/*n + */": '" + buffer + "'"); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4088503 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format fails when groupingSize is set to 0. 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} how do I tell if this worked? --> FieldPosition doesn't change ?? 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4088503 (void) 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat", ""); 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setGroupingSize(0); 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString sBuf; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition fp(FieldPosition::DONT_CARE); 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(df->format((int32_t)123, sBuf, fp)); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if(fp == FieldPosition(0)) 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // errln("Test for bug 4088503 failed."); 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4088503 failed."); 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4066646 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.getCurrencyInstance is wrong. 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4066646 (void) 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assignFloatValue(2.04f); 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assignFloatValue(2.03f); 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assignFloatValue(2.02f); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru assignFloatValue(0.0f); 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::assignFloatValue(float returnfloat) 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString(" VALUE ") + returnfloat); 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nfcommon = NumberFormat::createCurrencyInstance(Locale::getUS(), status); 4046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createCurrencyInstance", Locale::getUS(), TRUE)){ 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nfcommon; 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return returnfloat; 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfcommon->setGroupingUsed(FALSE); 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString stringValue; 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru stringValue = nfcommon->format(returnfloat, stringValue); 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(" DISPLAYVALUE " + stringValue); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable result; 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nfcommon->parse(stringValue, result, status); 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "nfcommon->parse", Locale::getUS()); 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru float floatResult = (float) (result.getType() == Formattable::kDouble 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? result.getDouble() : result.getLong()); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( uprv_fabs(floatResult - returnfloat) > 0.0001) 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //String stringValue = nfcommon.format(returnfloat).substring(1); 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if (Float.valueOf(stringValue).floatValue() != returnfloat) 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: expected ") + returnfloat + ", got " + floatResult + " (" + stringValue+")"); 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nfcommon; 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return returnfloat; 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} // End Of assignFloatValue() 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4059870 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat throws exception when parsing "0" 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4059870(void) 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *format = new DecimalFormat("00", status); 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new Decimalformat", Locale::getUS()); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable result; 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str; 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format->parse(UnicodeString("0"), result, status); 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "format->parse", Locale::getUS()); 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru catch (Exception e) { 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4059870 failed : " + e); 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete format; 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4083018 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormatSymbol.equals should always return false when 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * comparing with null. 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} this is silly in C++ 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4083018 (void) 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *dfs = new DecimalFormatSymbols(status); 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormatSymbols", Locale::getUS()); 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dfs != NULL) 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Test Passed!"); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4083018 failed"); 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4083018 failed => Message : " + foo.getMessage()); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dfs; 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071492 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat does not round up correctly. 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071492 (void) 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double x = 0.00159999; 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf = NumberFormat::createInstance(status); 4786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createInstance", Locale::getUS(), TRUE)) { 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->setMaximumFractionDigits(4); 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString out; 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out = nf->format(x, out, pos); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("0.00159999 formats with 4 fractional digits to " + out); 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expected("0.0016"); 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (out != expected) 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Expected " + expected); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4086575 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * A space as a group separator for localized pattern causes 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * wrong format. WorkAround : use non-breaking space. 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4086575(void) 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf1 = NumberFormat::createInstance(Locale::getFrance(), status); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TODO: There is not a good way to find out that the creation of this number format has 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // failed. Major rewiring of format construction proposed. 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 5066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Something is wrong with French number format - it should not fallback. Exitting - %s", u_errorName(status)); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf1; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createInstance", Locale::getFrance()); 51127f654740f2a26ad62a5c155af9199af9e69b889claireho 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // C++ workaround to make sure cast works 51327f654740f2a26ad62a5c155af9199af9e69b889claireho DecimalFormat *nf = dynamic_cast<DecimalFormat *>(nf1); 51427f654740f2a26ad62a5c155af9199af9e69b889claireho if(nf == NULL) { 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("NumberFormat::createInstance returned incorrect type."); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf toPattern1: " + nf->toPattern(temp)); 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf toLocPattern1: " + nf->toLocalizedPattern(temp)); 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // No group separator 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("...applyLocalizedPattern ###,00;(###,00) "); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->applyLocalizedPattern(UnicodeString("###,00;(###,00)"), status); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "nf->applyLocalizedPattern", Locale::getFrance()); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf toPattern2: " + nf->toPattern(temp)); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf toLocPattern2: " + nf->toLocalizedPattern(temp)); 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf: " + nf->format((int32_t)1234, temp, pos)); // 1234,00 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf: " + nf->format((int32_t)-1234, temp, pos)); // (1234,00) 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Space as group separator 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("...applyLocalizedPattern # ###,00;(# ###,00) "); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // nbsp = \u00a0 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //nf->applyLocalizedPattern("#\u00a0###,00;(#\u00a0###,00)"); 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar patChars[] = { 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x23, 0x00a0, 0x23, 0x23, 0x23, 0x2c, 0x30, 0x30, 0x3b, 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x28, 0x23, 0x00a0, 0x23, 0x23, 0x23, 0x2c, 0x30, 0x30, 0x29 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pat(patChars, 19, 19); 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->applyLocalizedPattern(pat, status); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "nf->applyLocalizedPattern", Locale::getFrance()); 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf toPattern2: " + nf->toPattern(temp)); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("nf toLocPattern2: " + nf->toLocalizedPattern(temp)); 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buffer; 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer = nf->format((int32_t)1234, buffer, pos); 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if (buffer != UnicodeString("1\u00a0234,00")) 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c[] = { 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x31, 0x00a0, 0x32, 0x33, 0x34, 0x2c, 0x30, 0x30 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString cc(c, 8, 8); 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer != cc) 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("nf : " + buffer); // Expect 1 234,00 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer.remove(); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer = nf->format((int32_t)-1234, buffer, pos); 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c1[] = { 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x28, 0x31, 0x00a0, 0x32, 0x33, 0x34, 0x2c, 0x30, 0x30, 0x29 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString cc1(c1, 10, 10); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer != cc1) 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("nf : " + buffer); // Expect (1 234,00) 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Erroneously prints: 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1234,00 , 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (1234,00 ,) 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf1; 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4068693 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse returns wrong value 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} slightly converted into a round-trip test, since in C++ 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// there is no Double.toString() 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4068693(void) 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("----- Test Application -----"); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pos(0); 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 5856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable d; 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //Double d = (Double)df.parse("123.55456", pos=new ParsePosition(0)); 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse(UnicodeString("123.55456"), d, pos); 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if (!d.toString().equals("123.55456")) { 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString dstr; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMaximumFractionDigits(999); 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMaximumIntegerDigits(999); 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition fp(FieldPosition::DONT_CARE); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dstr = df->format(d.getDouble(), dstr, fp); 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dstr != UnicodeString("123.55456")) { 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Result -> ") + d.getDouble()); 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4069754, 4067878 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * null pointer thrown when accessing a deserialized DecimalFormat 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * object. 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} doesn't apply in C++ 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4069754(void) 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* try { 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myformat it = new myformat(); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(it.Now()); 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FileOutputStream ostream = new FileOutputStream("t.tmp"); 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ObjectOutputStream p = new ObjectOutputStream(ostream); 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p.writeObject(it); 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ostream.close(); 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Saved ok."); 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FileInputStream istream = new FileInputStream("t.tmp"); 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ObjectInputStream p2 = new ObjectInputStream(istream); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru myformat it2 = (myformat)p2.readObject(); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(it2.Now()); 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru istream.close(); 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Loaded ok."); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } catch (Exception foo) { 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Test for bug 4069754 or 4057878 failed => Exception: " + foo.getMessage()); 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/} 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087251 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.applyPattern(String) allows illegal patterns 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087251 (void) 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 6416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->applyPattern(UnicodeString("#.#.#"), status); 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( ! U_FAILURE(status)) 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("df->applyPattern with illegal pattern didn't fail"); 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("toPattern() returns \"" + df->toPattern(temp) + "\""); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //errln("applyPattern(\"#.#.#\") doesn't throw IllegalArgumentException"); 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (IllegalArgumentException e) { 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Caught Illegal Argument Error !"); 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Second test; added 5/11/98 when reported to fail on 1.2b3 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->applyPattern("#0.0#0#0", status); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( ! U_FAILURE(status)) 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("df->applyPattern with illegal pattern didn't fail"); 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("toPattern() returns \"" + df->toPattern(temp) + "\""); 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //errln("applyPattern(\"#0.0#0#0\") doesn't throw IllegalArgumentException"); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (IllegalArgumentException e) { 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok - IllegalArgumentException for #0.0#0#0"); 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4090489 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() loses precision 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4090489 (void) 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} sprintf doesn't correctly handle the double, so there is nothing 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// that NumberFormat can do. For some reason, it does not format the last 1. 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* UErrorCode status = U_ZERO_ERROR; 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMinimumFractionDigits(10); 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMaximumFractionDigits(999); 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setGroupingUsed(FALSE); 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d = 1.000000000000001E7; 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //BigDecimal bd = new BigDecimal(d); 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString sb; 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition fp(0); 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("d = ") + d); 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //logln("BigDecimal.toString(): " + bd.toString()); 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(d, sb, fp); 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sb != "10000000.0000000100") { 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("DecimalFormat.format(): " + sb); 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4090504 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() loses precision 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4090504 (void) 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d = 1; 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("d = ") + d); 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 7076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString sb; 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition fp(FieldPosition::DONT_CARE); 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 17; i <= 20; i++) { 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMaximumFractionDigits(i); 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //sb = new StringBuffer(""); 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fp.setField(0); 719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln(UnicodeString(" getMaximumFractionDigits() = ") + i); 720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln(UnicodeString(" formated: ") + df->format(d, sb, fp)); 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Bug 4090504 regression test failed. Message : " + foo.getMessage()); 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4095713 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse(String str, ParsePosition pp) loses precision 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4095713 (void) 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 7366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str("0.1234"); 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d1 = 0.1234; 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //Double d1 = new Double(str); 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //Double d2 = (Double) df.parse(str, new ParsePosition(0)); 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable d2; 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pp(0); 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse(str, d2, pp); 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("") + d1); 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (d2.getDouble() != d1) 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Bug 4095713 test failed, new double value : ") + d2.getDouble()); 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4092561 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse() fails when multiplier is not set to 1 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} not sure what to do with this one 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4092561 (void) 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 7636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} going to cheat here and use sprintf ?? 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*UnicodeString str = Long.toString(Long.MIN_VALUE); 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Long.MIN_VALUE : " + df.parse(str, new ParsePosition(0)).toString()); 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df.setMultiplier(100); 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Number num = df.parse(str, new ParsePosition(0)); 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (num.doubleValue() != -9.223372036854776E16) 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Bug 4092561 test failed when multiplier is set to not 1."); 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4092480 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat: Negative format ignored. 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4092480 (void) 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *dfFoo = new DecimalFormat(UnicodeString("000"), status); 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 7896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dfFoo; 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dfFoo->applyPattern("0000;-000", status); 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "dfFoo->applyPattern"); 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dfFoo->toPattern(temp) != UnicodeString("#0000")) 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("dfFoo.toPattern : " + dfFoo->toPattern(temp)); 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)42, temp, pos)); 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)-42, temp, pos)); 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dfFoo->applyPattern("000;-000", status); 805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "dfFoo->applyPattern"); 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dfFoo->toPattern(temp) != UnicodeString("#000")) 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("dfFoo.toPattern : " + dfFoo->toPattern(temp)); 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)42,temp, pos)); 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)-42, temp, pos)); 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dfFoo->applyPattern("000;-0000", status); 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "dfFoo->applyPattern"); 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dfFoo->toPattern(temp) != UnicodeString("#000")) 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("dfFoo.toPattern : " + dfFoo->toPattern(temp)); 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)42, temp, pos)); 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)-42, temp, pos)); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dfFoo->applyPattern("0000;-000", status); 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "dfFoo->applyPattern"); 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (dfFoo->toPattern(temp) != UnicodeString("#0000")) 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("dfFoo.toPattern : " + dfFoo->toPattern(temp)); 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)42, temp, pos)); 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(dfFoo->format((int32_t)-42, temp, pos)); 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Message " + foo.getMessage()); 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete dfFoo; 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087244 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.getCurrencyInstance() produces format that uses 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * decimal separator instead of monetary decimal separator. 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Rewrote this test not to depend on the actual pattern. Pattern should 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * never contain the monetary separator! Decimal separator in pattern is 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * interpreted as monetary separator if currency symbol is seen! 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087244 (void) { 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[256] = {0}; 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("pt_PT_PREEURO", loc, 256, &status); 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale *de = new Locale(loc); 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf = NumberFormat::createCurrencyInstance(*de, status); 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 8456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 84927f654740f2a26ad62a5c155af9199af9e69b889claireho DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf); 85027f654740f2a26ad62a5c155af9199af9e69b889claireho if(df == NULL) { 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("expected DecimalFormat!"); 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DecimalFormatSymbols *sym = df->getDecimalFormatSymbols(); 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString decSep = sym->getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString monSep = sym->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (decSep == monSep) { 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("ERROR in test: want decimal sep != monetary sep"); 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMinimumIntegerDigits(1); 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMinimumFractionDigits(2); 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str; 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(1.23, str, pos); 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString monStr("1x23"); 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monStr.replace((int32_t)1, 1, monSep); 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString decStr("1x23"); 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decStr.replace((int32_t)1, 1, decSep); 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (str.indexOf(monStr) >= 0 && str.indexOf(decStr) < 0) { 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("OK: 1.23 -> \"") + str + "\" contains \"" + 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monStr + "\" and not \"" + decStr + '"'); 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: 1.23 -> \"") + str + "\", should contain \"" + 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monStr + 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\" and not \"" + decStr + '"'); 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete de; 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4070798 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Number format data rounding errors for locale FR 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4070798 (void) 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *formatter; 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempString; 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* User error : 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedDefault = "-5\u00a0789,987"; 891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru String expectedCurrency = "5\u00a0789,98\u00a0F"; 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedPercent = "-578\u00a0998%"; 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar chars1 [] = { 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2d, 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x38, 0x38 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar chars2 [] = { 898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x00a0, 0x46 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar chars3 [] = { 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2d, 0x35, 0x37, 0x38, 0x00a0, 0x39, 0x39, 0x39, 0x00a0, 0x25 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedDefault(chars1, 10, 10); 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedCurrency(chars2, 10, 10); 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedPercent(chars3, 10, 10); 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[256]={0}; 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); 91059d709d503bab6e2b61931737e662dd293b40578ccornelius (void)len; // Suppress set but not used warning. 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createInstance(Locale(loc), status); 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 9136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createNumberInstance", loc); 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedDefault) { 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4070798 default test passed."); 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedDefault + 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createCurrencyInstance(loc, status); 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createCurrencyInstance", loc); 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format( 5789.9876, tempString ); 933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedCurrency) { 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4070798 currency test passed."); 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedCurrency + 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status); 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createPercentInstance(Locale(loc), status); 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createPercentInstance", loc); 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedPercent) { 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4070798 percentage test passed."); 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedPercent + 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071005 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Data rounding errors for French (Canada) locale 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071005 (void) 963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *formatter; 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempString; 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* User error : 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedDefault = "-5\u00a0789,987"; 968c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru String expectedCurrency = "5\u00a0789,98\u00a0$"; 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedPercent = "-578\u00a0998%"; 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar chars1 [] = { 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2d, 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x38, 0x38 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar chars2 [] = { 975c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x00a0, 0x24 976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar chars3 [] = { 978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0x2d, 0x35, 0x37, 0x38, 0x00a0, 0x39, 0x39, 0x39, 0x00a0, 0x25 979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedDefault(chars1, 10, 10); 981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedCurrency(chars2, 10, 10); 982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedPercent(chars3, 10, 10); 983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createInstance(Locale::getCanadaFrench(), status); 9866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createNumberInstance", Locale::getCanadaFrench(), TRUE)){ 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedDefault) { 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071005 default test passed."); 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedDefault + 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createCurrencyInstance", Locale::getCanadaFrench()); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format( 5789.9876, tempString ); 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedCurrency) { 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071005 currency test assed."); 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedCurrency + 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createPercentInstance(Locale::getCanadaFrench(), status); 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createPercentInstance", Locale::getCanadaFrench()); 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedPercent) { 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071005 percentage test passed."); 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedPercent + 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071014 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Data rounding errors for German (Germany) locale 1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071014 (void) 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *formatter; 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempString; 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* user error : 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedDefault = "-5.789,987"; 1040b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho String expectedCurrency = "5.789,98 DEM"; 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedPercent = "-578.998%"; 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedDefault("-5.789,988"); 1044b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedCurrency("5.789,99\\u00A0DEM"); 1045c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UnicodeString expectedPercent("-578.999\\u00A0%"); 1046c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1047c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expectedCurrency = expectedCurrency.unescape(); 1048c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru expectedPercent = expectedPercent.unescape(); 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[256]={0}; 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createInstance(Locale(loc), status); 10546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createNumberInstance", loc, TRUE)){ 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedDefault) { 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071014 default test passed."); 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedDefault + 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("de_DE_PREEURO", loc, 256, &status); 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createCurrencyInstance(Locale(loc), status); 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createCurrencyInstance", loc); 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format( 5789.9876, tempString ); 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedCurrency) { 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071014 currency test assed."); 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedCurrency + 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createPercentInstance(Locale::getGermany(), status); 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createPercentInstance", Locale::getGermany()); 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedPercent) { 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071014 percentage test passed."); 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedPercent + 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071859 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Data rounding errors for Italian locale number formats 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071859 (void) 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *formatter; 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempString; 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* user error : 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedDefault = "-5.789,987"; 1108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru String expectedCurrency = "-L.\\u00A05.789,98"; 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String expectedPercent = "-578.998%"; 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedDefault("-5.789,988"); 1112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString expectedCurrency("-ITL\\u00A05.790", -1, US_INV); 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString expectedPercent("-578.999%"); 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expectedCurrency = expectedCurrency.unescape(); 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char loc[256]={0}; 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createInstance(Locale(loc), status); 11206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createNumberInstance", TRUE)){ 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedDefault) { 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071859 default test passed."); 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedDefault + 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createCurrencyInstance(Locale(loc), status); 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createCurrencyInstance"); 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format( -5789.9876, tempString ); 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedCurrency) { 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071859 currency test assed."); 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedCurrency + 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uloc_canonicalize("it_IT_PREEURO", loc, 256, &status); 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatter = NumberFormat::createPercentInstance(Locale(loc), status); 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createPercentInstance"); 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString.remove(); 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = formatter->format (-5789.9876, tempString); 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString == expectedPercent) { 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln ("Bug 4071859 percentage test passed."); 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Failed:") + 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Expected " + expectedPercent + 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " Received " + tempString ); 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatter; 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071859 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test rounding for nearest even. 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4093610(void) 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat("#0.#", status); 11716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "new DecimalFormat")) { 11726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString s("12.4"); 11736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.35, s); 11746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.45, s); 11756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = "12.5"; 11766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.452,s); 11776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = "12.6"; 11786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.55, s); 11796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.65, s); 11806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = "12.7"; 11816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.652,s); 11826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = "12.8"; 11836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.75, s); 11846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.752,s); 11856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.85, s); 11866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = "12.9"; 11876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.852,s); 11886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = "13"; 11896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.95, s); 11906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru roundingTest(df, 12.952,s); 11916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::roundingTest(DecimalFormat *df, double x, UnicodeString& expected) 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString out; 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out = df->format(x, out, pos); 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("") + x + " formats with 1 fractional digits to " + out); 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (out != expected) 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: Expected " + expected); 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4098741 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests the setMaximumFractionDigits limit. 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4098741(void) 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *fmt = NumberFormat::createPercentInstance(status); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dataerrln("Error calling NumberFormat::createPercentInstance"); 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->setMaximumFractionDigits(20); 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(fmt->format(.001, temp)); 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Bug 4098471 failed with exception thrown : " + foo.getMessage()); 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4074454 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests illegal pattern exception. 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Fix comment : HShih A31 Part1 will not be fixed and javadoc needs to be updated. 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Part2 has been fixed. 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4074454(void) 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt = new DecimalFormat("#,#00.00;-#.#", status); 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 12386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Inconsistent negative pattern is fine."); 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *newFmt = new DecimalFormat("#,#00.00 p''ieces;-#,#00.00 p''ieces", status); 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString tempString; 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru tempString = newFmt->format(3456.78, tempString, pos); 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tempString != UnicodeString("3,456.78 p'ieces")) 125027f654740f2a26ad62a5c155af9199af9e69b889claireho dataerrln("Failed! 3456.78 p'ieces expected, but got : " + tempString); 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("An exception was thrown for any inconsistent negative pattern."); 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete newFmt; 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4099404 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests all different comments. 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Response to some comments : 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [1] DecimalFormat.parse API documentation is more than just one line. 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is not a reproducable doc error in 116 source code. 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [2] See updated javadoc. 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [3] Fixed. 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [4] NumberFormat.parse(String, ParsePosition) : If parsing fails, 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a null object will be returned. The unchanged parse position also 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * reflects an error. 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.parse(String) : If parsing fails, an ParseException 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * will be thrown. 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See updated javadoc for more details. 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [5] See updated javadoc. 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [6] See updated javadoc. 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [7] This is a correct behavior if the DateFormat object is linient. 1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Otherwise, an IllegalArgumentException will be thrown when formatting 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "January 35". See GregorianCalendar class javadoc for more details. 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4099404(void) 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt = new DecimalFormat(UnicodeString("000.0#0"), status); 1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(! U_FAILURE(status)) 1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Bug 4099404 failed applying illegal pattern \"000.0#0\"")); 1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Bug 4099404 pattern \"000.0#0\" passed"); 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt = 0; 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt = new DecimalFormat(UnicodeString("0#0.000"), status); 1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( !U_FAILURE(status)) 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Bug 4099404 failed applying illegal pattern \"0#0.000\""); 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (Exception foo) { 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Bug 4099404 pattern \"0#0.000\" passed"); 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4101481 1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.applyPattern doesn't set minimum integer digits 1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4101481(void) 1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *sdf = new DecimalFormat(UnicodeString("#,##0"), status); 1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 13076d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete sdf; 1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sdf->getMinimumIntegerDigits() != 1) 13138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("Minimum integer digits : ") + sdf->getMinimumIntegerDigits()); 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete sdf; 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4052223 (API addition request A27) 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests ParsePosition.setErrorPosition() and ParsePosition.getErrorPosition(). 1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4052223(void) 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt = new DecimalFormat(UnicodeString("#,#00.00"), status); 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 13256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable num; 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->parse(UnicodeString("abc3"), num, status); 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(! U_FAILURE(status)) 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Bug 4052223 failed : can't parse string \"a\". Got ") /*+ num*/); 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} catch (ParseException foo) { 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Caught expected ParseException : " + foo.getMessage() + " at index : " + foo.getErrorOffset()); 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4061302 1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * API tests for API addition request A9. 1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4061302(void) 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *fmt = new DecimalFormatSymbols(status); 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormatSymbols"); 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString currency(fmt->getSymbol(DecimalFormatSymbols::kCurrencySymbol)); 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString intlCurrency(fmt->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString monDecSeparator(fmt->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol)); 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (currency == UnicodeString("") || 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intlCurrency == UnicodeString("") || 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monDecSeparator == UnicodeString("")) 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("getCurrencySymbols failed, got empty string."); 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString monDecSeparatorStr; 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monDecSeparatorStr.append(monDecSeparator); 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln((UnicodeString)"Before set ==> Currency : " + currency +(UnicodeString)" Intl Currency : " + intlCurrency + (UnicodeString)" Monetary Decimal Separator : " + monDecSeparatorStr); 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->setSymbol(DecimalFormatSymbols::kCurrencySymbol, UnicodeString("XYZ")); 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, UnicodeString("ABC")); 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, UnicodeString((UChar)0x002A/*'*'*/)); 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru currency = fmt->getSymbol(DecimalFormatSymbols::kCurrencySymbol); 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intlCurrency = fmt->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monDecSeparator = fmt->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (currency != UnicodeString("XYZ") || 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru intlCurrency != UnicodeString("ABC") || 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monDecSeparator != UnicodeString((UChar)0x002A/*'*'*/)) { 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("setCurrencySymbols failed."); 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monDecSeparatorStr.remove(); 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru monDecSeparatorStr.append(monDecSeparator); 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("After set ==> Currency : " + currency + " Intl Currency : " + intlCurrency + " Monetary Decimal Separator : " + monDecSeparatorStr); 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4062486 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * API tests for API addition request A23. FieldPosition.getBeginIndex and 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * FieldPosition.getEndIndex. 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4062486(void) 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt = new DecimalFormat(UnicodeString("#,##0.00"), status); 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString formatted; 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition field(0); 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double num = 1234.5; 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->format(num, formatted, field); 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (field.getBeginIndex() != 0 && field.getEndIndex() != 5) 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Format 1234.5 failed. Begin index: ") /*+ field.getBeginIndex() + " End index: " + field.getEndIndex()*/); 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field.setBeginIndex(7); 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru field.setEndIndex(4); 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (field.getBeginIndex() != 7 && field.getEndIndex() != 4) 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Set begin/end field indexes failed. Begin index: " /*+ field.getBeginIndex() + " End index: " + field.getEndIndex()*/); 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4108738 1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse incorrectly works with a group separator. 1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4108738(void) 1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getUS(), status); 1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormatSymbols"); 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat("#,##0.###", syms, status); 1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 14096d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString text("1.222,111"); 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable num; 1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pp(0); 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse(text, num, pp); 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} how to do this (again) ? 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // shouldn't just be another round-trip test, should it? 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = df->format(num.getDouble(), temp, pos); 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if (!num.toString().equals("1.222")) 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (temp != UnicodeString("1.222")) 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //errln("\"" + text + "\" is parsed as " + num); 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("\"" + text + "\" is parsed as " + temp); 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text = UnicodeString("1.222x111"); 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pp = ParsePosition(0); 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse(text, num, pp); 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp.remove(); 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru temp = df->format(num.getDouble(), temp, pos); 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if (!num.toString().equals("1.222")) 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (temp != UnicodeString("1.222")) 1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("\"" + text + "\" is parsed as " + temp); 1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106658 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() incorrectly formats negative doubles. 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106658(void) 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); // Corrected; see 4147706 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 14486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru volatile double d1 = 0.0; // volatile to prevent code optimization 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d2 = -0.0001; 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buffer; 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_HPUX 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword 1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d1 *= -1.0; // Some compilers have a problem with defining -0.0 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("pattern: \"" + df->toPattern(temp) + "\""); 1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(d1, buffer, pos); 1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer != UnicodeString("-0")) // Corrected; see 4147706 1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("") + d1 + " is formatted as " + buffer); 1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buffer.remove(); 1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(d2, buffer, pos); 1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer != UnicodeString("-0")) // Corrected; see 4147706 1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("") + d2 + " is formatted as " + buffer); 1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106662 1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse returns 0 if string parameter is incorrect. 1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106662(void) 1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 14846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString text("x"); 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pos1(0), pos2(0); 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("pattern: \"" + df->toPattern(temp) + "\""); 1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable num; 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse(text, num, pos1); 1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos1 == ParsePosition(0)/*num != null*/) { 1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Test Failed: \"") + text + "\" is parsed as " /*+ num*/); 1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df = new DecimalFormat(UnicodeString("$###.00"), status); 1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse(UnicodeString("$"), num, pos2); 1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos2 == ParsePosition(0) /*num != null*/){ 1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Test Failed: \"$\" is parsed as ") /*+ num*/); 1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4114639 (duplicate of 4106662) 1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.parse doesn't return null 1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4114639(void) 1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *format = NumberFormat::createInstance(status); 1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 15186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); 1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete format; 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createInstance"); 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString text("time 10:x"); 1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pos(8); 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable result; 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru format->parse(text, result, pos); 1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (/*result != null*/pos.getErrorIndex() != 8) 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Should return null but got : ") /*+ result*/); // Should be null; it isn't 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete format; 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106664 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TODO: this test does not work because we need to use a 64 bit number and a 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a double only MAY only have 52 bits of precision. 1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format(long n) fails if n * multiplier > MAX_LONG. 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106664(void) 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 15436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} long in java is 64 bits 1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*long*/double n = 1234567890123456.0; 1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*int*/int32_t m = 12345678; 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} will this work? 1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //BigInteger bigN = BigInteger.valueOf(n); 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //bigN = bigN.multiply(BigInteger.valueOf(m)); 1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double bigN = n * m; 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setMultiplier(m); 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setGroupingUsed(FALSE); 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("formated: " + 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(n, temp, pos)); 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buf [128]; 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(buf, "%g", bigN); 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //logln("expected: " + bigN.toString()); 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("expected: ") + buf); 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106667 (duplicate of 4106658) 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format incorrectly formats -0.0. 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106667(void) 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(status); 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 15776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar foo [] = { 0x002B }; 1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString bar(foo, 1, 1); 1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru volatile double d = 0.0; // volatile to prevent code optimization 1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buffer; 1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("pattern: \"" + df->toPattern(temp) + "\""); 1590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_HPUX 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d *= -1.0; // Some compilers have a problem with defining -0.0 1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setPositivePrefix(/*"+"*/bar); 1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(d, buffer, pos); 1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buffer != UnicodeString("-0")) // Corrected; see 4147706 1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(/*d + */UnicodeString(" is formatted as ") + buffer); 1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4110936 1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.setMaximumIntegerDigits() works incorrectly. 1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_OS390 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define MAX_INT_DIGITS 70 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru# define MAX_INT_DIGITS 128 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4110936(void) 1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf = NumberFormat::createInstance(status); 1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 16176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Error creating DecimalFormat: %s", u_errorName(status)); 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "NumberFormat::createInstance"); 1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->setMaximumIntegerDigits(MAX_INT_DIGITS); 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("setMaximumIntegerDigits(MAX_INT_DIGITS)"); 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nf->getMaximumIntegerDigits() != MAX_INT_DIGITS) 16258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius errln(UnicodeString("getMaximumIntegerDigits() returns ") + 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->getMaximumIntegerDigits()); 1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4122840 1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Locale data should use generic currency symbol 1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1) Make sure that all currency formats use the generic currency symbol. 1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2) Make sure we get the same results using the generic symbol or a 1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * hard-coded one. 1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4122840(void) 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = 0; 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale *locales = Locale::getAvailableLocales(count); 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i = 0; i < count; i++) { 1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ResourceBundle *rb = new ResourceBundle( 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NULL/*"java.text.resources.LocaleElements"*/, 1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru locales[i], status); 1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new ResourceBundle"); 164927f654740f2a26ad62a5c155af9199af9e69b889claireho ResourceBundle numPat = rb->getWithFallback("NumberElements", status); 165027f654740f2a26ad62a5c155af9199af9e69b889claireho failure(status, "rb.get(NumberElements)"); 165127f654740f2a26ad62a5c155af9199af9e69b889claireho numPat = numPat.getWithFallback("latn",status); 165227f654740f2a26ad62a5c155af9199af9e69b889claireho failure(status, "rb.get(latn)"); 165327f654740f2a26ad62a5c155af9199af9e69b889claireho numPat = numPat.getWithFallback("patterns",status); 165427f654740f2a26ad62a5c155af9199af9e69b889claireho failure(status, "rb.get(patterns)"); 165527f654740f2a26ad62a5c155af9199af9e69b889claireho numPat = numPat.getWithFallback("currencyFormat",status); 165627f654740f2a26ad62a5c155af9199af9e69b889claireho failure(status, "rb.get(currencyFormat)"); 165727f654740f2a26ad62a5c155af9199af9e69b889claireho // 1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Get the currency pattern for this locale. We have to fish it 1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // out of the ResourceBundle directly, since DecimalFormat.toPattern 1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // will return the localized symbol, not \00a4 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 166227f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString pattern = numPat.getString(status); 166327f654740f2a26ad62a5c155af9199af9e69b889claireho failure(status, "rb->getString()"); 1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar fo[] = { 0x00A4 }; 1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString foo(fo, 1, 1); 1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if (pattern.indexOf("\u00A4") == -1 ) { 1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pattern.indexOf(foo) == -1 ) { 1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Currency format for ") + UnicodeString(locales[i].getName()) + 1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " does not contain generic currency symbol:" + 1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern ); 1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Create a DecimalFormat using the pattern we got and format a number 1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *symbols = new DecimalFormatSymbols(locales[i], status); 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormatSymbols"); 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt1 = new DecimalFormat(pattern, *symbols, status); 1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result1; 1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result1 = fmt1->format(1.111, result1, pos); 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Now substitute in the locale's currency symbol and create another 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pattern. We have to skip locales where the currency symbol 1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // contains decimal separators, because that confuses things 1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar ba[] = { 0x002E/*'.'*/ }; 1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString bar(ba, 1, 1); 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbols->getSymbol(DecimalFormatSymbols::kCurrencySymbol).indexOf(bar) == -1) { 1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} Also, switch the decimal separator to the monetary decimal 1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // separator to mimic the behavior of a currency format 1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbols->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbols->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol)); 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString buf(pattern); 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int j = 0; j < buf.length(); j++) { 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (buf[j] == 0x00a4 ) { 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(buf[j + 1] == 0x00a4) { 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {sfb} added to support double currency marker (intl currency sign) 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.replace(j, /*j+*/2, symbols->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j += symbols->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol).length(); 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.replace(j, /*j+*/1, symbols->getSymbol(DecimalFormatSymbols::kCurrencySymbol)); 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j += symbols->getSymbol(DecimalFormatSymbols::kCurrencySymbol).length() - 1; 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt2 = new DecimalFormat(buf, *symbols, status); 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Get the currency (if there is one) so we can set the rounding and fraction 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *currency = fmt1->getCurrency(); 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*currency != 0) { 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double rounding = ucurr_getRoundingIncrement(currency, &status); 1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t frac = ucurr_getDefaultFractionDigits(currency, &status); 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt2->setRoundingIncrement(rounding); 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt2->setMinimumFractionDigits(frac); 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt2->setMaximumFractionDigits(frac); 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "Fetching currency rounding/fractions"); 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result2; 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt2->format(1.111, result2, pos); 1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (result1 != result2) { 1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Results for " + (UnicodeString)(locales[i].getName()) + " differ: " + 1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result1 + " vs " + result2); 1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt2; 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete rb; 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt1; 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete symbols; 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4125885 1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() delivers wrong string. 1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4125885(void) 1753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double rate = 12.34; 1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *formatDec = new DecimalFormat ("000.00", status); 1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 17586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status)); 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatDec; 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("toPattern: " + formatDec->toPattern(temp)); 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rateString; 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rateString = formatDec->format(rate, rateString, pos); 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rateString != UnicodeString("012.34")) 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("result : " + rateString + " expected : 012.34"); 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rate = 0.1234; 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatDec;// = null; 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru formatDec = new DecimalFormat ("+000.00%;-000.00%", status); 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("toPattern: " + formatDec->toPattern(temp)); 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rateString.remove(); 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rateString = formatDec->format(rate, rateString, pos); 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rateString != UnicodeString("+012.34%")) 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("result : " + rateString + " expected : +012.34%"); 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete formatDec; 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4134034 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat produces extra zeros when formatting numbers. 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4134034(void) 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *nf = new DecimalFormat("##,###,###.00", status); 17916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "new DecimalFormat")) { 17926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString f; 17936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 17946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru f = nf->format(9.02, f, pos); 17956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (f == UnicodeString("9.02")) 17966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln(f + " ok"); 17976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru else 17986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln("9.02 -> " + f + "; want 9.02"); 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru f.remove(); 18016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru f = nf->format((int32_t)0, f, pos); 18026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (f == UnicodeString(".00")) 18036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln(f + " ok"); 18046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru else 18056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln("0 -> " + f + "; want .00"); 18066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4134300 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CANNOT REPRODUCE - This bug could not be reproduced. It may be 1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a duplicate of 4134034. 1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * JDK 1.1.6 Bug, did NOT occur in 1.1.5 1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Possibly related to bug 4125885. 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This class demonstrates a regression in version 1.1.6 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of DecimalFormat class. 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1.1.6 Results 1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #.00 Result '01.20' !!!wrong 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 0.00 Result '001.20' !!!wrong 1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 00.00 Result '0001.20' !!!wrong 1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.0# Result '1.2' 1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.00 Result '001.20' !!!wrong 1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1.1.5 Results 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #.00 Result '1.20' 1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 0.00 Result '1.20' 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 00.00 Result '01.20' 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.0# Result '1.2' 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.00 Result '1.20' 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4134300(void) { 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString DATA [] = { 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Pattern Expected string 1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("#.00"), UnicodeString("1.20"), 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("0.00"), UnicodeString("1.20"), 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("00.00"), UnicodeString("01.20"), 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("#0.0#"), UnicodeString("1.2"), 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("#0.00"), UnicodeString("1.20") 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i< 10; i+=2) { 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString result; 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat(DATA[i], status); 18506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "new DecimalFormat")) { 18516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 18526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru result = df->format(1.2, result, pos); 18536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (result != DATA[i+1]) { 18546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln("Fail: 1.2 x " + DATA[i] + " = " + result + 18556d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru "; want " + DATA[i+1]); 18566d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 18576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru else { 18586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln("Ok: 1.2 x " + DATA[i] + " = " + result); 18596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4140009 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Empty pattern produces double negative prefix. 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4140009(void) 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getEnglish(), status); 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormatSymbols"); 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *f = new DecimalFormat(UnicodeString(""), syms, status); 18766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "new DecimalFormat")) { 18776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString s; 18786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 18796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = f->format(123.456, s, pos); 18806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (s != UnicodeString("123.456")) 18816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln("Fail: Format empty pattern x 123.456 => " + s); 18826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s.remove(); 18836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s = f->format(-123.456, s, pos); 18846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (s != UnicodeString("-123.456")) 18856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln("Fail: Format empty pattern x -123.456 => " + s); 18866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete f; 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4141750 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * BigDecimal numbers get their fractions truncated by NumberFormat. 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} not pertinent in C++ ?? 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4141750(void) { 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*try { 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str("12345.67"); 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BigDecimal bd = new BigDecimal(str); 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String sd = NumberFormat.getInstance(Locale.US).format(bd); 1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!sd.endsWith("67")) errln("Fail: " + str + " x format -> " + sd); 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru catch (Exception e) { 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(e.toString()); 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru e.printStackTrace(); 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4145457 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat toPattern() doesn't quote special characters or handle 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * single quotes. 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4145457() { 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nff = NumberFormat::createInstance(status); 19176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createInstance", TRUE)){ 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nff; 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 192127f654740f2a26ad62a5c155af9199af9e69b889claireho DecimalFormat *nf = dynamic_cast<DecimalFormat *>(nff); 192227f654740f2a26ad62a5c155af9199af9e69b889claireho if(nf == NULL) { 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("DecimalFormat needed to continue"); 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *sym = (DecimalFormatSymbols*) nf->getDecimalFormatSymbols(); 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, (UChar)/*'\''*/0x0027); 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->setDecimalFormatSymbols(*sym); 1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double pi = 3.14159; 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString PATS [] = { 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("#.00 'num''ber'"), UnicodeString("''#.00''") 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<2; ++i) { 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->applyPattern(PATS[i], status); 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "nf->applyPattern"); 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString out; 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out = nf->format(pi, out, pos); 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pat; 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pat = nf->toPattern(pat); 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable num; 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pp(0); 1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->parse(out, num, pp); 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double val = num.getDouble(); 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->applyPattern(pat, status); 1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "nf->applyPattern"); 1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString out2; 1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out2 = nf->format(pi, out2, pos); 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pat2; 1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pat2 = nf->toPattern(pat2); 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pp.setIndex(0); 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->parse(out2, num, pp); 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double val2 = num.getDouble(); 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pat != pat2) 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Fail with \"" + PATS[i] + "\": Patterns should concur, \"" + 1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pat + "\" vs. \"" + pat2 + "\""); 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Ok \"" + PATS[i] + "\" toPattern() -> \"" + pat + '"'); 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (val == val2 && out == out2) { 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok ") + pi + " x \"" + PATS[i] + "\" -> \"" + 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out + "\" -> " + val + " -> \"" + 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out2 + "\" -> " + val2); 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("Fail ") + pi + " x \"" + PATS[i] + "\" -> \"" + 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out + "\" -> " + val + " -> \"" + 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru out2 + "\" -> " + val2); 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*} 1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru catch (ParseException e) { 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Fail: " + e); 1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru e.printStackTrace(); 1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }*/ 1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nff; 1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147295 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.applyPattern() sets minimum integer digits incorrectly. 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CANNOT REPRODUCE 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This bug is a duplicate of 4139344, which is a duplicate of 4134300 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4147295(void) 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *sdf = new DecimalFormat(status); 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pattern("#,###"); 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Applying pattern \"" + pattern + "\""); 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sdf->applyPattern(pattern, status); 19986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "sdf->applyPattern")) { 19996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru int minIntDig = sdf->getMinimumIntegerDigits(); 20006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (minIntDig != 0) { 20016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln("Test failed"); 2002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln(UnicodeString(" Minimum integer digits : ") + minIntDig); 20036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString temp; 2004b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln(UnicodeString(" new pattern: ") + sdf->toPattern(temp)); 20056d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 20066d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln("Test passed"); 2007b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho logln(UnicodeString(" Minimum integer digits : ") + minIntDig); 20086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete sdf; 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147706 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat formats -0.0 as +0.0 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See also older related bug 4106658, 4106667 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4147706(void) 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = new DecimalFormat("#,##0.0##", status); 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "new DecimalFormat"); 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getEnglish(), status); 20246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "new DecimalFormatSymbols")) { 20256d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString f1; 20266d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString f2, temp; 20276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition pos(FieldPosition::DONT_CARE); 20286d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru volatile double d1 = 0.0; // volatile to prevent code optimization 20296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru double d2 = -0.0001; 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2031103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM == U_PF_HPUX 20326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru d1 = 0.0 * -1.0; // old HPUX compiler ignores volatile keyword 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 20346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru d1 *= -1.0; // Some compilers have a problem with defining -0.0 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 20366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru df->adoptDecimalFormatSymbols(syms); 20376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru f1 = df->format(d1, f1, pos); 20386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru f2 = df->format(d2, f2, pos); 20396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (f1 != UnicodeString("-0.0")) { 20406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(UnicodeString("") + d1 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f1 + '"'); 20416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 20426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (f2 != UnicodeString("-0.0")) { 20436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(UnicodeString("") + d2 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f2 + '"'); 20446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 20466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Not applicable, since no serialization in C++ 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*class myformat implements Serializable 2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat _dateFormat = DateFormat.getDateInstance(); 2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic String Now() 2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru GregorianCalendar calendar = new GregorianCalendar(); 2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Date t = calendar.getTime(); 2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru String nowStr = _dateFormat.format(t); 2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return nowStr; 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}*/ 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4162198 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat cannot format Double.MAX_VALUE 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TODO: make this test actually test something 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::Test4162198(void) 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // for some reason, DBL_MAX will not round trip. (bug in sprintf/atof) 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double dbl = INT32_MAX * 1000.0; 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *f = NumberFormat::createInstance(status); 2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 20786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Couldn't create number format - %s", u_errorName(status)); 2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f->setMaximumFractionDigits(INT32_MAX); 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f->setMaximumIntegerDigits(INT32_MAX); 2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f->format(dbl,s); 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("The number ") + dbl + " formatted to " + s); 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable n; 2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //try { 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f->parse(s, n, status); 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Couldn't parse!"); 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //} catch (java.text.ParseException e) { 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // errln("Caught a ParseException:"); 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // e.printStackTrace(); 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //} 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //logln("The string " + s + " parsed as " + n); 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // {dlf} The old code assumes n is a double, but it isn't any more... 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Formattable apparently does not and never did interconvert... too bad. 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //if(n.getDouble() != dbl) { 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // errln("Round trip failure"); 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //} 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (n.getInt64() != dbl) { 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Round trip failure"); 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete f; 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4162852 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat does not parse negative zero. 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::Test4162852(void) 2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int32_t i=0; i < 2; ++i) { 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *f = (i == 0) ? NumberFormat::createInstance(status) 2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : NumberFormat::createPercentInstance(status); 2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 21226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("Couldn't create number format - %s", u_errorName(status)); 2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d = 0.0; 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d *= -1.0; 2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f->format(d, s); 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable n; 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f->parse(s, n, status); 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) 2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("Couldn't parse!"); 2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double e = n.getDouble(); 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("") + 2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru d + " -> " + 2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru '"' + s + '"' + " -> " + e); 2137103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if (U_PLATFORM == U_PF_OS390 && !defined(IEEE_754)) || U_PLATFORM == U_PF_OS400 2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (e != 0.0) { 2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else 2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (e != 0.0 || 1.0/e > 0.0) { 2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln("Failed to parse negative zero"); 2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete f; 2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic double _u_abs(double a) { return a<0?-a:a; } 2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4167494 2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat truncates data 2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4167494(void) { 2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status); 21586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createInstance", TRUE)){ 2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double a = DBL_MAX * 0.99; // DBL_MAX itself overflows to +Inf 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->format(a, s); 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable num; 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->parse(s, num, status); 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "Parse"); 2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (num.getType() == Formattable::kDouble && 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru _u_abs(num.getDouble() - a) / a < 0.01) { // RT within 1% 2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("") + a + " -> \"" + s + "\" -> " + 2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toString(num) + " ok"); 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("") + a + " -> \"" + s + "\" -> " + 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toString(num) + " FAIL"); 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We don't test Double.MIN_VALUE because the locale data for the US 2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // currently doesn't specify enough digits to display Double.MIN_VALUE. 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This is correct for now; however, we leave this here as a reminder 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // in case we want to address this later. 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4170798 2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse() fails when ParseIntegerOnly set to true 2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4170798(void) { 2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status); 21946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "NumberFormat::createInstance", TRUE)){ 2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 219827f654740f2a26ad62a5c155af9199af9e69b889claireho DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf); 219927f654740f2a26ad62a5c155af9199af9e69b889claireho if(df == NULL) { 2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("DecimalFormat needed to continue"); 2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setParseIntegerOnly(TRUE); 2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable n; 2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition pos(0); 2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->parse("-0.0", n, pos); 2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (n.getType() != Formattable::kLong 2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || n.getLong() != 0) { 2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: parse(\"-0.0\") returns ") + toString(n)); 2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * toPattern only puts the first grouping separator in. 2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4176114(void) { 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "00", "#00", 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "000", "#000", // No grouping 2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#000", "#000", // No grouping 2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#,##0", "#,##0", 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "#,000", "#,000", 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0,000", "#0,000", 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "00,000", "#00,000", 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "000,000", "#,000,000", 2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0,000,000,000,000.0000", "#0,000,000,000,000.0000", // Reported 2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0])); 2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<DATA_length; i+=2) { 2234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat df(DATA[i], status); 22356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "DecimalFormat constructor")) { 22366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru df.toPattern(s); 22376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString exp(DATA[i+1]); 22386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (s != exp) { 22396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(UnicodeString("FAIL: ") + DATA[i] + " -> " + 22406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru s + ", want " + exp); 22416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4179818 2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat is incorrectly rounding numbers like 1.2501 to 1.2 2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4179818(void) { 2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* DATA[] = { 2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Input Pattern Expected output 2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "1.2511", "#.#", "1.3", 2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "1.2501", "#.#", "1.3", 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "0.9999", "#", "1", 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0])); 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double DOUBLE[] = { 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1.2511, 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1.2501, 2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0.9999, 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols sym(Locale::getUS(), status); 2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "Construct DecimalFormatSymbols"); 2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat fmt("#", sym, status); 22686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "Construct DecimalFormat")) { 22696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru for (int i=0; i<DATA_length; i+=3) { 22706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru double in = DOUBLE[i/3]; 22716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString pat(DATA[i+1]); 22726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString exp(DATA[i+2]); 22736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru fmt.applyPattern(pat, status); 22746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru failure(status, "applyPattern"); 22756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString out; 22766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition pos; 22776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru fmt.format(in, out, pos); 22786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (out == exp) { 22796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln(UnicodeString("Ok: ") + in + " x " + pat + " = " + out); 22806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 22816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(UnicodeString("FAIL: ") + in + " x " + pat + " = " + out + 22826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru ", expected " + exp); 22836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Some DecimalFormatSymbols changes are not picked up by DecimalFormat. 2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This includes the minus sign, currency symbol, international currency 2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * symbol, percent, and permille. This is filed as bugs 4212072 and 2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4212073. 2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4212072(void) { 2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols sym(Locale::getUS(), status); 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "DecimalFormatSymbols ct", Locale::getUS()); 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat fmt(UnicodeString("#"), sym, status); 23016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if(failure(status, "DecimalFormat ct", Locale::getUS())) { 23026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return; 23036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, (UChar)0x5e); 2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.setDecimalFormatSymbols(sym); 2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.format((int32_t)-1, s, pos) != UNICODE_STRING("^1", 2)) { 2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: -1 x (minus=^) -> ") + s + 2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", exp ^1"); 2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.getNegativePrefix(s) != UnicodeString((UChar)0x5e)) { 2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: (minus=^).getNegativePrefix -> ") + 2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s + ", exp ^"); 2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, (UChar)0x2d); 2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.applyPattern(UnicodeString("#%"), status); 2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "applyPattern percent"); 2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UChar)0x5e); 2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.setDecimalFormatSymbols(sym); 2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.format(0.25, s, pos) != UNICODE_STRING("25^", 3)) { 2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: 0.25 x (percent=^) -> ") + s + 2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", exp 25^"); 2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.getPositiveSuffix(s) != UnicodeString((UChar)0x5e)) { 2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: (percent=^).getPositiveSuffix -> ") + 2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s + ", exp ^"); 2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UChar)0x25); 2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.applyPattern(str("#\\u2030"), status); 2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "applyPattern permill"); 2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, (UChar)0x5e); 2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.setDecimalFormatSymbols(sym); 2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.format(0.25, s, pos) != UNICODE_STRING("250^", 4)) { 2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: 0.25 x (permill=^) -> ") + s + 2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", exp 250^"); 2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.getPositiveSuffix(s) != UnicodeString((UChar)0x5e)) { 2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: (permill=^).getPositiveSuffix -> ") + 2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s + ", exp ^"); 2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, (UChar)0x2030); 2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.applyPattern(str("\\u00A4#.00"), status); 2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "applyPattern currency"); 2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "usd"); 2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.setDecimalFormatSymbols(sym); 2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.format(12.5, s, pos) != UnicodeString("usd12.50")) { 2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: 12.5 x (currency=usd) -> ") + s + 2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", exp usd12.50"); 2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.getPositivePrefix(s) != UnicodeString("usd")) { 2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: (currency=usd).getPositivePrefix -> ") + 2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s + ", exp usd"); 2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "$"); 2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.applyPattern(str("\\u00A4\\u00A4#.00"), status); 2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "applyPattern intl currency"); 2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, "DOL"); 2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.setDecimalFormatSymbols(sym); 2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.format(12.5, s, pos) != UnicodeString("DOL12.50")) { 2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: 12.5 x (intlcurrency=DOL) -> ") + s + 2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", exp DOL12.50"); 2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s.remove(); 2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fmt.getPositivePrefix(s) != UnicodeString("DOL")) { 2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: (intlcurrency=DOL).getPositivePrefix -> ") + 2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru s + ", exp DOL"); 2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sym.setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, "USD"); 2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Since the pattern logic has changed, make sure that patterns round 2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // trip properly. Test stream in/out integrity too. 2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t n; 2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const Locale* avail = NumberFormat::getAvailableLocales(n); 2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char* type[] = { 2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "", 2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "$ ", 2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "% ", 2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<n; ++i) { 2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int j=0; j<3; ++j) { 2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf; 2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (j) { 2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0: 2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf = NumberFormat::createInstance(avail[i], status); 2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "createInstance", avail[i]); 2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 1: 2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf = NumberFormat::createCurrencyInstance(avail[i], status); 2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "createCurrencyInstance", avail[i]); 2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf = NumberFormat::createPercentInstance(avail[i], status); 2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "createPercentInstance", avail[i]); 2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *df = (DecimalFormat*) nf; 2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test toPattern/applyPattern round trip 2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pat; 2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->toPattern(pat); 2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols symb(avail[i], status); 2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "Construct DecimalFormatSymbols", avail[i]); 2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat f2(pat, symb, status); 2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (failure(status, 2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("Construct DecimalFormat(") + pat + ")")) { 2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*df != f2) { 2429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString l, p; 2430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + type[j] + avail[i].getDisplayName(l) + 2431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " -> \"" + pat + 2432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\" -> \"" + f2.toPattern(p) + "\""); 243327f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 243427f654740f2a26ad62a5c155af9199af9e69b889claireho UnicodeString l, p; 243527f654740f2a26ad62a5c155af9199af9e69b889claireho logln(UnicodeString("PASS: ") + type[j] + avail[i].getDisplayName(l) + 243627f654740f2a26ad62a5c155af9199af9e69b889claireho " -> \"" + pat + 243727f654740f2a26ad62a5c155af9199af9e69b889claireho "\""); 2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test toLocalizedPattern/applyLocalizedPattern round trip 2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->toLocalizedPattern(pat); 2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f2.applyLocalizedPattern(pat, status); 2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, 2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("applyLocalizedPattern(") + pat + ")", avail[i]); 2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make sure we set the currency attributes appropriately 2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (j == 1) { // Currency format 2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru f2.setCurrency(f2.getCurrency(), status); 2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, 2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString("setCurrency() for (") + pat + ")", avail[i]); 2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*df != f2) { 2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString l, p; 2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: ") + type[j] + avail[i].getDisplayName(l) + 2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " -> localized \"" + pat + 2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\" -> \"" + f2.toPattern(p) + "\""); 2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Test writeObject/readObject round trip 2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NOT ON ICU -- Java only 2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse() fails for mulipliers 2^n. 2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4216742(void) { 2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat *fmt = (DecimalFormat*) NumberFormat::createInstance(Locale::getUS(), status); 24816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "createInstance", Locale::getUS(), TRUE)){ 2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t DATA[] = { INT32_MIN, INT32_MAX, -100000000, 100000000 }; 2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0])); 2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<DATA_length; ++i) { 2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str((UnicodeString)"" + DATA[i]); 2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int m = 1; m <= 100; m++) { 2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->setMultiplier(m); 2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable num; 2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->parse(str, num, status); 2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "parse", Locale::getUS()); 2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (num.getType() != Formattable::kLong && 2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru num.getType() != Formattable::kDouble) { 2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: Wanted number, got ") + 2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru toString(num)); 2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double d = num.getType() == Formattable::kDouble ? 2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru num.getDouble() : (double) num.getLong(); 250127f654740f2a26ad62a5c155af9199af9e69b889claireho if ((d > 0) != (DATA[i] > 0)) { 2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("\"") + str + "\" parse(x " + 2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->getMultiplier() + 2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ") => " + toString(num)); 2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu 2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat formats 1.001 to "1.00" instead of "1" with 2 fraction 2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * digits. 2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4217661(void) { 2518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const double D[] = { 0.001, 1.001, 0.006, 1.006 }; 2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* S[] = { "0", "1", "0.01", "1.01" }; 2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int D_length = (int)(sizeof(D) / sizeof(D[0])); 2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status); 25236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "createInstance", Locale::getUS(), TRUE)){ 2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->setMaximumFractionDigits(2); 2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<D_length; i++) { 2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt->format(D[i], s); 2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (s != UnicodeString(S[i])) { 2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL: Got ") + s + ", exp " + S[i]); 2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * alphaWorks upgrade 2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4161100(void) { 2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status); 25446d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "createInstance", Locale::getUS(), TRUE)){ 2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->setMinimumFractionDigits(1); 2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->setMaximumFractionDigits(1); 2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double a = -0.09; 2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru nf->format(a, s); 2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString pat; 2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString() + a + " x " + 2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((DecimalFormat*) nf)->toPattern(pat) + " = " + s); 2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (s != UnicodeString("-0.1")) { 2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL"); 2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete nf; 2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * June 16 1999 sync up - liu 2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Formatting .5 rounds to "1" instead of "0". (Regression in 1.2.2 RC1) 2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4243011(void) { 2567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols sym(Locale::getUS(), status); 2569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "DecimalFormatSymbols ct", Locale::getUS()); 2570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat fmt(UnicodeString("0."), sym, status); 25716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 25726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (!failure(status, "DecimalFormat ct", Locale::getUS())) { 25736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru const double NUM[] = { -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5 }; 25746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru const char* STR[] = { "-2.", "-2.", "-0.", "0.", "2.", "2.", "4.", "4." }; 25756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru int32_t N = (int32_t)(sizeof(NUM) / sizeof(NUM[0])); 25766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru 25776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru for (int32_t i=0; i<N; ++i) { 25786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString str; 25796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru UnicodeString exp(STR[i]); 25806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru FieldPosition pos; 25816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru fmt.format(NUM[i], str, pos); 25826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (str == exp) { 25836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru logln(UnicodeString("Ok ") + NUM[i] + " x 0. = " + str); 25846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } else { 25856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru errln(UnicodeString("FAIL ") + NUM[i] + " x 0. = " + str + 25866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru ", want " + exp); 25876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * June 16 1999 sync up - liu 2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * format(0.0) gives "0.1" if preceded by parse("99.99"). 2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (Regression in 1.2.2 RC1) 2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4243108(void) { 2598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols sym(Locale::getUS(), status); 2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "DecimalFormatSymbols ct", Locale::getUS()); 2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormat fmt(UnicodeString("#.#"), sym, status); 26026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru if (failure(status, "DecimalFormat ct", Locale::getUS())) { 26036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru return; 26046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru } 2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str; 2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos; 2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.format(0.0, str, pos); 2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp("0"); 2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (str == exp) { 2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok 0.0 x #.# = ") + str); 2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL 0.0 x #.# = ") + str + 2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", want " + exp); 2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str = "99.99"; 2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable val; 2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.parse(str, val, status); 2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru failure(status, "DecimalFormat.parse(99.99)", Locale::getUS()); 2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (val.getType() == Formattable::kDouble && 2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru val.getDouble() == 99.99) { 2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok 99.99 / #.# = ") + toString(val)); 2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL 99.99 / #.# = ") + toString(val) + 2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", want " + 99.99); 2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str.remove(); 2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt.format(0.0, str, pos); 2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (str == exp) { 2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru logln(UnicodeString("Ok 0.0 x #.# = ") + str); 2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln(UnicodeString("FAIL 0.0 x #.# = ") + str + 2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ", want " + exp); 2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DateFormat should call setIntegerParseOnly(TRUE) on adopted 2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat objects. 2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::TestJ691(void) { 2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Locale loc("fr", "CH"); 2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // set up the input date string & expected output 2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString udt("11.10.2000", ""); 2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString exp("11.10.00", ""); 2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // create a Calendar for this locale 2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Calendar *cal = Calendar::createInstance(loc, status); 2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 265650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dataerrln("FAIL: Calendar::createInstance() returned " + (UnicodeString)u_errorName(status)); 2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // create a NumberFormat for this locale 2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat *nf = NumberFormat::createInstance(loc, status); 2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 26636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru dataerrln("FAIL: NumberFormat::createInstance() returned " + (UnicodeString)u_errorName(status)); 2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // *** Here's the key: We don't want to have to do THIS: 2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // nf->setParseIntegerOnly(TRUE); 2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // create the DateFormat 2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DateFormat *df = DateFormat::createDateInstance(DateFormat::kShort, loc); 2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) { 2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: DateFormat::createInstance() returned " + (UnicodeString)u_errorName(status)); 2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->adoptCalendar(cal); 2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->adoptNumberFormat(nf); 2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // set parsing to lenient & parse 2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->setLenient(TRUE); 2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UDate ulocdat = df->parse(udt, status); 2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // format back to a string 2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString outString; 2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru df->format(ulocdat, outString); 2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (outString != exp) { 2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru errln("FAIL: " + udt + " => " + outString); 2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete df; 2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2695b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//--------------------------------------------------------------------------- 2696b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// 2697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Error Checking / Reporting macros 2698b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// 2699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//--------------------------------------------------------------------------- 270059d709d503bab6e2b61931737e662dd293b40578ccornelius#define TEST_CHECK_STATUS(status) { \ 270159d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { \ 270259d709d503bab6e2b61931737e662dd293b40578ccornelius if (status == U_MISSING_RESOURCE_ERROR) { \ 270359d709d503bab6e2b61931737e662dd293b40578ccornelius dataerrln("File %s, Line %d: status=%s", __FILE__, __LINE__, u_errorName(status)); \ 270459d709d503bab6e2b61931737e662dd293b40578ccornelius } else { \ 270559d709d503bab6e2b61931737e662dd293b40578ccornelius errln("File %s, Line %d: status=%s", __FILE__, __LINE__, u_errorName(status)); \ 270659d709d503bab6e2b61931737e662dd293b40578ccornelius } return; \ 270759d709d503bab6e2b61931737e662dd293b40578ccornelius }} 2708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TEST_ASSERT(expr) \ 2710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((expr)==FALSE) {\ 2711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errln("File %s, line %d: Assertion Failed: " #expr "\n", __FILE__, __LINE__);\ 2712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Ticket 8199: Parse failure for numbers in the range of 1E10 - 1E18 2716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid NumberFormatRegressionTest::Test8199(void) { 2718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 2719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho NumberFormat *nf = NumberFormat::createInstance(Locale::getEnglish(), status); 2720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (nf == NULL) { 2721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho dataerrln("Fail: NumberFormat::createInstance(Locale::getEnglish(), status)"); 2722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return; 2723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Note: Retrieving parsed values from a Formattable as a reduced-precision type 2727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // should always truncate, no other rounding scheme. 2728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeString numStr = "1000000000.6"; // 9 zeroes 2730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Formattable val; 2731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(1000000000 == val.getInt64(status)); 2735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(1000000000.6 == val.getDouble(status)); 2737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "100000000000000001.1"; // approx 1E17, parses as a double rather 2740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // than int64 because of the fraction 2741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // even though int64 is more precise. 2742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(100000000000000001LL == val.getInt64(status)); 2746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(100000000000000000.0 == val.getDouble(status)); 2748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "1E17"; // Parses with the internal decimal number having non-zero exponent 2751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kInt64 == val.getType()); 2754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(100000000000000000LL == val.getInt64()); 2755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(1.0E17 == val.getDouble(status)); 2756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "9223372036854775807"; // largest int64_t 2759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kInt64 == val.getType()); 2762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9223372036854775807LL == val.getInt64()); 2763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // In the following check, note that a substantial range of integers will 2764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // convert to the same double value. There are also platform variations 2765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // in the rounding at compile time of double constants. 2766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9223372036854775808.0 >= val.getDouble(status)); 2767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9223372036854774700.0 <= val.getDouble(status)); 2768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "-9223372036854775808"; // smallest int64_t 2771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kInt64 == val.getType()); 2774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // TEST_ASSERT(-9223372036854775808LL == val.getInt64()); // Compiler chokes on constant. 2775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT((int64_t)0x8000000000000000LL == val.getInt64()); 2776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(-9223372036854775808.0 == val.getDouble(status)); 2777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "9223372036854775808"; // largest int64_t + 1 2780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9223372036854775807LL == val.getInt64(status)); 2784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(status == U_INVALID_FORMAT_ERROR); 2785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9223372036854775810.0 == val.getDouble(status)); 2787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "-9223372036854775809"; // smallest int64_t - 1 2790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // TEST_ASSERT(-9223372036854775808LL == val.getInt64(status)); // spurious compiler warnings 2794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT((int64_t)0x8000000000000000LL == val.getInt64(status)); 2795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(status == U_INVALID_FORMAT_ERROR); 2796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(-9223372036854775810.0 == val.getDouble(status)); 2798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Test values near the limit of where doubles can represent all integers. 2801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // The implementation strategy of getInt64() changes at this boundary. 2802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Strings to be parsed include a decimal fraction to force them to be 2803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // parsed as doubles rather than ints. The fraction is discarded 2804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // from the parsed double value because it is beyond what can be represented. 2805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "9007199254740991.1"; // largest 53 bit int 2808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // printf("getInt64() returns %lld\n", val.getInt64(status)); 2811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9007199254740991LL == val.getInt64(status)); 2813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9007199254740991.0 == val.getDouble(status)); 2814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "9007199254740992.1"; // 54 bits for the int part. 2818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); 2819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9007199254740992LL == val.getInt64(status)); 2822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9007199254740992.0 == val.getDouble(status)); 2823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_ZERO_ERROR; 2826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho numStr = "9007199254740993.1"; // 54 bits for the int part. Double will round 2827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho nf->parse(numStr, val, status); // the ones digit, putting it up to ...994 2828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(Formattable::kDouble == val.getType()); 2830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9007199254740993LL == val.getInt64(status)); 2831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(9007199254740994.0 == val.getDouble(status)); 2832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_CHECK_STATUS(status); 2833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete nf; 2835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 2836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2837103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid NumberFormatRegressionTest::Test9109(void) { 2838103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode status = U_ZERO_ERROR; 2839103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Formattable val; 2840103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ParsePosition pos; 2841103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormat fmt("+##", status); 2842103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fmt.setLenient(TRUE); 2843103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2844103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(status)) { 2845103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius dataerrln("Failed to create DecimalFormat with pattern '+##' - %s", u_errorName(status)); 2846103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2847103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2848103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString text("123"); 2849103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t expected = 123; 2850103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t expos = 3; 2851103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2852103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fmt.parse(text, val, pos); 2853103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (pos.getErrorIndex() >= 0) { 2854103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errln(UnicodeString("Parse failure at ") + pos.getErrorIndex()); 2855103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (val.getLong() != 123) { 2856103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errln(UnicodeString("Incorrect parse result: ") + val.getLong() + " expected: " + expected); 2857103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (pos.getIndex() != 3) { 2858103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius errln(UnicodeString("Incorrect parse position: ") + pos.getIndex() + " expected: " + expos); 2859103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2860103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 2861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 286254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 286354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid NumberFormatRegressionTest::Test9780(void) { 286454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode status = U_ZERO_ERROR; 286554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status); 286654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (failure(status, "NumberFormat::createInstance", TRUE)){ 286754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius delete nf; 286854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return; 286954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius }; 287054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf); 287154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(df == NULL) { 287254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("DecimalFormat needed to continue"); 287354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return; 287454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 287554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius df->setParseIntegerOnly(TRUE); 287654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 287754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { 287854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius Formattable n; 287954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ParsePosition pos(0); 288054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString toParse("1,234",""); 288154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius df->parse(toParse, n, pos); 288254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (n.getType() != Formattable::kLong 288354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius || n.getLong() != 1234) { 288454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln(UnicodeString("FAIL: parse(\"") + toParse + UnicodeString("\") returns ") + toString(n)); 288554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 288654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 288754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // should still work in lenient mode, just won't get fastpath 288854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius df->setLenient(TRUE); 288954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { 289054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius Formattable n; 289154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ParsePosition pos(0); 289254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString toParse("1,234",""); 289354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius df->parse(toParse, n, pos); 289454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (n.getType() != Formattable::kLong 289554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius || n.getLong() != 1234) { 289654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln(UnicodeString("FAIL: parse(\"") + toParse + UnicodeString("\") returns ") + toString(n)); 289754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 289854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 289954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius delete nf; 290054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 290154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 290254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 290354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusvoid NumberFormatRegressionTest::Test9677(void) { 290454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar pattern[] = { 0x23,0x23,0x23,0x23,0x2E,0x23,0x23,0x23,0x23,0 }; // "####.####" 290554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar positivePrefix[] = { 0x40,0 }; // "@" 290654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar negativePrefix[] = { 0x6E,0 }; // "n" 290754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar text[] = { 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0 }; // 123456789 290854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius static const UChar text2[] = { 0x6E, 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0 }; // n123456789 290954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 291054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode status = U_ZERO_ERROR; 291154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius LocalUNumberFormatPointer f(unum_open(UNUM_DEFAULT, NULL, 0, "en_US", NULL, &status)); 291254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_FAILURE(status)) { 291354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius dataerrln("Failure opening unum_open"); 291454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return; 291554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 291654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 291754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_SUCCESS(status)) { 291854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius unum_applyPattern(f.getAlias(), FALSE, pattern, -1, NULL, &status); 291954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius unum_setTextAttribute(f.getAlias(), UNUM_POSITIVE_PREFIX, positivePrefix, -1, &status); 292054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius assertSuccess("setting attributes", status); 292154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 292254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 292354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_SUCCESS(status)) { 292454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t n = unum_parse(f.getAlias(), text, -1, NULL, &status); 292554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("unum_parse status %s, result %d\n", u_errorName(status), n); 292654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 292754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) { 292854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("Got expected parse error %s\n", u_errorName(status)); 292954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ZERO_ERROR; 293054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 293154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("FAIL: unum_parse status %s, result %d - expected failure\n", u_errorName(status), n); 293254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 293354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 293454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 293554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_SUCCESS(status)) { 293654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius unum_setTextAttribute(f.getAlias(), UNUM_POSITIVE_PREFIX, NULL, 0, &status); 293754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius assertSuccess("setting attributes", status); 293854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("removed positive prefix"); 293954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 294054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 294154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_SUCCESS(status)) { 294254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t n = unum_parse(f.getAlias(), text, -1, NULL, &status); 294354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("unum_parse status %s, result %d\n", u_errorName(status), n); 294454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 294554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) { 294654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("FAIL: with pos prefix removed, parse error %s\n", u_errorName(status)); 294754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ZERO_ERROR; 294854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 294954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(n!=123456789) { 295054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("FAIL: with pos prefix removed , unum_parse status %s, result %d expected 123456789\n", u_errorName(status), n); 295154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 295254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("PASS: with pos prefix removed , unum_parse status %s, result %d expected 123456789\n", u_errorName(status),n); 295354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 295454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 295554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 295654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 295754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_SUCCESS(status)) { 295854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t n = unum_parse(f.getAlias(), text2, -1, NULL, &status); 295954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("unum_parse status %s, result %d\n", u_errorName(status), n); 296054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 296154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) { 296254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("text2: Got expected parse error %s\n", u_errorName(status)); 296354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ZERO_ERROR; 296454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 296554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("FAIL: text2: unum_parse status %s, result %d - expected failure\n", u_errorName(status), n); 296654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 296754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 296854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 296954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_SUCCESS(status)) { 297054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius unum_setTextAttribute(f.getAlias(), UNUM_NEGATIVE_PREFIX, negativePrefix, -1, &status); 297154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius assertSuccess("setting attributes", status); 297254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("Set a different neg prefix prefix"); 297354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 297454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 297554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_SUCCESS(status)) { 297654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t n = unum_parse(f.getAlias(), text2, -1, NULL, &status); 297754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("unum_parse status %s, result %d\n", u_errorName(status), n); 297854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 297954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) { 298054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("FAIL: with different neg prefix , parse error %s\n", u_errorName(status)); 298154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ZERO_ERROR; 298254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 298354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius; 298454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(n!=-123456789) { 298554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius errln("FAIL: with different neg prefix , unum_parse status %s, result %d expected -123456789\n", u_errorName(status), n); 298654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 298754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius logln("PASS: with different neg prefix , unum_parse status %s, result %d expected -123456789\n", u_errorName(status), n); 298854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 298954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 299054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 299154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 299254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 299359d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid NumberFormatRegressionTest::Test10361(void) { 299459d709d503bab6e2b61931737e662dd293b40578ccornelius // DecimalFormat/NumberFormat were artificially limiting the number of digits, 299559d709d503bab6e2b61931737e662dd293b40578ccornelius // preventing formatting of big decimals. 299659d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode status = U_ZERO_ERROR; 299759d709d503bab6e2b61931737e662dd293b40578ccornelius DecimalFormatSymbols symbols(Locale::getEnglish(), status); 299859d709d503bab6e2b61931737e662dd293b40578ccornelius LocalPointer<DecimalFormat> df(new DecimalFormat("###.##", symbols, status)); 299959d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_CHECK_STATUS(status); 300059d709d503bab6e2b61931737e662dd293b40578ccornelius 300159d709d503bab6e2b61931737e662dd293b40578ccornelius // Create a decimal number with a million digits. 300259d709d503bab6e2b61931737e662dd293b40578ccornelius const int32_t NUMSIZE=1000000; 300359d709d503bab6e2b61931737e662dd293b40578ccornelius char *num = new char[NUMSIZE]; 300459d709d503bab6e2b61931737e662dd293b40578ccornelius for (int32_t i=0; i<NUMSIZE; i++) { 300559d709d503bab6e2b61931737e662dd293b40578ccornelius num[i] = '0' + (i+1) % 10; 300659d709d503bab6e2b61931737e662dd293b40578ccornelius } 300759d709d503bab6e2b61931737e662dd293b40578ccornelius num[NUMSIZE-3] = '.'; 300859d709d503bab6e2b61931737e662dd293b40578ccornelius num[NUMSIZE-1] = 0; 300959d709d503bab6e2b61931737e662dd293b40578ccornelius 301059d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString s; 301159d709d503bab6e2b61931737e662dd293b40578ccornelius Formattable fmtable; 301259d709d503bab6e2b61931737e662dd293b40578ccornelius fmtable.setDecimalNumber(num, status); 301359d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_CHECK_STATUS(status); 301459d709d503bab6e2b61931737e662dd293b40578ccornelius 301559d709d503bab6e2b61931737e662dd293b40578ccornelius FieldPosition pos(UNUM_DECIMAL_SEPARATOR_FIELD); 301659d709d503bab6e2b61931737e662dd293b40578ccornelius df->format(fmtable, s, pos, status); 301759d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_CHECK_STATUS(status); 301859d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_ASSERT(999999 == s.length()); 301959d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_ASSERT(999997 == pos.getBeginIndex()); 302059d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_ASSERT(999998 == pos.getEndIndex()); 302159d709d503bab6e2b61931737e662dd293b40578ccornelius 302259d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString expected(num, -1, US_INV); 302359d709d503bab6e2b61931737e662dd293b40578ccornelius TEST_ASSERT(expected == s); 302459d709d503bab6e2b61931737e662dd293b40578ccornelius delete [] num; 302559d709d503bab6e2b61931737e662dd293b40578ccornelius} 302654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 3027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 3028