1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********************************************************************
2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, 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,
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    FieldPosition&        pos,
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode& status) const
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NumberFormat::format(number, toAppendTo, pos, 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);
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
1786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const Locale& l, UBool possibleDataError)
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
1826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln(UnicodeString("FAIL: ", "") + msg
1836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),""));
1846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
1856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errcheckln(status, UnicodeString("FAIL: ", "") + msg
1866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l.getName(),""));
1876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
1956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, const char *l, UBool possibleDataError)
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
1996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln(UnicodeString("FAIL: ", "") + msg
2006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, ""));
2016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
2026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errcheckln(status, UnicodeString("FAIL: ", "") + msg
2036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), "") + UnicodeString(l, ""));
2046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
2126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste QueruNumberFormatRegressionTest::failure(UErrorCode status, const UnicodeString& msg, UBool possibleDataError)
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
2156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (possibleDataError) {
2166d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln(UnicodeString("FAIL: ", "") + msg
2176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), ""));
2186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
2196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errcheckln(status, UnicodeString("FAIL: ", "") + msg
2206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                  + UnicodeString(" failed, error ", "") + UnicodeString(u_errorName(status), ""));
2216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Convert Java-style strings with \u Unicode escapes into UnicodeString objects
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UnicodeString str(const char *input)
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return CharsToUnicodeString(input);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4075713
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.equals comparing with null should always return false.
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} kind of silly in C++, just checking for new success
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4075713(void)
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        MyNumberFormatTest *tmp = new MyNumberFormatTest();
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(tmp != NULL)
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("NumberFormat.equals passed");
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (NullPointerException e) {
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("(new MyNumberFormatTest()).equals(null) throws unexpected exception");
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tmp;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4074620
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.equals comparing two obj equal even the setGroupingUsed
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * flag is different.
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4074620(void)
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MyNumberFormatTest *nf1 = new MyNumberFormatTest();
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MyNumberFormatTest *nf2 = new MyNumberFormatTest();
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf1->setGroupingUsed(FALSE);
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf2->setGroupingUsed(TRUE);
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(nf1 == nf2)
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test for bug 4074620 failed");
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Test for bug 4074620 passed.");
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf1;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf2;
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4088161
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() incorrectly uses maxFractionDigits setting.
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4088161 (void)
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
2846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "new DecimalFormat", "")) {
2856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        double d = 100;
2866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        df->setMinimumFractionDigits(0);
2876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        df->setMaximumFractionDigits(16);
2886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString sBuf1;
2896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        FieldPosition fp1(0);
2906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        logln(UnicodeString("d = ") + d);
2916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        logln("maxFractionDigits = " + df->getMaximumFractionDigits());
2926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
2936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        logln(" format(d) = '" + df->format(d, sBuf1, fp1) + "'");
2946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        df->setMaximumFractionDigits(17);
2956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString sBuf2;
2966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        FieldPosition fp2(0);
2976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        logln("maxFractionDigits = " + df->getMaximumFractionDigits());
2986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        sBuf2 = df->format(d, sBuf2, fp2);
2996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if(sBuf2 != "100")
3006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln(" format(d) = '" + sBuf2 + "'");
3016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087245
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormatSymbols should be cloned in the ctor DecimalFormat.
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat(String, DecimalFormatSymbols).
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087245 (void)
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *symbols = new DecimalFormatSymbols(status);
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormatSymbols", "");
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} One note about this test: if you pass in a pointer
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to the symbols, they are adopted and this test will fail,
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // even though that is the correct behavior.  To test the cloning
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // of the symbols, it is necessary to pass in a reference to the symbols
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat("#,##0.0", *symbols, status);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat with symbols", "");
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n = 123;
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf1;
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buf2;
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("format(") + n + ") = " +
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->format(n, buf1, pos));
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    symbols->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, UnicodeString((UChar)0x70)); // change value of field
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("format(") + n + ") = " +
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->format(n, buf2, pos));
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(buf1 != buf2)
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test for bug 4087245 failed");
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete symbols;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087535
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() incorrectly formats 0.0
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087535 (void)
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat", "");
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMinimumIntegerDigits(0);
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double n = 0;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buffer;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer = df->format(n, buffer, pos);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (buffer.length() == 0)
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(/*n + */": '" + buffer + "'");
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    n = 0.1;
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
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4088503
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format fails when groupingSize is set to 0.
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} how do I tell if this worked? --> FieldPosition doesn't change ??
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4088503 (void)
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat", "");
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setGroupingSize(0);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString sBuf;
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp(FieldPosition::DONT_CARE);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(df->format((int32_t)123, sBuf, fp));
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //if(fp == FieldPosition(0))
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    errln("Test for bug 4088503 failed.");
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test for bug 4088503 failed.");
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4066646
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.getCurrencyInstance is wrong.
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4066646 (void)
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assignFloatValue(2.04f);
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assignFloatValue(2.03f);
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assignFloatValue(2.02f);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    assignFloatValue(0.0f);
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufloat
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::assignFloatValue(float returnfloat)
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString(" VALUE ") + returnfloat);
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nfcommon =  NumberFormat::createCurrencyInstance(Locale::getUS(), status);
4006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createCurrencyInstance", Locale::getUS(), TRUE)){
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nfcommon;
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return returnfloat;
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfcommon->setGroupingUsed(FALSE);
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString stringValue;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    stringValue = nfcommon->format(returnfloat, stringValue);
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(" DISPLAYVALUE " + stringValue);
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable result;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfcommon->parse(stringValue, result, status);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "nfcommon->parse", Locale::getUS());
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    float floatResult = (float) (result.getType() == Formattable::kDouble
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        ? result.getDouble() : result.getLong());
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if( uprv_fabs(floatResult - returnfloat) > 0.0001)
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //String stringValue = nfcommon.format(returnfloat).substring(1);
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (Float.valueOf(stringValue).floatValue() != returnfloat)
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: expected ") + returnfloat + ", got " + floatResult + " (" + stringValue+")");
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nfcommon;
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return returnfloat;
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} // End Of assignFloatValue()
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4059870
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat throws exception when parsing "0"
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4059870(void)
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *format = new DecimalFormat("00", status);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new Decimalformat", Locale::getUS());
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Formattable result;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        format->parse(UnicodeString("0"), result, status);
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "format->parse", Locale::getUS());
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*}
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch (Exception e) {
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test for bug 4059870 failed : " + e);
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4083018
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormatSymbol.equals should always return false when
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * comparing with null.
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} this is silly in C++
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4083018 (void)
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *dfs = new DecimalFormatSymbols(status);
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormatSymbols", Locale::getUS());
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dfs != NULL)
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Test Passed!");
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Test for bug 4083018 failed");
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test for bug 4083018 failed => Message : " + foo.getMessage());
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete dfs;
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071492
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat does not round up correctly.
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071492 (void)
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double x = 0.00159999;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createInstance(status);
4746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createInstance", Locale::getUS(), TRUE)) {
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nf;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->setMaximumFractionDigits(4);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString out;
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    out = nf->format(x, out, pos);
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("0.00159999 formats with 4 fractional digits to " + out);
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expected("0.0016");
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (out != expected)
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Expected " + expected);
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4086575
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * A space as a group separator for localized pattern causes
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * wrong format.  WorkAround : use non-breaking space.
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4086575(void)
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf1 = NumberFormat::createInstance(Locale::getFrance(), status);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TODO: There is not a good way to find out that the creation of this number format has
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // failed. Major rewiring of format construction proposed.
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
5026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln("Something is wrong with French number format - it should not fallback. Exitting - %s", u_errorName(status));
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete nf1;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createInstance", Locale::getFrance());
50727f654740f2a26ad62a5c155af9199af9e69b889claireho
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // C++ workaround to make sure cast works
50927f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *nf = dynamic_cast<DecimalFormat *>(nf1);
51027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(nf == NULL) {
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("NumberFormat::createInstance returned incorrect type.");
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf toPattern1: " + nf->toPattern(temp));
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf toLocPattern1: " + nf->toLocalizedPattern(temp));
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // No group separator
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("...applyLocalizedPattern ###,00;(###,00) ");
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->applyLocalizedPattern(UnicodeString("###,00;(###,00)"), status);
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "nf->applyLocalizedPattern", Locale::getFrance());
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf toPattern2: " + nf->toPattern(temp));
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf toLocPattern2: " + nf->toLocalizedPattern(temp));
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf: " + nf->format((int32_t)1234, temp, pos)); // 1234,00
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf: " + nf->format((int32_t)-1234, temp, pos)); // (1234,00)
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Space as group separator
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("...applyLocalizedPattern # ###,00;(# ###,00) ");
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nbsp = \u00a0
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //nf->applyLocalizedPattern("#\u00a0###,00;(#\u00a0###,00)");
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar patChars[] = {
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             0x23, 0x00a0, 0x23, 0x23, 0x23, 0x2c, 0x30, 0x30, 0x3b,
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x28, 0x23, 0x00a0, 0x23, 0x23, 0x23, 0x2c, 0x30, 0x30, 0x29
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat(patChars, 19, 19);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->applyLocalizedPattern(pat, status);
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "nf->applyLocalizedPattern", Locale::getFrance());
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf toPattern2: " + nf->toPattern(temp));
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("nf toLocPattern2: " + nf->toLocalizedPattern(temp));
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buffer;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer = nf->format((int32_t)1234, buffer, pos);
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (buffer != UnicodeString("1\u00a0234,00"))
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar c[] = {
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x31, 0x00a0, 0x32, 0x33, 0x34, 0x2c, 0x30, 0x30
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString cc(c, 8, 8);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (buffer != cc)
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("nf : " + buffer); // Expect 1 234,00
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer.remove();
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer = nf->format((int32_t)-1234, buffer, pos);
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar c1[] = {
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x28, 0x31, 0x00a0, 0x32, 0x33, 0x34, 0x2c, 0x30, 0x30, 0x29
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString cc1(c1, 10, 10);
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (buffer != cc1)
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("nf : " + buffer); // Expect (1 234,00)
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Erroneously prints:
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // 1234,00 ,
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // (1234,00 ,)
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf1;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4068693
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse returns wrong value
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} slightly converted into a round-trip test, since in C++
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// there is no Double.toString()
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4068693(void)
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("----- Test Application -----");
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pos(0);
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
5816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable d;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //Double d = (Double)df.parse("123.55456", pos=new ParsePosition(0));
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(UnicodeString("123.55456"), d, pos);
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (!d.toString().equals("123.55456")) {
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString dstr;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMaximumFractionDigits(999);
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMaximumIntegerDigits(999);
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp(FieldPosition::DONT_CARE);
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dstr = df->format(d.getDouble(), dstr, fp);
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (dstr != UnicodeString("123.55456")) {
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Result -> ") + d.getDouble());
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4069754, 4067878
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * null pointer thrown when accessing a deserialized DecimalFormat
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * object.
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} doesn't apply in C++
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4069754(void)
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    try {
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        myformat it = new myformat();
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(it.Now());
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FileOutputStream ostream = new FileOutputStream("t.tmp");
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ObjectOutputStream p = new ObjectOutputStream(ostream);
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        p.writeObject(it);
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ostream.close();
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Saved ok.");
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FileInputStream istream = new FileInputStream("t.tmp");
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ObjectInputStream p2 = new ObjectInputStream(istream);
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        myformat it2 = (myformat)p2.readObject();
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(it2.Now());
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        istream.close();
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Loaded ok.");
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } catch (Exception foo) {
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test for bug 4069754 or 4057878 failed => Exception: " + foo.getMessage());
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/}
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087251
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.applyPattern(String) allows illegal patterns
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087251 (void)
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
6376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->applyPattern(UnicodeString("#.#.#"), status);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( ! U_FAILURE(status))
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("df->applyPattern with illegal pattern didn't fail");
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("toPattern() returns \"" + df->toPattern(temp) + "\"");
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("applyPattern(\"#.#.#\") doesn't throw IllegalArgumentException");
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (IllegalArgumentException e) {
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Caught Illegal Argument Error !");
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Second test; added 5/11/98 when reported to fail on 1.2b3
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->applyPattern("#0.0#0#0", status);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( ! U_FAILURE(status))
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("df->applyPattern with illegal pattern didn't fail");
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("toPattern() returns \"" + df->toPattern(temp) + "\"");
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("applyPattern(\"#0.0#0#0\") doesn't throw IllegalArgumentException");
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (IllegalArgumentException e) {
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Ok - IllegalArgumentException for #0.0#0#0");
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4090489
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() loses precision
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4090489 (void)
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} sprintf doesn't correctly handle the double, so there is nothing
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// that NumberFormat can do.  For some reason, it does not format the last 1.
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*    UErrorCode status = U_ZERO_ERROR;
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMinimumFractionDigits(10);
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMaximumFractionDigits(999);
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setGroupingUsed(FALSE);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = 1.000000000000001E7;
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //BigDecimal bd = new BigDecimal(d);
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString sb;
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp(0);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("d = ") + d);
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //logln("BigDecimal.toString():  " + bd.toString());
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(d, sb, fp);
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (sb != "10000000.0000000100") {
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("DecimalFormat.format(): " + sb);
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4090504
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() loses precision
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4090504 (void)
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d = 1;
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("d = ") + d);
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
7036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString sb;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp(FieldPosition::DONT_CARE);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int i = 17; i <= 20; i++) {
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->setMaximumFractionDigits(i);
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //sb = new StringBuffer("");
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fp.setField(0);
715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln(UnicodeString("  getMaximumFractionDigits() = ") + i);
716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln(UnicodeString("  formated: ") + df->format(d, sb, fp));
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Bug 4090504 regression test failed. Message : " + foo.getMessage());
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4095713
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse(String str, ParsePosition pp) loses precision
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4095713 (void)
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
7326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str("0.1234");
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d1 = 0.1234;
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //Double d1 = new Double(str);
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //Double d2 = (Double) df.parse(str, new ParsePosition(0));
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable d2;
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pp(0);
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(str, d2, pp);
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("") + d1);
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (d2.getDouble() != d1)
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Bug 4095713 test failed, new double value : ") + d2.getDouble());
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4092561
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse() fails when multiplier is not set to 1
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} not sure what to do with this one
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4092561 (void)
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
7596d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} going to cheat here and use sprintf ??
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*UnicodeString str = Long.toString(Long.MIN_VALUE);
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Long.MIN_VALUE : " + df.parse(str, new ParsePosition(0)).toString());
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df.setMultiplier(100);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Number num = df.parse(str, new ParsePosition(0));
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (num.doubleValue() != -9.223372036854776E16)
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Bug 4092561 test failed when multiplier is set to not 1.");
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4092480
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat: Negative format ignored.
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4092480 (void)
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *dfFoo = new DecimalFormat(UnicodeString("000"), status);
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
7856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete dfFoo;
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dfFoo->applyPattern("0000;-000", status);
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "dfFoo->applyPattern");
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dfFoo->toPattern(temp) != UnicodeString("#0000"))
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("dfFoo.toPattern : " + dfFoo->toPattern(temp));
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)42, temp, pos));
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)-42, temp, pos));
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dfFoo->applyPattern("000;-000", status);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "dfFoo->applyPattern");
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dfFoo->toPattern(temp) != UnicodeString("#000"))
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("dfFoo.toPattern : " + dfFoo->toPattern(temp));
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)42,temp, pos));
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)-42, temp, pos));
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dfFoo->applyPattern("000;-0000", status);
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "dfFoo->applyPattern");
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dfFoo->toPattern(temp) != UnicodeString("#000"))
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("dfFoo.toPattern : " + dfFoo->toPattern(temp));
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)42, temp, pos));
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)-42, temp, pos));
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dfFoo->applyPattern("0000;-000", status);
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "dfFoo->applyPattern");
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (dfFoo->toPattern(temp) != UnicodeString("#0000"))
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("dfFoo.toPattern : " + dfFoo->toPattern(temp));
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)42, temp, pos));
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(dfFoo->format((int32_t)-42, temp, pos));
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Message " + foo.getMessage());
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete dfFoo;
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4087244
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.getCurrencyInstance() produces format that uses
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * decimal separator instead of monetary decimal separator.
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Rewrote this test not to depend on the actual pattern.  Pattern should
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * never contain the monetary separator!  Decimal separator in pattern is
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * interpreted as monetary separator if currency symbol is seen!
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4087244 (void) {
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char loc[256] = {0};
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("pt_PT_PREEURO", loc, 256, &status);
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale *de = new Locale(loc);
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createCurrencyInstance(*de, status);
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
8416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln("Error creating DecimalFormat: %s", u_errorName(status));
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete nf;
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
84527f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf);
84627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(df == NULL) {
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("expected DecimalFormat!");
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const DecimalFormatSymbols *sym = df->getDecimalFormatSymbols();
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString decSep = sym->getSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol);
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString monSep = sym->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol);
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (decSep == monSep) {
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("ERROR in test: want decimal sep != monetary sep");
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMinimumIntegerDigits(1);
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMinimumFractionDigits(2);
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos;
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(1.23, str, pos);
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString monStr("1x23");
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    monStr.replace((int32_t)1, 1, monSep);
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString decStr("1x23");
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    decStr.replace((int32_t)1, 1, decSep);
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str.indexOf(monStr) >= 0 && str.indexOf(decStr) < 0) {
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("OK: 1.23 -> \"") + str + "\" contains \"" +
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              monStr + "\" and not \"" + decStr + '"');
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: 1.23 -> \"") + str + "\", should contain \"" +
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              monStr +
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              "\" and not \"" + decStr + '"');
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete de;
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4070798
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Number format data rounding errors for locale FR
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4070798 (void)
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *formatter;
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tempString;
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* User error :
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedDefault = "-5\u00a0789,987";
887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    String expectedCurrency = "5\u00a0789,98\u00a0F";
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedPercent = "-578\u00a0998%";
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar chars1 [] = {
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x2d, 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x38, 0x38
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar chars2 [] = {
894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x00a0, 0x46
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar chars3 [] = {
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x2d, 0x35, 0x37, 0x38, 0x00a0, 0x39, 0x39, 0x39, 0x00a0, 0x25
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedDefault(chars1, 10, 10);
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedCurrency(chars2, 10, 10);
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedPercent(chars3, 10, 10);
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char loc[256]={0};
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createInstance(Locale(loc), status);
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
9086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln("Error creating DecimalFormat: %s", u_errorName(status));
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete formatter;
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createNumberInstance", loc);
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedDefault) {
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4070798 default test passed.");
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedDefault +
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len = uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createCurrencyInstance(loc, status);
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createCurrencyInstance", loc);
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format( 5789.9876, tempString );
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedCurrency) {
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4070798 currency test passed.");
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedCurrency +
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("fr_FR_PREEURO", loc, 256, &status);
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createPercentInstance(Locale(loc), status);
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createPercentInstance", loc);
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedPercent) {
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4070798 percentage test passed.");
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedPercent +
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071005
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Data rounding errors for French (Canada) locale
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071005 (void)
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *formatter;
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tempString;
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* User error :
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedDefault = "-5\u00a0789,987";
963c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    String expectedCurrency = "5\u00a0789,98\u00a0$";
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedPercent = "-578\u00a0998%";
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar chars1 [] = {
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x2d, 0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x38, 0x38
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar chars2 [] = {
970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        0x35, 0x00a0, 0x37, 0x38, 0x39, 0x2c, 0x39, 0x39, 0x00a0, 0x24
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar chars3 [] = {
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x2d, 0x35, 0x37, 0x38, 0x00a0, 0x39, 0x39, 0x39, 0x00a0, 0x25
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedDefault(chars1, 10, 10);
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedCurrency(chars2, 10, 10);
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedPercent(chars3, 10, 10);
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createInstance(Locale::getCanadaFrench(), status);
9816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createNumberInstance", Locale::getCanadaFrench(), TRUE)){
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete formatter;
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedDefault) {
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071005 default test passed.");
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedDefault +
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createCurrencyInstance(Locale::getCanadaFrench(), status);
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createCurrencyInstance", Locale::getCanadaFrench());
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format( 5789.9876, tempString );
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedCurrency) {
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071005 currency test assed.");
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedCurrency +
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createPercentInstance(Locale::getCanadaFrench(), status);
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createPercentInstance", Locale::getCanadaFrench());
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedPercent) {
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071005 percentage test passed.");
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedPercent +
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071014
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Data rounding errors for German (Germany) locale
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071014 (void)
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *formatter;
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tempString;
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* user error :
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedDefault = "-5.789,987";
1035b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    String expectedCurrency = "5.789,98 DEM";
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedPercent = "-578.998%";
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedDefault("-5.789,988");
1039b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString expectedCurrency("5.789,99\\u00A0DEM");
1040c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString expectedPercent("-578.999\\u00A0%");
1041c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1042c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expectedCurrency = expectedCurrency.unescape();
1043c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    expectedPercent = expectedPercent.unescape();
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char loc[256]={0};
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("de_DE_PREEURO", loc, 256, &status);
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createInstance(Locale(loc), status);
10496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createNumberInstance", loc, TRUE)){
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete formatter;
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedDefault) {
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071014 default test passed.");
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedDefault +
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("de_DE_PREEURO", loc, 256, &status);
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createCurrencyInstance(Locale(loc), status);
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createCurrencyInstance", loc);
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format( 5789.9876, tempString );
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedCurrency) {
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071014 currency test assed.");
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedCurrency +
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createPercentInstance(Locale::getGermany(), status);
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createPercentInstance", Locale::getGermany());
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedPercent) {
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071014 percentage test passed.");
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedPercent +
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071859
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Data rounding errors for Italian locale number formats
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4071859 (void)
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *formatter;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tempString;
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* user error :
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedDefault = "-5.789,987";
1103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    String expectedCurrency = "-L.\\u00A05.789,98";
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String expectedPercent = "-578.998%";
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedDefault("-5.789,988");
1107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString expectedCurrency("-ITL\\u00A05.790", -1, US_INV);
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString expectedPercent("-578.999%");
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectedCurrency = expectedCurrency.unescape();
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char loc[256]={0};
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("it_IT_PREEURO", loc, 256, &status);
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createInstance(Locale(loc), status);
11156d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createNumberInstance", TRUE)){
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete formatter;
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedDefault) {
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071859 default test passed.");
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedDefault +
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("it_IT_PREEURO", loc, 256, &status);
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createCurrencyInstance(Locale(loc), status);
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createCurrencyInstance");
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format( -5789.9876, tempString );
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedCurrency) {
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071859 currency test assed.");
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedCurrency +
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uloc_canonicalize("it_IT_PREEURO", loc, 256, &status);
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatter = NumberFormat::createPercentInstance(Locale(loc), status);
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createPercentInstance");
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString.remove();
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempString = formatter->format (-5789.9876, tempString);
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tempString == expectedPercent) {
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln ("Bug 4071859 percentage test passed.");
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Failed:") +
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Expected " + expectedPercent +
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Received " + tempString );
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatter;
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4071859
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test rounding for nearest even.
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4093610(void)
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat("#0.#", status);
11666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "new DecimalFormat")) {
11676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString s("12.4");
11686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.35, s);
11696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.45, s);
11706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = "12.5";
11716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.452,s);
11726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = "12.6";
11736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.55, s);
11746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.65, s);
11756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = "12.7";
11766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.652,s);
11776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = "12.8";
11786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.75, s);
11796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.752,s);
11806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.85, s);
11816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = "12.9";
11826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.852,s);
11836d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = "13";
11846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.95, s);
11856d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        roundingTest(df, 12.952,s);
11866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::roundingTest(DecimalFormat *df, double x, UnicodeString& expected)
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString out;
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    out = df->format(x, out, pos);
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("") + x + " formats with 1 fractional digits to " + out);
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (out != expected)
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Expected " + expected);
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4098741
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests the setMaximumFractionDigits limit.
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4098741(void)
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *fmt = NumberFormat::createPercentInstance(status);
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dataerrln("Error calling NumberFormat::createPercentInstance");
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->setMaximumFractionDigits(20);
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(fmt->format(.001, temp));
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Bug 4098471 failed with exception thrown : " + foo.getMessage());
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4074454
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests illegal pattern exception.
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Fix comment : HShih A31 Part1 will not be fixed and javadoc needs to be updated.
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Part2 has been fixed.
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4074454(void)
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *fmt = new DecimalFormat("#,#00.00;-#.#", status);
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
12336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete fmt;
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      logln("Inconsistent negative pattern is fine.");
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat *newFmt = new DecimalFormat("#,#00.00 p''ieces;-#,#00.00 p''ieces", status);
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "new DecimalFormat");
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString tempString;
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tempString = newFmt->format(3456.78, tempString, pos);
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tempString != UnicodeString("3,456.78 p'ieces"))
124527f654740f2a26ad62a5c155af9199af9e69b889claireho            dataerrln("Failed!  3456.78 p'ieces expected, but got : " + tempString);
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("An exception was thrown for any inconsistent negative pattern.");
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete newFmt;
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4099404
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests all different comments.
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Response to some comments :
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [1] DecimalFormat.parse API documentation is more than just one line.
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is not a reproducable doc error in 116 source code.
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [2] See updated javadoc.
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [3] Fixed.
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [4] NumberFormat.parse(String, ParsePosition) : If parsing fails,
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a null object will be returned.  The unchanged parse position also
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * reflects an error.
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.parse(String) : If parsing fails, an ParseException
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * will be thrown.
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See updated javadoc for more details.
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [5] See updated javadoc.
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [6] See updated javadoc.
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [7] This is a correct behavior if the DateFormat object is linient.
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Otherwise, an IllegalArgumentException will be thrown when formatting
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "January 35".  See GregorianCalendar class javadoc for more details.
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4099404(void)
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat *fmt = new DecimalFormat(UnicodeString("000.0#0"), status);
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(! U_FAILURE(status))
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Bug 4099404 failed applying illegal pattern \"000.0#0\""));
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Bug 4099404 pattern \"000.0#0\" passed");
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt = 0;
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt = new DecimalFormat(UnicodeString("0#0.000"), status);
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( !U_FAILURE(status))
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru           errln("Bug 4099404 failed applying illegal pattern \"0#0.000\"");
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (Exception foo) {
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Bug 4099404 pattern \"0#0.000\" passed");
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4101481
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.applyPattern doesn't set minimum integer digits
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4101481(void)
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *sdf = new DecimalFormat(UnicodeString("#,##0"), status);
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
13026d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete sdf;
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (sdf->getMinimumIntegerDigits() != 1)
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Minimum integer digits : " + sdf->getMinimumIntegerDigits());
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete sdf;
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4052223 (API addition request A27)
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Tests ParsePosition.setErrorPosition() and ParsePosition.getErrorPosition().
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4052223(void)
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat *fmt = new DecimalFormat(UnicodeString("#,#00.00"), status);
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
13206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru          errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          delete fmt;
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "new DecimalFormat");
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Formattable num;
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->parse(UnicodeString("abc3"), num, status);
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(! U_FAILURE(status))
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Bug 4052223 failed : can't parse string \"a\".  Got ") /*+ num*/);
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*} catch (ParseException foo) {
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Caught expected ParseException : " + foo.getMessage() + " at index : " + foo.getErrorOffset());
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4061302
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * API tests for API addition request A9.
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4061302(void)
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *fmt = new DecimalFormatSymbols(status);
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormatSymbols");
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString currency(fmt->getSymbol(DecimalFormatSymbols::kCurrencySymbol));
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString intlCurrency(fmt->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol));
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString monDecSeparator(fmt->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol));
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (currency == UnicodeString("") ||
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        intlCurrency == UnicodeString("") ||
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        monDecSeparator == UnicodeString(""))
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("getCurrencySymbols failed, got empty string.");
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString monDecSeparatorStr;
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    monDecSeparatorStr.append(monDecSeparator);
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Before set ==> Currency : " + currency +(UnicodeString)" Intl Currency : " + intlCurrency + (UnicodeString)" Monetary Decimal Separator : " + monDecSeparatorStr);
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->setSymbol(DecimalFormatSymbols::kCurrencySymbol, UnicodeString("XYZ"));
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, UnicodeString("ABC"));
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol, UnicodeString((UChar)0x002A/*'*'*/));
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currency = fmt->getSymbol(DecimalFormatSymbols::kCurrencySymbol);
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    intlCurrency = fmt->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol);
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    monDecSeparator = fmt->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol);
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (currency != UnicodeString("XYZ") ||
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        intlCurrency != UnicodeString("ABC") ||
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        monDecSeparator != UnicodeString((UChar)0x002A/*'*'*/)) {
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("setCurrencySymbols failed.");
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    monDecSeparatorStr.remove();
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    monDecSeparatorStr.append(monDecSeparator);
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("After set ==> Currency : " + currency + " Intl Currency : " + intlCurrency + " Monetary Decimal Separator : " + monDecSeparatorStr);
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4062486
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * API tests for API addition request A23. FieldPosition.getBeginIndex and
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * FieldPosition.getEndIndex.
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4062486(void)
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *fmt = new DecimalFormat(UnicodeString("#,##0.00"), status);
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString formatted;
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition field(0);
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double num = 1234.5;
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->format(num, formatted, field);
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (field.getBeginIndex() != 0 && field.getEndIndex() != 5)
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Format 1234.5 failed. Begin index: ") /*+ field.getBeginIndex() + " End index: " + field.getEndIndex()*/);
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    field.setBeginIndex(7);
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    field.setEndIndex(4);
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (field.getBeginIndex() != 7 && field.getEndIndex() != 4)
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Set begin/end field indexes failed. Begin index: " /*+ field.getBeginIndex() + " End index: " + field.getEndIndex()*/);
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4108738
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse incorrectly works with a group separator.
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4108738(void)
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getUS(), status);
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormatSymbols");
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat("#,##0.###", syms, status);
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
14046d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("1.222,111");
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable num;
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pp(0);
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(text, num, pp);
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} how to do this (again) ?
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // shouldn't just be another round-trip test, should it?
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = df->format(num.getDouble(), temp, pos);
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (!num.toString().equals("1.222"))
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("1.222"))
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("\"" + text + "\"  is parsed as " + num);
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("\"" + text + "\"  is parsed as " + temp);
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    text = UnicodeString("1.222x111");
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pp = ParsePosition(0);
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(text, num, pp);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp.remove();
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    temp = df->format(num.getDouble(), temp, pos);
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if (!num.toString().equals("1.222"))
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (temp != UnicodeString("1.222"))
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("\"" + text + "\"  is parsed as " + temp);
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106658
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() incorrectly formats negative doubles.
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106658(void)
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status); // Corrected; see 4147706
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
14436d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    volatile double d1 = 0.0;   // volatile to prevent code optimization
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double d2 = -0.0001;
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buffer;
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined(U_HPUX)
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1 = 0.0 * -1.0;    // old HPUX compiler ignores volatile keyword
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d1 *= -1.0; // Some compilers have a problem with defining -0.0
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("pattern: \"" + df->toPattern(temp) + "\"");
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(d1, buffer, pos);
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (buffer != UnicodeString("-0")) // Corrected; see 4147706
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("") + d1 + "      is formatted as " + buffer);
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer.remove();
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(d2, buffer, pos);
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (buffer != UnicodeString("-0")) // Corrected; see 4147706
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("") + d2 + "      is formatted as " + buffer);
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106662
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse returns 0 if string parameter is incorrect.
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106662(void)
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
14796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("x");
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pos1(0), pos2(0);
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("pattern: \"" + df->toPattern(temp) + "\"");
1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable num;
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(text, num, pos1);
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos1 == ParsePosition(0)/*num != null*/) {
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Test Failed: \"") + text + "\" is parsed as " /*+ num*/);
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df = new DecimalFormat(UnicodeString("$###.00"), status);
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse(UnicodeString("$"), num, pos2);
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos2 == ParsePosition(0) /*num != null*/){
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Test Failed: \"$\" is parsed as ") /*+ num*/);
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4114639 (duplicate of 4106662)
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat.parse doesn't return null
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4114639(void)
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *format = NumberFormat::createInstance(status);
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
15136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln("Error creating DecimalFormat: %s", u_errorName(status));
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete format;
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createInstance");
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString text("time 10:x");
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pos(8);
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable result;
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    format->parse(text, result, pos);
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (/*result != null*/pos.getErrorIndex() != 8)
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Should return null but got : ") /*+ result*/); // Should be null; it isn't
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete format;
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106664
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TODO: this test does not work because we need to use a 64 bit number and a
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a double only MAY only have 52 bits of precision.
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format(long n) fails if n * multiplier > MAX_LONG.
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106664(void)
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
15386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} long in java is 64 bits
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*long*/double n = 1234567890123456.0;
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*int*/int32_t m = 12345678;
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} will this work?
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //BigInteger bigN = BigInteger.valueOf(n);
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //bigN = bigN.multiply(BigInteger.valueOf(m));
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double bigN = n * m;
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setMultiplier(m);
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setGroupingUsed(FALSE);
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("formated: " +
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->format(n, temp, pos));
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char buf [128];
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sprintf(buf, "%g", bigN);
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //logln("expected: " + bigN.toString());
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("expected: ") + buf);
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4106667 (duplicate of 4106658)
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format incorrectly formats -0.0.
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4106667(void)
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat(status);
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
15726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete df;
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar foo [] = { 0x002B };
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString bar(foo, 1, 1);
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    volatile double d = 0.0;   // volatile to prevent code optimization
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buffer;
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("pattern: \"" + df->toPattern(temp) + "\"");
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined(U_HPUX)
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = 0.0 * -1.0;    // old HPUX compiler ignores volatile keyword
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d *= -1.0; // Some compilers have a problem with defining -0.0
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setPositivePrefix(/*"+"*/bar);
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(d, buffer, pos);
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (buffer != UnicodeString("-0")) // Corrected; see 4147706
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(/*d + */UnicodeString("  is formatted as ") + buffer);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4110936
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.setMaximumIntegerDigits() works incorrectly.
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef OS390
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define MAX_INT_DIGITS 70
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   define MAX_INT_DIGITS 128
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4110936(void)
1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createInstance(status);
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
16126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln("Error creating DecimalFormat: %s", u_errorName(status));
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete nf;
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "NumberFormat::createInstance");
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->setMaximumIntegerDigits(MAX_INT_DIGITS);
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("setMaximumIntegerDigits(MAX_INT_DIGITS)");
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (nf->getMaximumIntegerDigits() != MAX_INT_DIGITS)
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("getMaximumIntegerDigits() returns " +
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            nf->getMaximumIntegerDigits());
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4122840
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Locale data should use generic currency symbol
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1) Make sure that all currency formats use the generic currency symbol.
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2) Make sure we get the same results using the generic symbol or a
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *    hard-coded one.
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4122840(void)
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count = 0;
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale *locales = Locale::getAvailableLocales(count);
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i = 0; i < count; i++) {
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ResourceBundle *rb = new ResourceBundle(
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            NULL/*"java.text.resources.LocaleElements"*/,
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            locales[i], status);
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "new ResourceBundle");
164427f654740f2a26ad62a5c155af9199af9e69b889claireho        ResourceBundle numPat = rb->getWithFallback("NumberElements", status);
164527f654740f2a26ad62a5c155af9199af9e69b889claireho        failure(status, "rb.get(NumberElements)");
164627f654740f2a26ad62a5c155af9199af9e69b889claireho        numPat = numPat.getWithFallback("latn",status);
164727f654740f2a26ad62a5c155af9199af9e69b889claireho        failure(status, "rb.get(latn)");
164827f654740f2a26ad62a5c155af9199af9e69b889claireho        numPat = numPat.getWithFallback("patterns",status);
164927f654740f2a26ad62a5c155af9199af9e69b889claireho        failure(status, "rb.get(patterns)");
165027f654740f2a26ad62a5c155af9199af9e69b889claireho        numPat = numPat.getWithFallback("currencyFormat",status);
165127f654740f2a26ad62a5c155af9199af9e69b889claireho        failure(status, "rb.get(currencyFormat)");
165227f654740f2a26ad62a5c155af9199af9e69b889claireho       //
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Get the currency pattern for this locale.  We have to fish it
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // out of the ResourceBundle directly, since DecimalFormat.toPattern
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // will return the localized symbol, not \00a4
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //
165727f654740f2a26ad62a5c155af9199af9e69b889claireho        UnicodeString pattern = numPat.getString(status);
165827f654740f2a26ad62a5c155af9199af9e69b889claireho        failure(status, "rb->getString()");
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar fo[] = { 0x00A4 };
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString foo(fo, 1, 1);
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //if (pattern.indexOf("\u00A4") == -1 ) {
1664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pattern.indexOf(foo) == -1 ) {
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Currency format for ") + UnicodeString(locales[i].getName()) +
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    " does not contain generic currency symbol:" +
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    pattern );
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Create a DecimalFormat using the pattern we got and format a number
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormatSymbols *symbols = new DecimalFormatSymbols(locales[i], status);
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "new DecimalFormatSymbols");
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat *fmt1 = new DecimalFormat(pattern, *symbols, status);
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "new DecimalFormat");
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString result1;
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result1 = fmt1->format(1.111, result1, pos);
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Now substitute in the locale's currency symbol and create another
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // pattern.  We have to skip locales where the currency symbol
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // contains decimal separators, because that confuses things
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar ba[] = { 0x002E/*'.'*/ };
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString bar(ba, 1, 1);
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (symbols->getSymbol(DecimalFormatSymbols::kCurrencySymbol).indexOf(bar) == -1) {
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // {sfb} Also, switch the decimal separator to the monetary decimal
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // separator to mimic the behavior of a currency format
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            symbols->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol,
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                symbols->getSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol));
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString buf(pattern);
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int j = 0; j < buf.length(); j++) {
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (buf[j] == 0x00a4 ) {
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    if(buf[j + 1] == 0x00a4) {
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        // {sfb} added to support double currency marker (intl currency sign)
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        buf.replace(j, /*j+*/2, symbols->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol));
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        j += symbols->getSymbol(DecimalFormatSymbols::kIntlCurrencySymbol).length();
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    else {
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        buf.replace(j, /*j+*/1, symbols->getSymbol(DecimalFormatSymbols::kCurrencySymbol));
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        j += symbols->getSymbol(DecimalFormatSymbols::kCurrencySymbol).length() - 1;
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            DecimalFormat *fmt2 = new DecimalFormat(buf, *symbols, status);
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failure(status, "new DecimalFormat");
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Get the currency (if there is one) so we can set the rounding and fraction
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const UChar *currency = fmt1->getCurrency();
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (*currency != 0) {
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                double rounding = ucurr_getRoundingIncrement(currency, &status);
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                int32_t frac = ucurr_getDefaultFractionDigits(currency, &status);
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if (U_SUCCESS(status)) {
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fmt2->setRoundingIncrement(rounding);
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fmt2->setMinimumFractionDigits(frac);
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    fmt2->setMaximumFractionDigits(frac);
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                else {
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    failure(status, "Fetching currency rounding/fractions");
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString result2;
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt2->format(1.111, result2, pos);
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (result1 != result2) {
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Results for " + (UnicodeString)(locales[i].getName()) + " differ: " +
1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        result1 + " vs " + result2);
1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete fmt2;
1736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete rb;
1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt1;
1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete symbols;
1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @bug 4125885
1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.format() delivers wrong string.
1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4125885(void)
1748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double rate = 12.34;
1751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *formatDec = new DecimalFormat ("000.00", status);
1752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
17536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating DecimalFormat: %s", u_errorName(status));
1754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete formatDec;
1755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
1756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("toPattern: " + formatDec->toPattern(temp));
1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString rateString;
1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(FieldPosition::DONT_CARE);
1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rateString = formatDec->format(rate, rateString, pos);
1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rateString != UnicodeString("012.34"))
1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("result : " + rateString + " expected : 012.34");
1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rate = 0.1234;
1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatDec;// = null;
1767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    formatDec = new DecimalFormat ("+000.00%;-000.00%", status);
1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("toPattern: " + formatDec->toPattern(temp));
1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rateString.remove();
1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rateString = formatDec->format(rate, rateString, pos);
1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rateString != UnicodeString("+012.34%"))
1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("result : " + rateString + " expected : +012.34%");
1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete formatDec;
1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4134034
1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat produces extra zeros when formatting numbers.
1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4134034(void)
1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *nf = new DecimalFormat("##,###,###.00", status);
17866d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "new DecimalFormat")) {
17876d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString f;
17886d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
17896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        f = nf->format(9.02, f, pos);
17906d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (f == UnicodeString("9.02"))
17916d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            logln(f + " ok");
17926d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        else
17936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln("9.02 -> " + f + "; want 9.02");
1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        f.remove();
17966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        f = nf->format((int32_t)0, f, pos);
17976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (f == UnicodeString(".00"))
17986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            logln(f + " ok");
17996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        else
18006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln("0 -> " + f + "; want .00");
18016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4134300
1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CANNOT REPRODUCE - This bug could not be reproduced.  It may be
1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a duplicate of 4134034.
1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * JDK 1.1.6 Bug, did NOT occur in 1.1.5
1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Possibly related to bug 4125885.
1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This class demonstrates a regression in version 1.1.6
1815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of DecimalFormat class.
1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1.1.6 Results
1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #.00 Result '01.20' !!!wrong
1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 0.00 Result '001.20' !!!wrong
1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 00.00 Result '0001.20' !!!wrong
1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.0# Result '1.2'
1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.00 Result '001.20' !!!wrong
1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 1.1.5 Results
1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #.00 Result '1.20'
1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 0.00 Result '1.20'
1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format 00.00 Result '01.20'
1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.0# Result '1.2'
1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Value 1.2 Format #0.00 Result '1.20'
1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4134300(void) {
1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString DATA [] = {
1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     // Pattern      Expected string
1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("#.00"),      UnicodeString("1.20"),
1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("0.00"),      UnicodeString("1.20"),
1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("00.00"),     UnicodeString("01.20"),
1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("#0.0#"),     UnicodeString("1.2"),
1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("#0.00"),     UnicodeString("1.20")
1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i=0; i< 10; i+=2) {
1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString result;
1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat *df = new DecimalFormat(DATA[i], status);
18456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (!failure(status, "new DecimalFormat")) {
18466d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            FieldPosition pos(FieldPosition::DONT_CARE);
18476d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            result = df->format(1.2, result, pos);
18486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            if (result != DATA[i+1]) {
18496d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                errln("Fail: 1.2 x " + DATA[i] + " = " + result +
18506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      "; want " + DATA[i+1]);
18516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            }
18526d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            else {
18536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                logln("Ok: 1.2 x " + DATA[i] + " = " + result);
18546d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            }
1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete df;
1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4140009
1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Empty pattern produces double negative prefix.
1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4140009(void)
1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getEnglish(), status);
1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormatSymbols");
1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *f = new DecimalFormat(UnicodeString(""), syms, status);
18716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "new DecimalFormat")) {
18726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString s;
18736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
18746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = f->format(123.456, s, pos);
18756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (s != UnicodeString("123.456"))
18766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln("Fail: Format empty pattern x 123.456 => " + s);
18776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s.remove();
18786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        s = f->format(-123.456, s, pos);
18796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (s != UnicodeString("-123.456"))
18806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln("Fail: Format empty pattern x -123.456 => " + s);
18816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete f;
1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4141750
1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * BigDecimal numbers get their fractions truncated by NumberFormat.
1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} not pertinent in C++ ??
1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4141750(void) {
1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*try {
1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str("12345.67");
1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BigDecimal bd = new BigDecimal(str);
1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        String sd = NumberFormat.getInstance(Locale.US).format(bd);
1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!sd.endsWith("67")) errln("Fail: " + str + " x format -> " + sd);
1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch (Exception e) {
1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(e.toString());
1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e.printStackTrace();
1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4145457
1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat toPattern() doesn't quote special characters or handle
1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * single quotes.
1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4145457() {
1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nff = NumberFormat::createInstance(status);
19126d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createInstance", TRUE)){
1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nff;
1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
191627f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *nf = dynamic_cast<DecimalFormat *>(nff);
191727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(nf == NULL) {
1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("DecimalFormat needed to continue");
1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *sym = (DecimalFormatSymbols*) nf->getDecimalFormatSymbols();
1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym->setSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol, (UChar)/*'\''*/0x0027);
1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->setDecimalFormatSymbols(*sym);
1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double pi = 3.14159;
1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString PATS [] = {
1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString("#.00 'num''ber'"), UnicodeString("''#.00''")
1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i<2; ++i) {
1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->applyPattern(PATS[i], status);
1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "nf->applyPattern");
1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString out;
1935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out = nf->format(pi, out, pos);
1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pat;
1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pat = nf->toPattern(pat);
1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Formattable num;
1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ParsePosition pp(0);
1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->parse(out, num, pp);
1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double val = num.getDouble();
1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->applyPattern(pat, status);
1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "nf->applyPattern");
1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString out2;
1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        out2 = nf->format(pi, out2, pos);
1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString pat2;
1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pat2 = nf->toPattern(pat2);
195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        pp.setIndex(0);
1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nf->parse(out2, num, pp);
1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double val2 = num.getDouble();
1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (pat != pat2)
1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail with \"" + PATS[i] + "\": Patterns should concur, \"" +
1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pat + "\" vs. \"" + pat2 + "\"");
1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else
1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Ok \"" + PATS[i] + "\" toPattern() -> \"" + pat + '"');
1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (val == val2 && out == out2) {
1961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("Ok ") + pi + " x \"" + PATS[i] + "\" -> \"" +
1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                out + "\" -> " + val + " -> \"" +
1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                out2 + "\" -> " + val2);
1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Fail ") + pi + " x \"" + PATS[i] + "\" -> \"" +
1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                out + "\" -> " + val + " -> \"" +
1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                out2 + "\" -> " + val2);
1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*}
1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch (ParseException e) {
1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: " + e);
1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e.printStackTrace();
1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }*/
1976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nff;
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147295
1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.applyPattern() sets minimum integer digits incorrectly.
1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CANNOT REPRODUCE
1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This bug is a duplicate of 4139344, which is a duplicate of 4134300
1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4147295(void)
1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *sdf = new DecimalFormat(status);
1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pattern("#,###");
1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Applying pattern \"" + pattern + "\"");
1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sdf->applyPattern(pattern, status);
19936d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "sdf->applyPattern")) {
19946d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        int minIntDig = sdf->getMinimumIntegerDigits();
19956d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (minIntDig != 0) {
19966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln("Test failed");
1997b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln(UnicodeString(" Minimum integer digits : ") + minIntDig);
19986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString temp;
1999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            errln(UnicodeString(" new pattern: ") + sdf->toPattern(temp));
20006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        } else {
20016d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            logln("Test passed");
2002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            logln(UnicodeString(" Minimum integer digits : ") + minIntDig);
20036d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete sdf;
2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4147706
2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat formats -0.0 as +0.0
2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See also older related bug 4106658, 4106667
2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4147706(void)
2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *df = new DecimalFormat("#,##0.0##", status);
2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new DecimalFormat");
2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale::getEnglish(), status);
20196d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "new DecimalFormatSymbols")) {
20206d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString f1;
20216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        UnicodeString f2, temp;
20226d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        FieldPosition pos(FieldPosition::DONT_CARE);
20236d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        volatile double d1 = 0.0;   // volatile to prevent code optimization
20246d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        double d2 = -0.0001;
2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if defined(U_HPUX)
20276d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        d1 = 0.0 * -1.0;    // old HPUX compiler ignores volatile keyword
2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
20296d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        d1 *= -1.0; // Some compilers have a problem with defining -0.0
2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
20316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        df->adoptDecimalFormatSymbols(syms);
20326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        f1 = df->format(d1, f1, pos);
20336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        f2 = df->format(d2, f2, pos);
20346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (f1 != UnicodeString("-0.0")) {
20356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln(UnicodeString("") + d1 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f1 + '"');
20366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
20376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (f2 != UnicodeString("-0.0")) {
20386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            errln(UnicodeString("") + d2 + UnicodeString(" x \"") + df->toPattern(temp) + "\" is formatted as \"" + f2 + '"');
20396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        }
2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
20416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Not applicable, since no serialization in C++
2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*class myformat implements Serializable
2048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDateFormat _dateFormat = DateFormat.getDateInstance();
2050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic String Now()
2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar calendar = new GregorianCalendar();
2054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Date t = calendar.getTime();
2055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    String nowStr = _dateFormat.format(t);
2056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return nowStr;
2057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}*/
2059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4162198
2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat cannot format Double.MAX_VALUE
2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// TODO: make this test actually test something
2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::Test4162198(void)
2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // for some reason, DBL_MAX will not round trip. (bug in sprintf/atof)
2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double dbl = INT32_MAX * 1000.0;
2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *f = NumberFormat::createInstance(status);
2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
20736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Couldn't create number format - %s", u_errorName(status));
2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f->setMaximumFractionDigits(INT32_MAX);
2077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f->setMaximumIntegerDigits(INT32_MAX);
2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
2079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f->format(dbl,s);
2080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("The number ") + dbl + " formatted to " + s);
2081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable n;
2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
2083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    f->parse(s, n, status);
2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Couldn't parse!");
2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //} catch (java.text.ParseException e) {
2087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln("Caught a ParseException:");
2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    e.printStackTrace();
2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //logln("The string " + s + " parsed as " + n);
2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {dlf} The old code assumes n is a double, but it isn't any more...
2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Formattable apparently does not and never did interconvert... too bad.
2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if(n.getDouble() != dbl) {
2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln("Round trip failure");
2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //}
2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (n.getInt64() != dbl) {
2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Round trip failure");
2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete f;
2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4162852
2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat does not parse negative zero.
2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNumberFormatRegressionTest::Test4162852(void)
2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t i=0; i < 2; ++i) {
2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        NumberFormat *f = (i == 0) ? NumberFormat::createInstance(status)
2115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            : NumberFormat::createPercentInstance(status);
2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status)) {
21176d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Couldn't create number format - %s", u_errorName(status));
2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double d = 0.0;
2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        d *= -1.0;
2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString s;
2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f->format(d, s);
2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        Formattable n;
2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        f->parse(s, n, status);
2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(status))
2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Couldn't parse!");
2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        double e = n.getDouble();
2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("") +
2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              d + " -> " +
2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              '"' + s + '"' + " -> " + e);
2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if (defined(OS390) && !defined(IEEE_754)) || defined(OS400)
2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (e != 0.0) {
2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (e != 0.0 || 1.0/e > 0.0) {
2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("Failed to parse negative zero");
2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete f;
2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic double _u_abs(double a) { return a<0?-a:a; }
2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4167494
2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat truncates data
2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4167494(void) {
2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status);
21536d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createInstance", TRUE)){
2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double a = DBL_MAX * 0.99; // DBL_MAX itself overflows to +Inf
2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->format(a, s);
2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable num;
2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->parse(s, num, status);
2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "Parse");
2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (num.getType() == Formattable::kDouble &&
2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        _u_abs(num.getDouble() - a) / a < 0.01) { // RT within 1%
2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("") + a + " -> \"" + s + "\" -> " +
2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(num) + " ok");
2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("") + a + " -> \"" + s + "\" -> " +
2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              toString(num) + " FAIL");
2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // We don't test Double.MIN_VALUE because the locale data for the US
2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // currently doesn't specify enough digits to display Double.MIN_VALUE.
2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // This is correct for now; however, we leave this here as a reminder
2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // in case we want to address this later.
2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4170798
2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse() fails when ParseIntegerOnly set to true
2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4170798(void) {
2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status);
21896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "NumberFormat::createInstance", TRUE)){
2190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nf;
2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
219327f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *df = dynamic_cast<DecimalFormat *>(nf);
219427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(df == NULL) {
2195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("DecimalFormat needed to continue");
2196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setParseIntegerOnly(TRUE);
2199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable n;
2200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pos(0);
2201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->parse("-0.0", n, pos);
2202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (n.getType() != Formattable::kLong
2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        || n.getLong() != 0) {
2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: parse(\"-0.0\") returns ") + toString(n));
2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * toPattern only puts the first grouping separator in.
2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4176114(void) {
2214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* DATA[] = {
2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "00", "#00",
2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "000", "#000", // No grouping
2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "#000", "#000", // No grouping
2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "#,##0", "#,##0",
2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "#,000", "#,000",
2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0,000", "#0,000",
2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "00,000", "#00,000",
2222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "000,000", "#,000,000",
2223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0,000,000,000,000.0000", "#0,000,000,000,000.0000", // Reported
2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0]));
2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
2228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i=0; i<DATA_length; i+=2) {
2229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        DecimalFormat df(DATA[i], status);
22306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        if (!failure(status, "DecimalFormat constructor")) {
22316d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            df.toPattern(s);
22326d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString exp(DATA[i+1]);
22336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            if (s != exp) {
22346d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                errln(UnicodeString("FAIL: ") + DATA[i] + " -> " +
22356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      s + ", want " + exp);
22366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            }
2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4179818
2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat is incorrectly rounding numbers like 1.2501 to 1.2
2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4179818(void) {
2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* DATA[] = {
2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Input  Pattern  Expected output
2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "1.2511", "#.#",   "1.3",
2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "1.2501", "#.#",   "1.3",
2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "0.9999", "#",     "1",
2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0]));
2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double DOUBLE[] = {
2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1.2511,
2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1.2501,
2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0.9999,
2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "Construct DecimalFormatSymbols");
2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt("#", sym, status);
22636d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "Construct DecimalFormat")) {
22646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        for (int i=0; i<DATA_length; i+=3) {
22656d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            double in = DOUBLE[i/3];
22666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString pat(DATA[i+1]);
22676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString exp(DATA[i+2]);
22686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            fmt.applyPattern(pat, status);
22696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            failure(status, "applyPattern");
22706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString out;
22716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            FieldPosition pos;
22726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            fmt.format(in, out, pos);
22736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            if (out == exp) {
22746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                logln(UnicodeString("Ok: ") + in + " x " + pat + " = " + out);
22756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            } else {
22766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                errln(UnicodeString("FAIL: ") + in + " x  " + pat + " = " + out +
22776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      ", expected " + exp);
22786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            }
2279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Some DecimalFormatSymbols changes are not picked up by DecimalFormat.
2286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This includes the minus sign, currency symbol, international currency
2287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * symbol, percent, and permille.  This is filed as bugs 4212072 and
2288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4212073.
2289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4212072(void) {
2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "DecimalFormatSymbols ct", Locale::getUS());
2295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt(UnicodeString("#"), sym, status);
22966d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if(failure(status, "DecimalFormat ct", Locale::getUS())) {
22976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
22986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
2301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos;
2302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, (UChar)0x5e);
2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setDecimalFormatSymbols(sym);
2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.format((int32_t)-1, s, pos) != UNICODE_STRING("^1", 2)) {
2307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: -1 x (minus=^) -> ") + s +
2308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", exp ^1");
2309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.getNegativePrefix(s) != UnicodeString((UChar)0x5e)) {
2312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: (minus=^).getNegativePrefix -> ") +
2313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              s + ", exp ^");
2314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kMinusSignSymbol, (UChar)0x2d);
2316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.applyPattern(UnicodeString("#%"), status);
2318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "applyPattern percent");
2319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UChar)0x5e);
2320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setDecimalFormatSymbols(sym);
2321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.format(0.25, s, pos) != UNICODE_STRING("25^", 3)) {
2323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: 0.25 x (percent=^) -> ") + s +
2324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", exp 25^");
2325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.getPositiveSuffix(s) != UnicodeString((UChar)0x5e)) {
2328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: (percent=^).getPositiveSuffix -> ") +
2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              s + ", exp ^");
2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kPercentSymbol, (UChar)0x25);
2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.applyPattern(str("#\\u2030"), status);
2334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "applyPattern permill");
2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, (UChar)0x5e);
2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setDecimalFormatSymbols(sym);
2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.format(0.25, s, pos) != UNICODE_STRING("250^", 4)) {
2339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: 0.25 x (permill=^) -> ") + s +
2340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", exp 250^");
2341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.getPositiveSuffix(s) != UnicodeString((UChar)0x5e)) {
2344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: (permill=^).getPositiveSuffix -> ") +
2345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              s + ", exp ^");
2346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kPerMillSymbol, (UChar)0x2030);
2348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.applyPattern(str("\\u00A4#.00"), status);
2350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "applyPattern currency");
2351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "usd");
2352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setDecimalFormatSymbols(sym);
2353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.format(12.5, s, pos) != UnicodeString("usd12.50")) {
2355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: 12.5 x (currency=usd) -> ") + s +
2356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", exp usd12.50");
2357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.getPositivePrefix(s) != UnicodeString("usd")) {
2360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: (currency=usd).getPositivePrefix -> ") +
2361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              s + ", exp usd");
2362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kCurrencySymbol, "$");
2364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.applyPattern(str("\\u00A4\\u00A4#.00"), status);
2366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "applyPattern intl currency");
2367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, "DOL");
2368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.setDecimalFormatSymbols(sym);
2369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.format(12.5, s, pos) != UnicodeString("DOL12.50")) {
2371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: 12.5 x (intlcurrency=DOL) -> ") + s +
2372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", exp DOL12.50");
2373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s.remove();
2375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt.getPositivePrefix(s) != UnicodeString("DOL")) {
2376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: (intlcurrency=DOL).getPositivePrefix -> ") +
2377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              s + ", exp DOL");
2378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sym.setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol, "USD");
2380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Since the pattern logic has changed, make sure that patterns round
2382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // trip properly.  Test stream in/out integrity too.
2383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n;
2384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale* avail = NumberFormat::getAvailableLocales(n);
2385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char* type[] = {
2386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "",
2387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "$ ",
2388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "% ",
2389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i=0; i<n; ++i) {
2391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int j=0; j<3; ++j) {
2392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
2393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            NumberFormat *nf;
2394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            switch (j) {
2395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case 0:
2396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                nf = NumberFormat::createInstance(avail[i], status);
2397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failure(status, "createInstance", avail[i]);
2398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
2399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            case 1:
2400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                nf = NumberFormat::createCurrencyInstance(avail[i], status);
2401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failure(status, "createCurrencyInstance", avail[i]);
2402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
2403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            default:
2404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                nf = NumberFormat::createPercentInstance(avail[i], status);
2405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                failure(status, "createPercentInstance", avail[i]);
2406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
2407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
2410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            DecimalFormat *df = (DecimalFormat*) nf;
2412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Test toPattern/applyPattern round trip
2414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString pat;
2415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->toPattern(pat);
2416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            DecimalFormatSymbols symb(avail[i], status);
2417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failure(status, "Construct DecimalFormatSymbols", avail[i]);
2418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            DecimalFormat f2(pat, symb, status);
2419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (failure(status,
2420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UnicodeString("Construct DecimalFormat(") + pat + ")")) {
2421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
2422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (*df != f2) {
2424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString l, p;
2425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(UnicodeString("FAIL: ") + type[j] + avail[i].getDisplayName(l) +
2426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " -> \"" + pat +
2427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      "\" -> \"" + f2.toPattern(p) + "\"");
242827f654740f2a26ad62a5c155af9199af9e69b889claireho            } else {
242927f654740f2a26ad62a5c155af9199af9e69b889claireho                UnicodeString l, p;
243027f654740f2a26ad62a5c155af9199af9e69b889claireho                logln(UnicodeString("PASS: ") + type[j] + avail[i].getDisplayName(l) +
243127f654740f2a26ad62a5c155af9199af9e69b889claireho                      " -> \"" + pat +
243227f654740f2a26ad62a5c155af9199af9e69b889claireho                      "\"");
2433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Test toLocalizedPattern/applyLocalizedPattern round trip
2436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->toLocalizedPattern(pat);
2437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            f2.applyLocalizedPattern(pat, status);
2438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failure(status,
2439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString("applyLocalizedPattern(") + pat + ")", avail[i]);
2440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
2442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Make sure we set the currency attributes appropriately
2445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (j == 1) {   // Currency format
2446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                f2.setCurrency(f2.getCurrency(), status);
2447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failure(status,
2449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UnicodeString("setCurrency() for (") + pat + ")", avail[i]);
2450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
2451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
2452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (*df != f2) {
2455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UnicodeString l, p;
2456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(UnicodeString("FAIL: ") + type[j] + avail[i].getDisplayName(l) +
2457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " -> localized \"" + pat +
2458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      "\" -> \"" + f2.toPattern(p) + "\"");
2459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete nf;
2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Test writeObject/readObject round trip
2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // NOT ON ICU -- Java only
2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat.parse() fails for mulipliers 2^n.
2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4216742(void) {
2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat *fmt = (DecimalFormat*) NumberFormat::createInstance(Locale::getUS(), status);
24766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "createInstance", Locale::getUS(), TRUE)){
2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA[] = { INT32_MIN, INT32_MAX, -100000000, 100000000 };
2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int DATA_length = (int)(sizeof(DATA) / sizeof(DATA[0]));
2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i=0; i<DATA_length; ++i) {
2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str((UnicodeString)"" + DATA[i]);
2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int m = 1; m <= 100; m++) {
2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->setMultiplier(m);
2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            Formattable num;
2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt->parse(str, num, status);
2488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            failure(status, "parse", Locale::getUS());
2489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (num.getType() != Formattable::kLong &&
2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                num.getType() != Formattable::kDouble) {
2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln(UnicodeString("FAIL: Wanted number, got ") +
2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      toString(num));
2493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
2494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                double d = num.getType() == Formattable::kDouble ?
2495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    num.getDouble() : (double) num.getLong();
249627f654740f2a26ad62a5c155af9199af9e69b889claireho                if ((d > 0) != (DATA[i] > 0)) {
2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(UnicodeString("\"") + str + "\" parse(x " +
2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          fmt->getMultiplier() +
2499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          ") => " + toString(num));
2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
2502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
2505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * May 17 1999 sync up - liu
2509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat formats 1.001 to "1.00" instead of "1" with 2 fraction
2510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * digits.
2511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4217661(void) {
2513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const double D[] = {  0.001, 1.001, 0.006,  1.006 };
2514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char*  S[] = { "0",   "1",   "0.01", "1.01" };
2515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int D_length = (int)(sizeof(D) / sizeof(D[0]));
2516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *fmt = NumberFormat::createInstance(Locale::getUS(), status);
25186d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "createInstance", Locale::getUS(), TRUE)){
2519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fmt;
2520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt->setMaximumFractionDigits(2);
2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int i=0; i<D_length; i++) {
2524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString s;
2525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->format(D[i], s);
2526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (s != UnicodeString(S[i])) {
2527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL: Got ") + s + ", exp " + S[i]);
2528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
2531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * alphaWorks upgrade
2535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4161100(void) {
2537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createInstance(Locale::getUS(), status);
25396d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "createInstance", Locale::getUS(), TRUE)){
2540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete nf;
2541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
2543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->setMinimumFractionDigits(1);
2544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->setMaximumFractionDigits(1);
2545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    double a = -0.09;
2546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString s;
2547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nf->format(a, s);
2548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
2549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString() + a + " x " +
2550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          ((DecimalFormat*) nf)->toPattern(pat) + " = " + s);
2551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (s != UnicodeString("-0.1")) {
2552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL");
2553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete nf;
2555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * June 16 1999 sync up - liu
2559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Formatting .5 rounds to "1" instead of "0". (Regression in 1.2.2 RC1)
2560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4243011(void) {
2562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
2564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "DecimalFormatSymbols ct", Locale::getUS());
2565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt(UnicodeString("0."), sym, status);
25666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
25676d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!failure(status, "DecimalFormat ct", Locale::getUS())) {
25686d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        const double NUM[] = {  -2.5,  -1.5,  -0.5,  0.5,  1.5,  2.5,  3.5,  4.5 };
25696d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        const char*  STR[] = { "-2.", "-2.", "-0.", "0.", "2.", "2.", "4.", "4." };
25706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        int32_t N = (int32_t)(sizeof(NUM) / sizeof(NUM[0]));
25716d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru
25726d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        for (int32_t i=0; i<N; ++i) {
25736d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString str;
25746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            UnicodeString exp(STR[i]);
25756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            FieldPosition pos;
25766d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            fmt.format(NUM[i], str, pos);
25776d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            if (str == exp) {
25786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                logln(UnicodeString("Ok   ") + NUM[i] + " x 0. = " + str);
25796d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            } else {
25806d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                errln(UnicodeString("FAIL ") + NUM[i] + " x 0. = " + str +
25816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      ", want " + exp);
25826d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            }
2583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
2584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * June 16 1999 sync up - liu
2589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * format(0.0) gives "0.1" if preceded by parse("99.99").
2590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (Regression in 1.2.2 RC1)
2591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::Test4243108(void) {
2593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormatSymbols sym(Locale::getUS(), status);
2595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "DecimalFormatSymbols ct", Locale::getUS());
2596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DecimalFormat fmt(UnicodeString("#.#"), sym, status);
25976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (failure(status, "DecimalFormat ct", Locale::getUS())) {
25986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        return;
25996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    }
2600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
2602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos;
2603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(0.0, str, pos);
2605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString exp("0");
2606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str == exp) {
2607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   0.0 x #.# = ") + str);
2608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL 0.0 x #.# = ") + str +
2610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", want " + exp);
2611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str = "99.99";
2614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable val;
2615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.parse(str, val, status);
2616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "DecimalFormat.parse(99.99)", Locale::getUS());
2617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (val.getType() == Formattable::kDouble &&
2618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        val.getDouble() == 99.99) {
2619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   99.99 / #.# = ") + toString(val));
2620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL 99.99 / #.# = ") + toString(val) +
2622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", want " + 99.99);
2623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    str.remove();
2626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt.format(0.0, str, pos);
2627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (str == exp) {
2628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("Ok   0.0 x #.# = ") + str);
2629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
2630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL 0.0 x #.# = ") + str +
2631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", want " + exp);
2632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
2637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DateFormat should call setIntegerParseOnly(TRUE) on adopted
2638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NumberFormat objects.
2639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
2640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid NumberFormatRegressionTest::TestJ691(void) {
2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale loc("fr", "CH");
2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // set up the input date string & expected output
2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString udt("11.10.2000", "");
2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString exp("11.10.00", "");
2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // create a Calendar for this locale
2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(loc, status);
2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
265150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("FAIL: Calendar::createInstance() returned " + (UnicodeString)u_errorName(status));
2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // create a NumberFormat for this locale
2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    NumberFormat *nf = NumberFormat::createInstance(loc, status);
2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
26586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: NumberFormat::createInstance() returned " + (UnicodeString)u_errorName(status));
2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // *** Here's the key: We don't want to have to do THIS:
2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nf->setParseIntegerOnly(TRUE);
2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // create the DateFormat
2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat *df = DateFormat::createDateInstance(DateFormat::kShort, loc);
2667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: DateFormat::createInstance() returned " + (UnicodeString)u_errorName(status));
2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->adoptCalendar(cal);
2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->adoptNumberFormat(nf);
2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // set parsing to lenient & parse
2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->setLenient(TRUE);
2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate ulocdat = df->parse(udt, status);
2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // format back to a string
2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString outString;
2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    df->format(ulocdat, outString);
2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (outString != exp) {
2684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + udt + " => " + outString);
2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete df;
2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2690b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//---------------------------------------------------------------------------
2691b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//
2692b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//   Error Checking / Reporting macros
2693b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//
2694b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho//---------------------------------------------------------------------------
2695b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TEST_CHECK_STATUS(status) \
2696b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (U_FAILURE(status)) {\
2697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("File %s, Line %d.  status=%s\n", __FILE__, __LINE__, u_errorName(status));\
2698b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;\
2699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define TEST_ASSERT(expr) \
2702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if ((expr)==FALSE) {\
2703b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        errln("File %s, line %d: Assertion Failed: " #expr "\n", __FILE__, __LINE__);\
2704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2707b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Ticket 8199:  Parse failure for numbers in the range of 1E10 - 1E18
2708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid NumberFormatRegressionTest::Test8199(void) {
2710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode status = U_ZERO_ERROR;
2711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    NumberFormat *nf = NumberFormat::createInstance(Locale::getEnglish(), status);
2712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (nf == NULL) {
2713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("Fail: NumberFormat::createInstance(Locale::getEnglish(), status)");
2714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
2715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
2716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2717b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2718b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Note:  Retrieving parsed values from a Formattable as a reduced-precision type
2719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //        should always truncate, no other rounding scheme.
2720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UnicodeString numStr = "1000000000.6";   // 9 zeroes
2722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    Formattable val;
2723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(1000000000 == val.getInt64(status));
2727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(1000000000.6 == val.getDouble(status));
2729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "100000000000000001.1";   // approx 1E17, parses as a double rather
2732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       //   than int64 because of the fraction
2733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                       //   even though int64 is more precise.
2734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(100000000000000001LL == val.getInt64(status));
2738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(100000000000000000.0 == val.getDouble(status));
2740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "1E17";  // Parses with the internal decimal number having non-zero exponent
2743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2745b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kInt64 == val.getType());
2746b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(100000000000000000LL == val.getInt64());
2747b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(1.0E17 == val.getDouble(status));
2748b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2750b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "9223372036854775807";  // largest int64_t
2751b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2752b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2753b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kInt64 == val.getType());
2754b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9223372036854775807LL == val.getInt64());
2755b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // In the following check, note that a substantial range of integers will
2756b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //    convert to the same double value.  There are also platform variations
2757b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //    in the rounding at compile time of double constants.
2758b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9223372036854775808.0 >= val.getDouble(status));
2759b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9223372036854774700.0 <= val.getDouble(status));
2760b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2761b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2762b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "-9223372036854775808";  // smallest int64_t
2763b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2764b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kInt64 == val.getType());
2766b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // TEST_ASSERT(-9223372036854775808LL == val.getInt64()); // Compiler chokes on constant.
2767b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT((int64_t)0x8000000000000000LL == val.getInt64());
2768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(-9223372036854775808.0 == val.getDouble(status));
2769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2770b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2771b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "9223372036854775808";  // largest int64_t + 1
2772b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2773b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9223372036854775807LL == val.getInt64(status));
2776b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(status == U_INVALID_FORMAT_ERROR);
2777b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
2778b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9223372036854775810.0 == val.getDouble(status));
2779b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2780b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2781b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "-9223372036854775809";  // smallest int64_t - 1
2782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // TEST_ASSERT(-9223372036854775808LL == val.getInt64(status));  // spurious compiler warnings
2786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT((int64_t)0x8000000000000000LL == val.getInt64(status));
2787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(status == U_INVALID_FORMAT_ERROR);
2788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
2789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(-9223372036854775810.0 == val.getDouble(status));
2790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Test values near the limit of where doubles can represent all integers.
2793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // The implementation strategy of getInt64() changes at this boundary.
2794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Strings to be parsed include a decimal fraction to force them to be
2795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //   parsed as doubles rather than ints.  The fraction is discarded
2796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    //   from the parsed double value because it is beyond what can be represented.
2797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
2799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "9007199254740991.1";  // largest 53 bit int
2800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // printf("getInt64() returns %lld\n", val.getInt64(status));
2803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9007199254740991LL == val.getInt64(status));
2805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9007199254740991.0 == val.getDouble(status));
2806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
2809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "9007199254740992.1";  // 54 bits for the int part.
2810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status);
2811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9007199254740992LL == val.getInt64(status));
2814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9007199254740992.0 == val.getDouble(status));
2815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    status = U_ZERO_ERROR;
2818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    numStr = "9007199254740993.1";  // 54 bits for the int part.  Double will round
2819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    nf->parse(numStr, val, status); //    the ones digit, putting it up to ...994
2820b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(Formattable::kDouble == val.getType());
2822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9007199254740993LL == val.getInt64(status));
2823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_ASSERT(9007199254740994.0 == val.getDouble(status));
2824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    TEST_CHECK_STATUS(status);
2825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    delete nf;
2827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
2828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
2830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
2831