unum.cpp revision 64339d36f8bd4db5025fe2988eda22b491a9219c
164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 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
25027f654740f2a26ad62a5c155af9199af9e69b889claireho
25154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusU_CAPI int32_t U_EXPORT2
25227f654740f2a26ad62a5c155af9199af9e69b889clairehounum_formatDecimal(const    UNumberFormat*  fmt,
25327f654740f2a26ad62a5c155af9199af9e69b889claireho            const char *    number,
25427f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         length,
25527f654740f2a26ad62a5c155af9199af9e69b889claireho            UChar*          result,
25627f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         resultLength,
25727f654740f2a26ad62a5c155af9199af9e69b889claireho            UFieldPosition  *pos, /* 0 if ignore */
25827f654740f2a26ad62a5c155af9199af9e69b889claireho            UErrorCode*     status) {
25927f654740f2a26ad62a5c155af9199af9e69b889claireho
26027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(*status)) {
26127f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
26227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
26327f654740f2a26ad62a5c155af9199af9e69b889claireho    if ((result == NULL && resultLength != 0) || resultLength < 0) {
26427f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_ILLEGAL_ARGUMENT_ERROR;
26527f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
26627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
26727f654740f2a26ad62a5c155af9199af9e69b889claireho
26827f654740f2a26ad62a5c155af9199af9e69b889claireho    FieldPosition fp;
26927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(pos != 0) {
27027f654740f2a26ad62a5c155af9199af9e69b889claireho        fp.setField(pos->field);
27127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
27227f654740f2a26ad62a5c155af9199af9e69b889claireho
27327f654740f2a26ad62a5c155af9199af9e69b889claireho    if (length < 0) {
27427f654740f2a26ad62a5c155af9199af9e69b889claireho        length = uprv_strlen(number);
27527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
27627f654740f2a26ad62a5c155af9199af9e69b889claireho    StringPiece numSP(number, length);
27727f654740f2a26ad62a5c155af9199af9e69b889claireho    Formattable numFmtbl(numSP, *status);
27827f654740f2a26ad62a5c155af9199af9e69b889claireho
27927f654740f2a26ad62a5c155af9199af9e69b889claireho    UnicodeString resultStr;
28027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (resultLength > 0) {
28127f654740f2a26ad62a5c155af9199af9e69b889claireho        // Alias the destination buffer.
28227f654740f2a26ad62a5c155af9199af9e69b889claireho        resultStr.setTo(result, 0, resultLength);
28327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
28427f654740f2a26ad62a5c155af9199af9e69b889claireho    ((const NumberFormat*)fmt)->format(numFmtbl, resultStr, fp, *status);
28527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(pos != 0) {
28627f654740f2a26ad62a5c155af9199af9e69b889claireho        pos->beginIndex = fp.getBeginIndex();
28727f654740f2a26ad62a5c155af9199af9e69b889claireho        pos->endIndex = fp.getEndIndex();
28827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
28927f654740f2a26ad62a5c155af9199af9e69b889claireho    return resultStr.extract(result, resultLength, *status);
29027f654740f2a26ad62a5c155af9199af9e69b889claireho}
29127f654740f2a26ad62a5c155af9199af9e69b889claireho
29227f654740f2a26ad62a5c155af9199af9e69b889claireho
29327f654740f2a26ad62a5c155af9199af9e69b889claireho
29427f654740f2a26ad62a5c155af9199af9e69b889claireho
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_formatDoubleCurrency(const UNumberFormat* fmt,
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          double number,
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UChar* currency,
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UChar* result,
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          int32_t resultLength,
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UFieldPosition* pos, /* ignored if 0 */
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UErrorCode* status) {
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(*status)) return -1;
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString res;
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(result==NULL && resultLength==0)) {
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res.setTo(result, 0, resultLength);
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition fp;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos != 0) {
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fp.setField(pos->field);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    CurrencyAmount *tempCurrAmnt = new CurrencyAmount(number, currency, *status);
317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Check for null pointer.
318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (tempCurrAmnt == NULL) {
319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *status = U_MEMORY_ALLOCATION_ERROR;
320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return -1;
321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    Formattable n(tempCurrAmnt);
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ((const NumberFormat*)fmt)->format(n, res, fp, *status);
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (pos != 0) {
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos->beginIndex = fp.getBeginIndex();
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pos->endIndex = fp.getEndIndex();
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.extract(result, resultLength, *status);
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruparseRes(Formattable& res,
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         const   UNumberFormat*  fmt,
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         const   UChar*          text,
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t         textLength,
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         int32_t         *parsePos /* 0 = start */,
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         UErrorCode      *status)
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
344103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UnicodeString src((UBool)(textLength == -1), text, textLength);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParsePosition pp;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(parsePos != 0)
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pp.setIndex(*parsePos);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ((const NumberFormat*)fmt)->parse(src, res, pp);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if(pp.getErrorIndex() != -1) {
353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *status = U_PARSE_ERROR;
354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        if(parsePos != 0) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *parsePos = pp.getErrorIndex();
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    } else if(parsePos != 0) {
358b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        *parsePos = pp.getIndex();
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parse(    const   UNumberFormat*  fmt,
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const   UChar*          text,
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         textLength,
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         *parsePos /* 0 = start */,
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode      *status)
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable res;
370103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.getLong(*status);
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int64_t U_EXPORT2
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parseInt64(    const   UNumberFormat*  fmt,
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const   UChar*          text,
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         textLength,
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t         *parsePos /* 0 = start */,
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode      *status)
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable res;
382103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.getInt64(*status);
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parseDouble(    const   UNumberFormat*  fmt,
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const   UChar*          text,
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t         textLength,
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t         *parsePos /* 0 = start */,
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode      *status)
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable res;
394103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.getDouble(*status);
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39827f654740f2a26ad62a5c155af9199af9e69b889clairehoU_CAPI int32_t U_EXPORT2
39927f654740f2a26ad62a5c155af9199af9e69b889clairehounum_parseDecimal(const UNumberFormat*  fmt,
40027f654740f2a26ad62a5c155af9199af9e69b889claireho            const UChar*    text,
40127f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         textLength,
40227f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         *parsePos /* 0 = start */,
40327f654740f2a26ad62a5c155af9199af9e69b889claireho            char            *outBuf,
40427f654740f2a26ad62a5c155af9199af9e69b889claireho            int32_t         outBufLength,
40527f654740f2a26ad62a5c155af9199af9e69b889claireho            UErrorCode      *status)
40627f654740f2a26ad62a5c155af9199af9e69b889claireho{
40727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(*status)) {
40827f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
40927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
41027f654740f2a26ad62a5c155af9199af9e69b889claireho    if ((outBuf == NULL && outBufLength != 0) || outBufLength < 0) {
41127f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_ILLEGAL_ARGUMENT_ERROR;
41227f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
41327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
41427f654740f2a26ad62a5c155af9199af9e69b889claireho    Formattable res;
415103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    parseRes(res, fmt, text, textLength, parsePos, status);
41627f654740f2a26ad62a5c155af9199af9e69b889claireho    StringPiece sp = res.getDecimalNumber(*status);
41727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (U_FAILURE(*status)) {
41827f654740f2a26ad62a5c155af9199af9e69b889claireho       return -1;
41927f654740f2a26ad62a5c155af9199af9e69b889claireho    } else if (sp.size() > outBufLength) {
42027f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_BUFFER_OVERFLOW_ERROR;
42127f654740f2a26ad62a5c155af9199af9e69b889claireho    } else if (sp.size() == outBufLength) {
42227f654740f2a26ad62a5c155af9199af9e69b889claireho        uprv_strncpy(outBuf, sp.data(), sp.size());
42327f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_STRING_NOT_TERMINATED_WARNING;
42427f654740f2a26ad62a5c155af9199af9e69b889claireho    } else {
425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        U_ASSERT(outBufLength > 0);
42627f654740f2a26ad62a5c155af9199af9e69b889claireho        uprv_strcpy(outBuf, sp.data());
42727f654740f2a26ad62a5c155af9199af9e69b889claireho    }
42827f654740f2a26ad62a5c155af9199af9e69b889claireho    return sp.size();
42927f654740f2a26ad62a5c155af9199af9e69b889claireho}
43027f654740f2a26ad62a5c155af9199af9e69b889claireho
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_parseDoubleCurrency(const UNumberFormat* fmt,
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         const UChar* text,
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         int32_t textLength,
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         int32_t* parsePos, /* 0 = start */
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         UChar* currency,
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         UErrorCode* status) {
438103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    double doubleVal = 0.0;
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    currency[0] = 0;
440103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (U_FAILURE(*status)) {
441103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return doubleVal;
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
443103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UnicodeString src((UBool)(textLength == -1), text, textLength);
444103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    ParsePosition pp;
445103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (parsePos != NULL) {
446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        pp.setIndex(*parsePos);
447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
448103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    *status = U_PARSE_ERROR; // assume failure, reset if succeed
449103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    LocalPointer<CurrencyAmount> currAmt(((const NumberFormat*)fmt)->parseCurrency(src, pp));
450103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if (pp.getErrorIndex() != -1) {
451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (parsePos != NULL) {
452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *parsePos = pp.getErrorIndex();
453103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } else {
455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (parsePos != NULL) {
456103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *parsePos = pp.getIndex();
457103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
458103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        if (pp.getIndex() > 0) {
459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            *status = U_ZERO_ERROR;
460103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            u_strcpy(currency, currAmt->getISOCurrency());
461103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius            doubleVal = currAmt->getNumber().getDouble(*status);
462103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        }
463103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
464103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    return doubleVal;
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getAvailable(int32_t index)
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return uloc_getAvailable(index);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_countAvailable()
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return uloc_countAvailable();
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getAttribute(const UNumberFormat*          fmt,
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UNumberFormatAttribute  attr)
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
48327f654740f2a26ad62a5c155af9199af9e69b889claireho  const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
484b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  if ( attr == UNUM_LENIENT_PARSE ) {
485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Supported for all subclasses
486b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return nf->isLenient();
487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }
48854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
489b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  // The remaining attributea are only supported for DecimalFormat
49027f654740f2a26ad62a5c155af9199af9e69b889claireho  const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
49127f654740f2a26ad62a5c155af9199af9e69b889claireho  if (df != NULL) {
49254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode ignoredStatus = U_ZERO_ERROR;
49354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    return df->getAttribute( attr, ignoredStatus );
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  return -1;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setAttribute(    UNumberFormat*          fmt,
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatAttribute  attr,
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t                 newValue)
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
50427f654740f2a26ad62a5c155af9199af9e69b889claireho  NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
505b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  if ( attr == UNUM_LENIENT_PARSE ) {
506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Supported for all subclasses
50754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    // keep this here as the class may not be a DecimalFormat
508b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return nf->setLenient(newValue != 0);
509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  }
510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  // The remaining attributea are only supported for DecimalFormat
51127f654740f2a26ad62a5c155af9199af9e69b889claireho  DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
51227f654740f2a26ad62a5c155af9199af9e69b889claireho  if (df != NULL) {
51354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    UErrorCode ignoredStatus = U_ZERO_ERROR;
51454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    df->setAttribute(attr, newValue, ignoredStatus);
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI double U_EXPORT2
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getDoubleAttribute(const UNumberFormat*          fmt,
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UNumberFormatAttribute  attr)
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
52227f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
52327f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
52427f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL &&  attr == UNUM_ROUNDING_INCREMENT) {
52527f654740f2a26ad62a5c155af9199af9e69b889claireho        return df->getRoundingIncrement();
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1.0;
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setDoubleAttribute(    UNumberFormat*          fmt,
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatAttribute  attr,
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            double                 newValue)
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
53627f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
53727f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
53827f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL && attr == UNUM_ROUNDING_INCREMENT) {
53927f654740f2a26ad62a5c155af9199af9e69b889claireho        df->setRoundingIncrement(newValue);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getTextAttribute(const UNumberFormat*  fmt,
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatTextAttribute      tag,
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UChar*                          result,
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t                         resultLength,
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode*                     status)
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString res;
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(result==NULL && resultLength==0)) {
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        res.setTo(result, 0, resultLength);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
56027f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
56127f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
56227f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch(tag) {
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_POSITIVE_PREFIX:
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getPositivePrefix(res);
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_POSITIVE_SUFFIX:
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getPositiveSuffix(res);
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_NEGATIVE_PREFIX:
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getNegativePrefix(res);
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_NEGATIVE_SUFFIX:
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            df->getNegativeSuffix(res);
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_PADDING_CHARACTER:
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            res = df->getPadCharacterString();
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case UNUM_CURRENCY_CODE:
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            res = UnicodeString(df->getCurrency());
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_UNSUPPORTED_ERROR;
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return -1;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
59327f654740f2a26ad62a5c155af9199af9e69b889claireho        const RuleBasedNumberFormat* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(nf);
59427f654740f2a26ad62a5c155af9199af9e69b889claireho        U_ASSERT(rbnf != NULL);
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tag == UNUM_DEFAULT_RULESET) {
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            res = rbnf->getDefaultRuleSetName();
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (tag == UNUM_PUBLIC_RULESETS) {
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t count = rbnf->getNumberOfRuleSetNames();
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (int i = 0; i < count; ++i) {
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                res += rbnf->getRuleSetName(i);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                res += (UChar)0x003b; // semicolon
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_UNSUPPORTED_ERROR;
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return -1;
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return res.extract(result, resultLength, *status);
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setTextAttribute(    UNumberFormat*                    fmt,
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UNumberFormatTextAttribute      tag,
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const    UChar*                            newValue,
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t                            newValueLength,
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode                        *status)
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
62127f654740f2a26ad62a5c155af9199af9e69b889claireho
622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UnicodeString val(newValue, newValueLength);
62327f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
62427f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
62527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      switch(tag) {
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_POSITIVE_PREFIX:
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setPositivePrefix(val);
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_POSITIVE_SUFFIX:
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setPositiveSuffix(val);
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_NEGATIVE_PREFIX:
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setNegativePrefix(val);
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_NEGATIVE_SUFFIX:
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->setNegativeSuffix(val);
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_PADDING_CHARACTER:
644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        df->setPadCharacter(val);
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      case UNUM_CURRENCY_CODE:
648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        df->setCurrency(val.getTerminatedBuffer(), *status);
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      default:
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status = U_UNSUPPORTED_ERROR;
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
65627f654740f2a26ad62a5c155af9199af9e69b889claireho      RuleBasedNumberFormat* rbnf = dynamic_cast<RuleBasedNumberFormat*>(nf);
65727f654740f2a26ad62a5c155af9199af9e69b889claireho      U_ASSERT(rbnf != NULL);
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (tag == UNUM_DEFAULT_RULESET) {
659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        rbnf->setDefaultRuleSet(val, *status);
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
66127f654740f2a26ad62a5c155af9199af9e69b889claireho        *status = U_UNSUPPORTED_ERROR;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_toPattern(    const    UNumberFormat*          fmt,
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool                  isPatternLocalized,
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar*                  result,
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t                 resultLength,
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode*             status)
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*status))
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return -1;
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString pat;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!(result==NULL && resultLength==0)) {
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // NULL destination for pure preflighting: empty dummy string
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // otherwise, alias the destination buffer
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pat.setTo(result, 0, resultLength);
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68327f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat* nf = reinterpret_cast<const NumberFormat*>(fmt);
68427f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat* df = dynamic_cast<const DecimalFormat*>(nf);
68527f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(isPatternLocalized)
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->toLocalizedPattern(pat);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      else
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        df->toPattern(pat);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
69127f654740f2a26ad62a5c155af9199af9e69b889claireho      const RuleBasedNumberFormat* rbnf = dynamic_cast<const RuleBasedNumberFormat*>(nf);
69227f654740f2a26ad62a5c155af9199af9e69b889claireho      U_ASSERT(rbnf != NULL);
69327f654740f2a26ad62a5c155af9199af9e69b889claireho      pat = rbnf->getRules();
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return pat.extract(result, resultLength, *status);
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getSymbol(const UNumberFormat *fmt,
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UNumberFormatSymbol symbol,
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UChar *buffer,
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               int32_t size,
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode *status)
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)) {
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(fmt==NULL || symbol< 0 || symbol>=UNUM_FORMAT_SYMBOL_COUNT) {
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status=U_ILLEGAL_ARGUMENT_ERROR;
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
71227f654740f2a26ad62a5c155af9199af9e69b889claireho    const NumberFormat *nf = reinterpret_cast<const NumberFormat *>(fmt);
71327f654740f2a26ad62a5c155af9199af9e69b889claireho    const DecimalFormat *dcf = dynamic_cast<const DecimalFormat *>(nf);
71427f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dcf == NULL) {
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_UNSUPPORTED_ERROR;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return 0;
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71927f654740f2a26ad62a5c155af9199af9e69b889claireho    return dcf->
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      getDecimalFormatSymbols()->
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol).
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          extract(buffer, size, *status);
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_setSymbol(UNumberFormat *fmt,
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UNumberFormatSymbol symbol,
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               const UChar *value,
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               int32_t length,
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode *status)
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==NULL || U_FAILURE(*status)) {
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(fmt==NULL || symbol< 0 || symbol>=UNUM_FORMAT_SYMBOL_COUNT || value==NULL || length<-1) {
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *status=U_ILLEGAL_ARGUMENT_ERROR;
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
73927f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat *nf = reinterpret_cast<NumberFormat *>(fmt);
74027f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat *dcf = dynamic_cast<DecimalFormat *>(nf);
74127f654740f2a26ad62a5c155af9199af9e69b889claireho    if (dcf == NULL) {
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_UNSUPPORTED_ERROR;
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74627f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormatSymbols symbols(*dcf->getDecimalFormatSymbols());
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    symbols.setSymbol((DecimalFormatSymbols::ENumberFormatSymbol)symbol,
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString(value, length));  /* UnicodeString can handle the case when length = -1. */
74927f654740f2a26ad62a5c155af9199af9e69b889claireho    dcf->setDecimalFormatSymbols(symbols);
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
75327f654740f2a26ad62a5c155af9199af9e69b889clairehounum_applyPattern(  UNumberFormat  *fmt,
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UBool          localized,
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const UChar    *pattern,
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    int32_t        patternLength,
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UParseError    *parseError,
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UErrorCode*    status)
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode tStatus = U_ZERO_ERROR;
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UParseError tParseError;
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(parseError == NULL){
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        parseError = &tParseError;
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(status==NULL){
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = &tStatus;
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len = (patternLength == -1 ? u_strlen(pattern) : patternLength);
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString pat((UChar*)pattern, len, len);
77327f654740f2a26ad62a5c155af9199af9e69b889claireho
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Verify if the object passed is a DecimalFormat object
77527f654740f2a26ad62a5c155af9199af9e69b889claireho    NumberFormat* nf = reinterpret_cast<NumberFormat*>(fmt);
77627f654740f2a26ad62a5c155af9199af9e69b889claireho    DecimalFormat* df = dynamic_cast<DecimalFormat*>(nf);
77727f654740f2a26ad62a5c155af9199af9e69b889claireho    if (df != NULL) {
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if(localized) {
77927f654740f2a26ad62a5c155af9199af9e69b889claireho        df->applyLocalizedPattern(pat,*parseError, *status);
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
78127f654740f2a26ad62a5c155af9199af9e69b889claireho        df->applyPattern(pat,*parseError, *status);
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      *status = U_UNSUPPORTED_ERROR;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunum_getLocaleByType(const UNumberFormat *fmt,
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     ULocDataLocaleType type,
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     UErrorCode* status)
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fmt == NULL) {
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(*status)) {
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *status = U_ILLEGAL_ARGUMENT_ERROR;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((const Format*)fmt)->getLocaleID(type, *status);
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
803fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_CAPI void U_EXPORT2
804fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusunum_setContext(UNumberFormat* fmt, UDisplayContext value, UErrorCode* status)
805fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
806fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(*status)) {
807fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
808fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
809fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    ((NumberFormat*)fmt)->setContext(value, *status);
810fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return;
811fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
812fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
813fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_CAPI UDisplayContext U_EXPORT2
814fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusunum_getContext(const UNumberFormat *fmt, UDisplayContextType type, UErrorCode* status)
815fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius{
816fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (U_FAILURE(*status)) {
817fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return (UDisplayContext)0;
818fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
819fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return ((const NumberFormat*)fmt)->getContext(type, *status);
820fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
821fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
82259d709d503bab6e2b61931737e662dd293b40578ccorneliusU_INTERNAL UFormattable * U_EXPORT2
82359d709d503bab6e2b61931737e662dd293b40578ccorneliusunum_parseToUFormattable(const UNumberFormat* fmt,
82459d709d503bab6e2b61931737e662dd293b40578ccornelius                         UFormattable *result,
82559d709d503bab6e2b61931737e662dd293b40578ccornelius                         const UChar* text,
82659d709d503bab6e2b61931737e662dd293b40578ccornelius                         int32_t textLength,
82759d709d503bab6e2b61931737e662dd293b40578ccornelius                         int32_t* parsePos, /* 0 = start */
82859d709d503bab6e2b61931737e662dd293b40578ccornelius                         UErrorCode* status) {
82959d709d503bab6e2b61931737e662dd293b40578ccornelius  UFormattable *newFormattable = NULL;
83059d709d503bab6e2b61931737e662dd293b40578ccornelius  if (U_FAILURE(*status)) return result;
83159d709d503bab6e2b61931737e662dd293b40578ccornelius  if (fmt == NULL || (text==NULL && textLength!=0)) {
83259d709d503bab6e2b61931737e662dd293b40578ccornelius    *status = U_ILLEGAL_ARGUMENT_ERROR;
83359d709d503bab6e2b61931737e662dd293b40578ccornelius    return result;
83459d709d503bab6e2b61931737e662dd293b40578ccornelius  }
83559d709d503bab6e2b61931737e662dd293b40578ccornelius  if (result == NULL) { // allocate if not allocated.
83659d709d503bab6e2b61931737e662dd293b40578ccornelius    newFormattable = result = ufmt_open(status);
83759d709d503bab6e2b61931737e662dd293b40578ccornelius  }
83859d709d503bab6e2b61931737e662dd293b40578ccornelius  parseRes(*(Formattable::fromUFormattable(result)), fmt, text, textLength, parsePos, status);
83959d709d503bab6e2b61931737e662dd293b40578ccornelius  if (U_FAILURE(*status) && newFormattable != NULL) {
84059d709d503bab6e2b61931737e662dd293b40578ccornelius    ufmt_close(newFormattable);
84159d709d503bab6e2b61931737e662dd293b40578ccornelius    result = NULL; // deallocate if there was a parse error
84259d709d503bab6e2b61931737e662dd293b40578ccornelius  }
84359d709d503bab6e2b61931737e662dd293b40578ccornelius  return result;
84459d709d503bab6e2b61931737e662dd293b40578ccornelius}
84559d709d503bab6e2b61931737e662dd293b40578ccornelius
84659d709d503bab6e2b61931737e662dd293b40578ccorneliusU_INTERNAL int32_t U_EXPORT2
84759d709d503bab6e2b61931737e662dd293b40578ccorneliusunum_formatUFormattable(const UNumberFormat* fmt,
84859d709d503bab6e2b61931737e662dd293b40578ccornelius                        const UFormattable *number,
84959d709d503bab6e2b61931737e662dd293b40578ccornelius                        UChar *result,
85059d709d503bab6e2b61931737e662dd293b40578ccornelius                        int32_t resultLength,
85159d709d503bab6e2b61931737e662dd293b40578ccornelius                        UFieldPosition *pos, /* ignored if 0 */
85259d709d503bab6e2b61931737e662dd293b40578ccornelius                        UErrorCode *status) {
85359d709d503bab6e2b61931737e662dd293b40578ccornelius    if (U_FAILURE(*status)) {
85459d709d503bab6e2b61931737e662dd293b40578ccornelius      return 0;
85559d709d503bab6e2b61931737e662dd293b40578ccornelius    }
85659d709d503bab6e2b61931737e662dd293b40578ccornelius    if (fmt == NULL || number==NULL ||
85759d709d503bab6e2b61931737e662dd293b40578ccornelius        (result==NULL ? resultLength!=0 : resultLength<0)) {
85859d709d503bab6e2b61931737e662dd293b40578ccornelius      *status = U_ILLEGAL_ARGUMENT_ERROR;
85959d709d503bab6e2b61931737e662dd293b40578ccornelius      return 0;
86059d709d503bab6e2b61931737e662dd293b40578ccornelius    }
86159d709d503bab6e2b61931737e662dd293b40578ccornelius    UnicodeString res(result, 0, resultLength);
86259d709d503bab6e2b61931737e662dd293b40578ccornelius
86359d709d503bab6e2b61931737e662dd293b40578ccornelius    FieldPosition fp;
86459d709d503bab6e2b61931737e662dd293b40578ccornelius
86559d709d503bab6e2b61931737e662dd293b40578ccornelius    if(pos != 0)
86659d709d503bab6e2b61931737e662dd293b40578ccornelius        fp.setField(pos->field);
86759d709d503bab6e2b61931737e662dd293b40578ccornelius
86859d709d503bab6e2b61931737e662dd293b40578ccornelius    ((const NumberFormat*)fmt)->format(*(Formattable::fromUFormattable(number)), res, fp, *status);
86959d709d503bab6e2b61931737e662dd293b40578ccornelius
87059d709d503bab6e2b61931737e662dd293b40578ccornelius    if(pos != 0) {
87159d709d503bab6e2b61931737e662dd293b40578ccornelius        pos->beginIndex = fp.getBeginIndex();
87259d709d503bab6e2b61931737e662dd293b40578ccornelius        pos->endIndex = fp.getEndIndex();
87359d709d503bab6e2b61931737e662dd293b40578ccornelius    }
87459d709d503bab6e2b61931737e662dd293b40578ccornelius
87559d709d503bab6e2b61931737e662dd293b40578ccornelius    return res.extract(result, resultLength, *status);
87659d709d503bab6e2b61931737e662dd293b40578ccornelius}
87759d709d503bab6e2b61931737e662dd293b40578ccornelius
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
879