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