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