10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
5c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert*   Copyright (C) 1996-2015, International Business Machines
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   06/24/99    helena      Integrated Alan's NF enhancements and Java2 bug fixes
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unum.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/numfmt.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/rbnf.h"
25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/compactdecimalformat.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/fmtable.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dcfmtsym.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h"
30103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/localpointer.h"
31fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/udisplaycontext.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cpputils.h"
3427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "cstring.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_USE
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UNumberFormat* U_EXPORT2
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_open(  UNumberFormatStyle    style,
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const    UChar*    pattern,
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t            patternLength,
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const    char*     locale,
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UParseError*       parseErr,
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            UErrorCode*        status) {
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(*status)) {
48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    NumberFormat *retVal = NULL;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(style) {
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_DECIMAL:
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_CURRENCY:
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_PERCENT:
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_SCIENTIFIC:
58fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    case UNUM_CURRENCY_ISO:
59fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    case UNUM_CURRENCY_PLURAL:
60fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    case UNUM_CURRENCY_ACCOUNTING:
61f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius    case UNUM_CASH_CURRENCY:
62c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    case UNUM_CURRENCY_STANDARD:
63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = NumberFormat::createInstance(Locale(locale), style, *status);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_PATTERN_DECIMAL: {
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UParseError tErr;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* UnicodeString can handle the case when patternLength = -1. */
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString pat(pattern, patternLength);
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(parseErr==NULL){
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parseErr = &tErr;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        DecimalFormatSymbols *syms = new DecimalFormatSymbols(Locale(locale), *status);
76b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(syms == NULL) {
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_MEMORY_ALLOCATION_ERROR;
78b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return NULL;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (U_FAILURE(*status)) {
8127f654740f2a26ad62a5c155af9199af9e69b889claireho            delete syms;
82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return NULL;
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = new DecimalFormat(pat, syms, *parseErr, *status);
86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(retVal == NULL) {
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete syms;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } break;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_HAVE_RBNF
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_PATTERN_RULEBASED: {
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UParseError tErr;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* UnicodeString can handle the case when patternLength = -1. */
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString pat(pattern, patternLength);
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(parseErr==NULL){
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            parseErr = &tErr;
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = new RuleBasedNumberFormat(pat, Locale(locale), *parseErr, *status);
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } break;
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_SPELLOUT:
105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = new RuleBasedNumberFormat(URBNF_SPELLOUT, Locale(locale), *status);
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_ORDINAL:
109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = new RuleBasedNumberFormat(URBNF_ORDINAL, Locale(locale), *status);
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case UNUM_DURATION:
113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = new RuleBasedNumberFormat(URBNF_DURATION, Locale(locale), *status);
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    case UNUM_NUMBERING_SYSTEM:
117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        retVal = new RuleBasedNumberFormat(URBNF_NUMBERING_SYSTEM, Locale(locale), *status);
118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        break;
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    case UNUM_DECIMAL_COMPACT_SHORT:
122c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        retVal = CompactDecimalFormat::createInstance(Locale(locale), UNUM_SHORT, *status);
123c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        break;
124c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
125c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert    case UNUM_DECIMAL_COMPACT_LONG:
126c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        retVal = CompactDecimalFormat::createInstance(Locale(locale), UNUM_LONG, *status);
127c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert        break;
128c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = U_UNSUPPORTED_ERROR;
131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(retVal == NULL && U_SUCCESS(*status)) {
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return reinterpret_cast<UNumberFormat *>(retVal);
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_close(UNumberFormat* fmt)
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete (NumberFormat*) fmt;
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UNumberFormat* U_EXPORT2
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_clone(const UNumberFormat *fmt,
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       UErrorCode *status)
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Format *res = 0;
15527f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
15627f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
15727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
15827f654740f2a26ad62a5c155af9199af9e69b889claireho        res = df->clone();
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
16027f654740f2a26ad62a5c155af9199af9e69b889claireho        const RuleBasedNumberFormat* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(nf);
16127f654740f2a26ad62a5c155af9199af9e69b889claireho        U_ASSERT(rbnf != NULL);
16227f654740f2a26ad62a5c155af9199af9e69b889claireho        res = rbnf->clone();
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(res == 0) {
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UNumberFormat*) res;
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_format(    const    UNumberFormat*    fmt,
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t           number,
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar*            result,
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t           resultLength,
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UFieldPosition    *pos,
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode*       status)
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return unum_formatInt64(fmt, number, result, resultLength, pos, status);
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_formatInt64(const UNumberFormat* fmt,
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int64_t         number,
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar*          result,
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         resultLength,
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UFieldPosition *pos,
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode*     status)
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString res;
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(result==NULL && resultLength==0)) {
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res.setTo(result, 0, resultLength);
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos != 0)
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fp.setField(pos->field);
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    ((const NumberFormat*)fmt)->format(number, res, fp, *status);
20854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pos != 0) {
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos->beginIndex = fp.getBeginIndex();
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos->endIndex = fp.getEndIndex();
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.extract(result, resultLength, *status);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_formatDouble(    const    UNumberFormat*  fmt,
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            double          number,
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar*          result,
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t         resultLength,
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UFieldPosition  *pos, /* 0 if ignore */
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode*     status)
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(U_FAILURE(*status)) return -1;
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UnicodeString res;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(!(result==NULL && resultLength==0)) {
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NULL destination for pure preflighting: empty dummy string
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // otherwise, alias the destination buffer
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    res.setTo(result, 0, resultLength);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  FieldPosition fp;
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(pos != 0)
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fp.setField(pos->field);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius  ((const NumberFormat*)fmt)->format(number, res, fp, *status);
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if(pos != 0) {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos->beginIndex = fp.getBeginIndex();
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pos->endIndex = fp.getEndIndex();
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return res.extract(result, resultLength, *status);
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2500596faeddefbf198de137d5e893708495ab1584cFredrik RoubertU_CAPI int32_t U_EXPORT2
2510596faeddefbf198de137d5e893708495ab1584cFredrik Roubertunum_formatDoubleForFields(const UNumberFormat* format,
2520596faeddefbf198de137d5e893708495ab1584cFredrik Roubert                           double number,
2530596faeddefbf198de137d5e893708495ab1584cFredrik Roubert                           UChar* result,
2540596faeddefbf198de137d5e893708495ab1584cFredrik Roubert                           int32_t resultLength,
2550596faeddefbf198de137d5e893708495ab1584cFredrik Roubert                           UFieldPositionIterator* fpositer,
2560596faeddefbf198de137d5e893708495ab1584cFredrik Roubert                           UErrorCode* status)
2570596faeddefbf198de137d5e893708495ab1584cFredrik Roubert{
2580596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    if (U_FAILURE(*status))
2590596faeddefbf198de137d5e893708495ab1584cFredrik Roubert        return -1;
2600596faeddefbf198de137d5e893708495ab1584cFredrik Roubert
2610596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    if (result == NULL ? resultLength != 0 : resultLength < 0) {
2620596faeddefbf198de137d5e893708495ab1584cFredrik Roubert        *status = U_ILLEGAL_ARGUMENT_ERROR;
2630596faeddefbf198de137d5e893708495ab1584cFredrik Roubert        return -1;
2640596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    }
2650596faeddefbf198de137d5e893708495ab1584cFredrik Roubert
2660596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    UnicodeString res;
2670596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    if (result != NULL) {
2680596faeddefbf198de137d5e893708495ab1584cFredrik Roubert        // NULL destination for pure preflighting: empty dummy string
2690596faeddefbf198de137d5e893708495ab1584cFredrik Roubert        // otherwise, alias the destination buffer
2700596faeddefbf198de137d5e893708495ab1584cFredrik Roubert        res.setTo(result, 0, resultLength);
2710596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    }
2720596faeddefbf198de137d5e893708495ab1584cFredrik Roubert
2730596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    ((const NumberFormat*)format)->format(number, res, (FieldPositionIterator*)fpositer, *status);
2740596faeddefbf198de137d5e893708495ab1584cFredrik Roubert
2750596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    return res.extract(result, resultLength, *status);
2760596faeddefbf198de137d5e893708495ab1584cFredrik Roubert}
27727f654740f2a26ad62a5c155af9199af9e69b889claireho
27854dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2
27927f654740f2a26ad62a5c155af9199af9e69b889clairehounum_formatDecimal(const    UNumberFormat*  fmt,
28027f654740f2a26ad62a5c155af9199af9e69b889claireho            const char *    number,
28127f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         length,
28227f654740f2a26ad62a5c155af9199af9e69b889claireho            UChar*          result,
28327f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         resultLength,
28427f654740f2a26ad62a5c155af9199af9e69b889claireho            UFieldPosition  *pos, /* 0 if ignore */
28527f654740f2a26ad62a5c155af9199af9e69b889claireho            UErrorCode*     status) {
28627f654740f2a26ad62a5c155af9199af9e69b889claireho
28727f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(*status)) {
28827f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
28927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
29027f654740f2a26ad62a5c155af9199af9e69b889claireho    if ((result == NULL && resultLength != 0) || resultLength < 0) {
29127f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_ILLEGAL_ARGUMENT_ERROR;
29227f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
29327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
29427f654740f2a26ad62a5c155af9199af9e69b889claireho
29527f654740f2a26ad62a5c155af9199af9e69b889claireho    FieldPosition fp;
29627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(pos != 0) {
29727f654740f2a26ad62a5c155af9199af9e69b889claireho        fp.setField(pos->field);
29827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
29927f654740f2a26ad62a5c155af9199af9e69b889claireho
30027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (length < 0) {
301ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        length = static_cast<int32_t>(uprv_strlen(number));
30227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
30327f654740f2a26ad62a5c155af9199af9e69b889claireho    StringPiece numSP(number, length);
30427f654740f2a26ad62a5c155af9199af9e69b889claireho    Formattable numFmtbl(numSP, *status);
30527f654740f2a26ad62a5c155af9199af9e69b889claireho
30627f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString resultStr;
30727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (resultLength > 0) {
30827f654740f2a26ad62a5c155af9199af9e69b889claireho        // Alias the destination buffer.
30927f654740f2a26ad62a5c155af9199af9e69b889claireho        resultStr.setTo(result, 0, resultLength);
31027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
31127f654740f2a26ad62a5c155af9199af9e69b889claireho    ((const NumberFormat*)fmt)->format(numFmtbl, resultStr, fp, *status);
31227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(pos != 0) {
31327f654740f2a26ad62a5c155af9199af9e69b889claireho        pos->beginIndex = fp.getBeginIndex();
31427f654740f2a26ad62a5c155af9199af9e69b889claireho        pos->endIndex = fp.getEndIndex();
31527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
31627f654740f2a26ad62a5c155af9199af9e69b889claireho    return resultStr.extract(result, resultLength, *status);
31727f654740f2a26ad62a5c155af9199af9e69b889claireho}
31827f654740f2a26ad62a5c155af9199af9e69b889claireho
31927f654740f2a26ad62a5c155af9199af9e69b889claireho
32027f654740f2a26ad62a5c155af9199af9e69b889claireho
32127f654740f2a26ad62a5c155af9199af9e69b889claireho
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_formatDoubleCurrency(const UNumberFormat* fmt,
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          double number,
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UChar* currency,
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UChar* result,
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          int32_t resultLength,
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UFieldPosition* pos, /* ignored if 0 */
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UErrorCode* status) {
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status)) return -1;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString res;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(result==NULL && resultLength==0)) {
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res.setTo(result, 0, resultLength);
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos != 0) {
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fp.setField(pos->field);
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    CurrencyAmount *tempCurrAmnt = new CurrencyAmount(number, currency, *status);
344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Check for null pointer.
345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (tempCurrAmnt == NULL) {
346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return -1;
348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    Formattable n(tempCurrAmnt);
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((const NumberFormat*)fmt)->format(n, res, fp, *status);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos != 0) {
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos->beginIndex = fp.getBeginIndex();
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos->endIndex = fp.getEndIndex();
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.extract(result, resultLength, *status);
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruparseRes(Formattable& res,
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         const   UNumberFormat*  fmt,
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         const   UChar*          text,
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t         textLength,
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t         *parsePos /* 0 = start */,
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UErrorCode      *status)
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
371103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UnicodeString src((UBool)(textLength == -1), text, textLength);
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pp;
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(parsePos != 0)
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pp.setIndex(*parsePos);
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ((const NumberFormat*)fmt)->parse(src, res, pp);
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(pp.getErrorIndex() != -1) {
380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = U_PARSE_ERROR;
381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(parsePos != 0) {
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *parsePos = pp.getErrorIndex();
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else if(parsePos != 0) {
385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *parsePos = pp.getIndex();
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parse(    const   UNumberFormat*  fmt,
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const   UChar*          text,
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         textLength,
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         *parsePos /* 0 = start */,
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode      *status)
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable res;
397103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.getLong(*status);
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int64_t U_EXPORT2
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parseInt64(    const   UNumberFormat*  fmt,
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const   UChar*          text,
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         textLength,
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         *parsePos /* 0 = start */,
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode      *status)
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable res;
409103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.getInt64(*status);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parseDouble(    const   UNumberFormat*  fmt,
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const   UChar*          text,
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t         textLength,
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t         *parsePos /* 0 = start */,
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode      *status)
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable res;
421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.getDouble(*status);
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42527f654740f2a26ad62a5c155af9199af9e69b889clairehoU_CAPI int32_t U_EXPORT2
42627f654740f2a26ad62a5c155af9199af9e69b889clairehounum_parseDecimal(const UNumberFormat*  fmt,
42727f654740f2a26ad62a5c155af9199af9e69b889claireho            const UChar*    text,
42827f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         textLength,
42927f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         *parsePos /* 0 = start */,
43027f654740f2a26ad62a5c155af9199af9e69b889claireho            char            *outBuf,
43127f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         outBufLength,
43227f654740f2a26ad62a5c155af9199af9e69b889claireho            UErrorCode      *status)
43327f654740f2a26ad62a5c155af9199af9e69b889claireho{
43427f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(*status)) {
43527f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
43627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
43727f654740f2a26ad62a5c155af9199af9e69b889claireho    if ((outBuf == NULL && outBufLength != 0) || outBufLength < 0) {
43827f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_ILLEGAL_ARGUMENT_ERROR;
43927f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
44027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
44127f654740f2a26ad62a5c155af9199af9e69b889claireho    Formattable res;
442103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
44327f654740f2a26ad62a5c155af9199af9e69b889claireho    StringPiece sp = res.getDecimalNumber(*status);
44427f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(*status)) {
44527f654740f2a26ad62a5c155af9199af9e69b889claireho       return -1;
44627f654740f2a26ad62a5c155af9199af9e69b889claireho    } else if (sp.size() > outBufLength) {
44727f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_BUFFER_OVERFLOW_ERROR;
44827f654740f2a26ad62a5c155af9199af9e69b889claireho    } else if (sp.size() == outBufLength) {
44927f654740f2a26ad62a5c155af9199af9e69b889claireho        uprv_strncpy(outBuf, sp.data(), sp.size());
45027f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_STRING_NOT_TERMINATED_WARNING;
45127f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        U_ASSERT(outBufLength > 0);
45327f654740f2a26ad62a5c155af9199af9e69b889claireho        uprv_strcpy(outBuf, sp.data());
45427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
45527f654740f2a26ad62a5c155af9199af9e69b889claireho    return sp.size();
45627f654740f2a26ad62a5c155af9199af9e69b889claireho}
45727f654740f2a26ad62a5c155af9199af9e69b889claireho
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parseDoubleCurrency(const UNumberFormat* fmt,
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         const UChar* text,
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         int32_t textLength,
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         int32_t* parsePos, /* 0 = start */
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         UChar* currency,
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         UErrorCode* status) {
465103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    double doubleVal = 0.0;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currency[0] = 0;
467103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(*status)) {
468103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return doubleVal;
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
470103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UnicodeString src((UBool)(textLength == -1), text, textLength);
471103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ParsePosition pp;
472103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (parsePos != NULL) {
473103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        pp.setIndex(*parsePos);
474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    *status = U_PARSE_ERROR; // assume failure, reset if succeed
476103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    LocalPointer<CurrencyAmount> currAmt(((const NumberFormat*)fmt)->parseCurrency(src, pp));
477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (pp.getErrorIndex() != -1) {
478103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (parsePos != NULL) {
479103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *parsePos = pp.getErrorIndex();
480103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
481103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
482103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (parsePos != NULL) {
483103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *parsePos = pp.getIndex();
484103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
485103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (pp.getIndex() > 0) {
486103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *status = U_ZERO_ERROR;
487103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            u_strcpy(currency, currAmt->getISOCurrency());
488103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            doubleVal = currAmt->getNumber().getDouble(*status);
489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
490103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
491103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return doubleVal;
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getAvailable(int32_t index)
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return uloc_getAvailable(index);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_countAvailable()
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return uloc_countAvailable();
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getAttribute(const UNumberFormat*          fmt,
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UNumberFormatAttribute  attr)
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
510ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
511ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (attr == UNUM_LENIENT_PARSE) {
512ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        // Supported for all subclasses
513ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->isLenient();
514ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
515ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MAX_INTEGER_DIGITS) {
516ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getMaximumIntegerDigits();
517ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
518ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MIN_INTEGER_DIGITS) {
519ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getMinimumIntegerDigits();
520ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
521ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_INTEGER_DIGITS) {
522ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        // TODO: what should this return?
523ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getMinimumIntegerDigits();
524ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
525ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MAX_FRACTION_DIGITS) {
526ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getMaximumFractionDigits();
527ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
528ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MIN_FRACTION_DIGITS) {
529ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getMinimumFractionDigits();
530ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
531ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_FRACTION_DIGITS) {
532ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        // TODO: what should this return?
533ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getMinimumFractionDigits();
534ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
535ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_ROUNDING_MODE) {
536ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->getRoundingMode();
537ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
53854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
539ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    // The remaining attributes are only supported for DecimalFormat
540ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
541ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (df != NULL) {
542ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        UErrorCode ignoredStatus = U_ZERO_ERROR;
543ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return df->getAttribute(attr, ignoredStatus);
544ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
546ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    return -1;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setAttribute(    UNumberFormat*          fmt,
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatAttribute  attr,
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t                 newValue)
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
554ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
555ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (attr == UNUM_LENIENT_PARSE) {
556ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        // Supported for all subclasses
557ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        // keep this here as the class may not be a DecimalFormat
558ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setLenient(newValue != 0);
559ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
560ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MAX_INTEGER_DIGITS) {
561ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setMaximumIntegerDigits(newValue);
562ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
563ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MIN_INTEGER_DIGITS) {
564ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setMinimumIntegerDigits(newValue);
565ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
566ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_INTEGER_DIGITS) {
567ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        nf->setMinimumIntegerDigits(newValue);
568ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setMaximumIntegerDigits(newValue);
569ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
570ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MAX_FRACTION_DIGITS) {
571ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setMaximumFractionDigits(newValue);
572ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
573ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_MIN_FRACTION_DIGITS) {
574ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setMinimumFractionDigits(newValue);
575ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
576ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_FRACTION_DIGITS) {
577ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        nf->setMinimumFractionDigits(newValue);
578ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setMaximumFractionDigits(newValue);
579ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
580ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    else if (attr == UNUM_ROUNDING_MODE) {
581ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return nf->setRoundingMode((NumberFormat::ERoundingMode)newValue);
582ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
583ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
584ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    // The remaining attributes are only supported for DecimalFormat
585ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
586ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (df != NULL) {
587ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        UErrorCode ignoredStatus = U_ZERO_ERROR;
588ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        df->setAttribute(attr, newValue, ignoredStatus);
589ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getDoubleAttribute(const UNumberFormat*          fmt,
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UNumberFormatAttribute  attr)
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
59627f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
59727f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
59827f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL &&  attr == UNUM_ROUNDING_INCREMENT) {
59927f654740f2a26ad62a5c155af9199af9e69b889claireho        return df->getRoundingIncrement();
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1.0;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setDoubleAttribute(    UNumberFormat*          fmt,
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatAttribute  attr,
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            double                 newValue)
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
61027f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
61127f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
61227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL && attr == UNUM_ROUNDING_INCREMENT) {
61327f654740f2a26ad62a5c155af9199af9e69b889claireho        df->setRoundingIncrement(newValue);
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getTextAttribute(const UNumberFormat*  fmt,
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatTextAttribute      tag,
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar*                          result,
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t                         resultLength,
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode*                     status)
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString res;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(result==NULL && resultLength==0)) {
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res.setTo(result, 0, resultLength);
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63427f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
63527f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
63627f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch(tag) {
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_POSITIVE_PREFIX:
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getPositivePrefix(res);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_POSITIVE_SUFFIX:
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getPositiveSuffix(res);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_NEGATIVE_PREFIX:
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getNegativePrefix(res);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_NEGATIVE_SUFFIX:
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getNegativeSuffix(res);
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_PADDING_CHARACTER:
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            res = df->getPadCharacterString();
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_CURRENCY_CODE:
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            res = UnicodeString(df->getCurrency());
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_UNSUPPORTED_ERROR;
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return -1;
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
66727f654740f2a26ad62a5c155af9199af9e69b889claireho        const RuleBasedNumberFormat* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(nf);
66827f654740f2a26ad62a5c155af9199af9e69b889claireho        U_ASSERT(rbnf != NULL);
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tag == UNUM_DEFAULT_RULESET) {
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            res = rbnf->getDefaultRuleSetName();
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (tag == UNUM_PUBLIC_RULESETS) {
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t count = rbnf->getNumberOfRuleSetNames();
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int i = 0; i < count; ++i) {
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                res += rbnf->getRuleSetName(i);
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                res += (UChar)0x003b; // semicolon
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_UNSUPPORTED_ERROR;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return -1;
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.extract(result, resultLength, *status);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setTextAttribute(    UNumberFormat*                    fmt,
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatTextAttribute      tag,
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const    UChar*                            newValue,
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t                            newValueLength,
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode                        *status)
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
69527f654740f2a26ad62a5c155af9199af9e69b889claireho
696103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UnicodeString val(newValue, newValueLength);
69727f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
69827f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
69927f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      switch(tag) {
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_POSITIVE_PREFIX:
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setPositivePrefix(val);
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_POSITIVE_SUFFIX:
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setPositiveSuffix(val);
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_NEGATIVE_PREFIX:
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setNegativePrefix(val);
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_NEGATIVE_SUFFIX:
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setNegativeSuffix(val);
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_PADDING_CHARACTER:
718103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        df->setPadCharacter(val);
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_CURRENCY_CODE:
722103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        df->setCurrency(val.getTerminatedBuffer(), *status);
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      default:
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = U_UNSUPPORTED_ERROR;
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
73027f654740f2a26ad62a5c155af9199af9e69b889claireho      RuleBasedNumberFormat* rbnf = dynamic_cast<RuleBasedNumberFormat*>(nf);
73127f654740f2a26ad62a5c155af9199af9e69b889claireho      U_ASSERT(rbnf != NULL);
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (tag == UNUM_DEFAULT_RULESET) {
733103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        rbnf->setDefaultRuleSet(val, *status);
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
73527f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_UNSUPPORTED_ERROR;
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_toPattern(    const    UNumberFormat*          fmt,
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool                  isPatternLocalized,
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar*                  result,
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t                 resultLength,
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode*             status)
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(result==NULL && resultLength==0)) {
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pat.setTo(result, 0, resultLength);
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75727f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
75827f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
75927f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(isPatternLocalized)
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->toLocalizedPattern(pat);
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      else
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->toPattern(pat);
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
76527f654740f2a26ad62a5c155af9199af9e69b889claireho      const RuleBasedNumberFormat* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(nf);
76627f654740f2a26ad62a5c155af9199af9e69b889claireho      U_ASSERT(rbnf != NULL);
76727f654740f2a26ad62a5c155af9199af9e69b889claireho      pat = rbnf->getRules();
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return pat.extract(result, resultLength, *status);
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getSymbol(const UNumberFormat *fmt,
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UNumberFormatSymbol symbol,
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UChar *buffer,
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               int32_t size,
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode *status)
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)) {
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(fmt==NULL || symbol< 0 || symbol>=UNUM_FORMAT_SYMBOL_COUNT) {
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status=U_ILLEGAL_ARGUMENT_ERROR;
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
78627f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat *nf = reinterpret_cast<const NumberFormat *>(fmt);
78727f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat *dcf = dynamic_cast<const DecimalFormat *>(nf);
78827f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dcf == NULL) {
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_UNSUPPORTED_ERROR;
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return 0;
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79327f654740f2a26ad62a5c155af9199af9e69b889claireho    return dcf->
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      getDecimalFormatSymbols()->
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol).
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          extract(buffer, size, *status);
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setSymbol(UNumberFormat *fmt,
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UNumberFormatSymbol symbol,
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               const UChar *value,
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               int32_t length,
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode *status)
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)) {
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(fmt==NULL || symbol< 0 || symbol>=UNUM_FORMAT_SYMBOL_COUNT || value==NULL || length<-1) {
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status=U_ILLEGAL_ARGUMENT_ERROR;
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
81327f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat *nf = reinterpret_cast<NumberFormat *>(fmt);
81427f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *dcf = dynamic_cast<DecimalFormat *>(nf);
81527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dcf == NULL) {
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_UNSUPPORTED_ERROR;
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82027f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormatSymbols symbols(*dcf->getDecimalFormatSymbols());
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    symbols.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol,
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString(value, length));  /* UnicodeString can handle the case when length = -1. */
82327f654740f2a26ad62a5c155af9199af9e69b889claireho    dcf->setDecimalFormatSymbols(symbols);
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
82727f654740f2a26ad62a5c155af9199af9e69b889clairehounum_applyPattern(  UNumberFormat  *fmt,
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UBool          localized,
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const UChar    *pattern,
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    int32_t        patternLength,
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UParseError    *parseError,
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode*    status)
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode tStatus = U_ZERO_ERROR;
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError tParseError;
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(parseError == NULL){
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        parseError = &tParseError;
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==NULL){
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = &tStatus;
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = (patternLength == -1 ? u_strlen(pattern) : patternLength);
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString pat((UChar*)pattern, len, len);
84727f654740f2a26ad62a5c155af9199af9e69b889claireho
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Verify if the object passed is a DecimalFormat object
84927f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
85027f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
85127f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(localized) {
85327f654740f2a26ad62a5c155af9199af9e69b889claireho        df->applyLocalizedPattern(pat,*parseError, *status);
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
85527f654740f2a26ad62a5c155af9199af9e69b889claireho        df->applyPattern(pat,*parseError, *status);
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_UNSUPPORTED_ERROR;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getLocaleByType(const UNumberFormat *fmt,
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     ULocDataLocaleType type,
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     UErrorCode* status)
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt == NULL) {
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(*status)) {
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_ILLEGAL_ARGUMENT_ERROR;
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((const Format*)fmt)->getLocaleID(type, *status);
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
877fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_CAPI void U_EXPORT2
878fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusunum_setContext(UNumberFormat* fmt, UDisplayContext value, UErrorCode* status)
879fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
880fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(*status)) {
881fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
882fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
883fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ((NumberFormat*)fmt)->setContext(value, *status);
884fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return;
885fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
886fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
887fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_CAPI UDisplayContext U_EXPORT2
888fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusunum_getContext(const UNumberFormat *fmt, UDisplayContextType type, UErrorCode* status)
889fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
890fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(*status)) {
891fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (UDisplayContext)0;
892fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
893fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return ((const NumberFormat*)fmt)->getContext(type, *status);
894fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
895fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
89659d709d503bab6e2b61931737e662dd293b40578ccorneliusU_INTERNAL UFormattable * U_EXPORT2
89759d709d503bab6e2b61931737e662dd293b40578ccorneliusunum_parseToUFormattable(const UNumberFormat* fmt,
89859d709d503bab6e2b61931737e662dd293b40578ccornelius                         UFormattable *result,
89959d709d503bab6e2b61931737e662dd293b40578ccornelius                         const UChar* text,
90059d709d503bab6e2b61931737e662dd293b40578ccornelius                         int32_t textLength,
90159d709d503bab6e2b61931737e662dd293b40578ccornelius                         int32_t* parsePos, /* 0 = start */
90259d709d503bab6e2b61931737e662dd293b40578ccornelius                         UErrorCode* status) {
90359d709d503bab6e2b61931737e662dd293b40578ccornelius  UFormattable *newFormattable = NULL;
90459d709d503bab6e2b61931737e662dd293b40578ccornelius  if (U_FAILURE(*status)) return result;
90559d709d503bab6e2b61931737e662dd293b40578ccornelius  if (fmt == NULL || (text==NULL && textLength!=0)) {
90659d709d503bab6e2b61931737e662dd293b40578ccornelius    *status = U_ILLEGAL_ARGUMENT_ERROR;
90759d709d503bab6e2b61931737e662dd293b40578ccornelius    return result;
90859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
90959d709d503bab6e2b61931737e662dd293b40578ccornelius  if (result == NULL) { // allocate if not allocated.
91059d709d503bab6e2b61931737e662dd293b40578ccornelius    newFormattable = result = ufmt_open(status);
91159d709d503bab6e2b61931737e662dd293b40578ccornelius  }
91259d709d503bab6e2b61931737e662dd293b40578ccornelius  parseRes(*(Formattable::fromUFormattable(result)), fmt, text, textLength, parsePos, status);
91359d709d503bab6e2b61931737e662dd293b40578ccornelius  if (U_FAILURE(*status) && newFormattable != NULL) {
91459d709d503bab6e2b61931737e662dd293b40578ccornelius    ufmt_close(newFormattable);
91559d709d503bab6e2b61931737e662dd293b40578ccornelius    result = NULL; // deallocate if there was a parse error
91659d709d503bab6e2b61931737e662dd293b40578ccornelius  }
91759d709d503bab6e2b61931737e662dd293b40578ccornelius  return result;
91859d709d503bab6e2b61931737e662dd293b40578ccornelius}
91959d709d503bab6e2b61931737e662dd293b40578ccornelius
92059d709d503bab6e2b61931737e662dd293b40578ccorneliusU_INTERNAL int32_t U_EXPORT2
92159d709d503bab6e2b61931737e662dd293b40578ccorneliusunum_formatUFormattable(const UNumberFormat* fmt,
92259d709d503bab6e2b61931737e662dd293b40578ccornelius                        const UFormattable *number,
92359d709d503bab6e2b61931737e662dd293b40578ccornelius                        UChar *result,
92459d709d503bab6e2b61931737e662dd293b40578ccornelius                        int32_t resultLength,
92559d709d503bab6e2b61931737e662dd293b40578ccornelius                        UFieldPosition *pos, /* ignored if 0 */
92659d709d503bab6e2b61931737e662dd293b40578ccornelius                        UErrorCode *status) {
92759d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(*status)) {
92859d709d503bab6e2b61931737e662dd293b40578ccornelius      return 0;
92959d709d503bab6e2b61931737e662dd293b40578ccornelius    }
93059d709d503bab6e2b61931737e662dd293b40578ccornelius    if (fmt == NULL || number==NULL ||
93159d709d503bab6e2b61931737e662dd293b40578ccornelius        (result==NULL ? resultLength!=0 : resultLength<0)) {
93259d709d503bab6e2b61931737e662dd293b40578ccornelius      *status = U_ILLEGAL_ARGUMENT_ERROR;
93359d709d503bab6e2b61931737e662dd293b40578ccornelius      return 0;
93459d709d503bab6e2b61931737e662dd293b40578ccornelius    }
93559d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString res(result, 0, resultLength);
93659d709d503bab6e2b61931737e662dd293b40578ccornelius
93759d709d503bab6e2b61931737e662dd293b40578ccornelius    FieldPosition fp;
93859d709d503bab6e2b61931737e662dd293b40578ccornelius
93959d709d503bab6e2b61931737e662dd293b40578ccornelius    if(pos != 0)
94059d709d503bab6e2b61931737e662dd293b40578ccornelius        fp.setField(pos->field);
94159d709d503bab6e2b61931737e662dd293b40578ccornelius
94259d709d503bab6e2b61931737e662dd293b40578ccornelius    ((const NumberFormat*)fmt)->format(*(Formattable::fromUFormattable(number)), res, fp, *status);
94359d709d503bab6e2b61931737e662dd293b40578ccornelius
94459d709d503bab6e2b61931737e662dd293b40578ccornelius    if(pos != 0) {
94559d709d503bab6e2b61931737e662dd293b40578ccornelius        pos->beginIndex = fp.getBeginIndex();
94659d709d503bab6e2b61931737e662dd293b40578ccornelius        pos->endIndex = fp.getEndIndex();
94759d709d503bab6e2b61931737e662dd293b40578ccornelius    }
94859d709d503bab6e2b61931737e662dd293b40578ccornelius
94959d709d503bab6e2b61931737e662dd293b40578ccornelius    return res.extract(result, resultLength, *status);
95059d709d503bab6e2b61931737e662dd293b40578ccornelius}
95159d709d503bab6e2b61931737e662dd293b40578ccornelius
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
953