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