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