1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* Copyright (C) 1997-2014, International Business Machines Corporation and * 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* others. All Rights Reserved. * 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File DECIMFMT.CPP 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 02/19/97 aliu Converted from java. 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 03/20/97 clhuang Implemented with new APIs. 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 03/31/97 aliu Moved isLONG_MIN to DigitList, and fixed it. 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/3/97 aliu Rewrote parsing and formatting completely, and 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* cleaned up and debugged. Actually works now. 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Implemented NAN and INF handling, for both parsing 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* and formatting. Extensive testing & debugging. 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/10/97 aliu Modified to compile on AIX. 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 04/16/97 aliu Rewrote to use DigitList, which has been resurrected. 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Changed DigitCount to int per code review. 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 07/09/97 helena Made ParsePosition into a class. 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 08/26/97 aliu Extensive changes to applyPattern; completely 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* rewritten from the Java. 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 09/09/97 aliu Ported over support for exponential formats. 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 07/20/98 stephen JDK 1.2 sync up. 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Various instances of '0' replaced with 'NULL' 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Check for grouping size in subFormat() 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Brought subParse() in line with Java 1.2 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Added method appendAffix() 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 08/24/1998 srl Removed Mutex calls. This is not a thread safe class! 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 02/22/99 stephen Removed character literals for EBCDIC safety 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 06/24/99 helena Integrated Alan's NF enhancements and Java2 bug fixes 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 06/28/99 stephen Fixed bugs in toPattern(). 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 06/29/99 stephen Fixed operator= to copy fFormatWidth, fPad, 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* fPadPosition 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************** 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "fphdlimp.h" 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h" 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/choicfmt.h" 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucurr.h" 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/dcfmtsym.h" 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ures.h" 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/uniset.h" 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h" 54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/currpinf.h" 55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "unicode/plurrule.h" 56103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h" 57103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/numsys.h" 58103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/localpointer.h" 59b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "uresimp.h" 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucurrimp.h" 6127f654740f2a26ad62a5c155af9199af9e69b889claireho#include "charstr.h" 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h" 63b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "patternprops.h" 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "digitlst.h" 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h" 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h" 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h" 69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include <math.h> 70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "hash.h" 71b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "decfmtst.h" 72103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "dcfmtimp.h" 7359d709d503bab6e2b61931737e662dd293b40578ccornelius#include "plurrule_impl.h" 74fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "decimalformatpattern.h" 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/* 778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * On certain platforms, round is a macro defined in math.h 788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * This undefine is to avoid conflict between the macro and 798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * the function defined below. 808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 818393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#ifdef round 828393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#undef round 838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 8559d709d503bab6e2b61931737e662dd293b40578ccornelius 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8859d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 8959d709d503bab6e2b61931737e662dd293b40578ccornelius#include <stdio.h> 9059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void _debugout(const char *f, int l, const UnicodeString& s) { 9159d709d503bab6e2b61931737e662dd293b40578ccornelius char buf[2000]; 9259d709d503bab6e2b61931737e662dd293b40578ccornelius s.extract((int32_t) 0, s.length(), buf, "utf-8"); 9359d709d503bab6e2b61931737e662dd293b40578ccornelius printf("%s:%d: %s\n", f,l, buf); 9459d709d503bab6e2b61931737e662dd293b40578ccornelius} 9559d709d503bab6e2b61931737e662dd293b40578ccornelius#define debugout(x) _debugout(__FILE__,__LINE__,x) 9659d709d503bab6e2b61931737e662dd293b40578ccornelius#define debug(x) printf("%s:%d: %s\n", __FILE__,__LINE__, x); 9759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UnicodeString dbg_null("<NULL>",""); 9859d709d503bab6e2b61931737e662dd293b40578ccornelius#define DEREFSTR(x) ((x!=NULL)?(*x):(dbg_null)) 9959d709d503bab6e2b61931737e662dd293b40578ccornelius#else 10059d709d503bab6e2b61931737e662dd293b40578ccornelius#define debugout(x) 10159d709d503bab6e2b61931737e662dd293b40578ccornelius#define debug(x) 10259d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 10359d709d503bab6e2b61931737e662dd293b40578ccornelius 10454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 105103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* == Fastpath calculation. == 106103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusinline DecimalFormatInternal& internalData(uint8_t *reserved) { 109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return *reinterpret_cast<DecimalFormatInternal*>(reserved); 110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusinline const DecimalFormatInternal& internalData(const uint8_t *reserved) { 112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return *reinterpret_cast<const DecimalFormatInternal*>(reserved); 113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* For currency parsing purose, 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Need to remember all prefix patterns and suffix patterns of 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * every currency format pattern, 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * including the pattern of default currecny style 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * and plural currency style. And the patterns are set through applyPattern. 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct AffixPatternsForCurrency : public UMemory { 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative prefix pattern 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negPrefixPatternForCurrency; 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative suffix pattern 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negSuffixPatternForCurrency; 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive prefix pattern 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posPrefixPatternForCurrency; 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive suffix pattern 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posSuffixPatternForCurrency; 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int8_t patternType; 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho AffixPatternsForCurrency(const UnicodeString& negPrefix, 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& negSuffix, 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posPrefix, 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posSuffix, 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int8_t type) { 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negPrefixPatternForCurrency = negPrefix; 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negSuffixPatternForCurrency = negSuffix; 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posPrefixPatternForCurrency = posPrefix; 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posSuffixPatternForCurrency = posSuffix; 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho patternType = type; 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 14559d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 14659d709d503bab6e2b61931737e662dd293b40578ccornelius void dump() const { 14759d709d503bab6e2b61931737e662dd293b40578ccornelius debugout( UnicodeString("AffixPatternsForCurrency( -=\"") + 14859d709d503bab6e2b61931737e662dd293b40578ccornelius negPrefixPatternForCurrency + (UnicodeString)"\"/\"" + 14959d709d503bab6e2b61931737e662dd293b40578ccornelius negSuffixPatternForCurrency + (UnicodeString)"\" +=\"" + 15059d709d503bab6e2b61931737e662dd293b40578ccornelius posPrefixPatternForCurrency + (UnicodeString)"\"/\"" + 15159d709d503bab6e2b61931737e662dd293b40578ccornelius posSuffixPatternForCurrency + (UnicodeString)"\" )"); 15259d709d503bab6e2b61931737e662dd293b40578ccornelius } 15359d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* affix for currency formatting when the currency sign in the pattern 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * equals to 3, such as the pattern contains 3 currency sign or 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * the formatter style is currency plural format style. 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct AffixesForCurrency : public UMemory { 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative prefix 16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negPrefixForCurrency; 16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative suffix 16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negSuffixForCurrency; 16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive prefix 16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posPrefixForCurrency; 16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive suffix 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posSuffixForCurrency; 16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t formatWidth; 17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho AffixesForCurrency(const UnicodeString& negPrefix, 17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& negSuffix, 17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posPrefix, 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posSuffix) { 17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negPrefixForCurrency = negPrefix; 17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negSuffixForCurrency = negSuffix; 17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posPrefixForCurrency = posPrefix; 17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posSuffixForCurrency = posSuffix; 18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 18159d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 18259d709d503bab6e2b61931737e662dd293b40578ccornelius void dump() const { 18359d709d503bab6e2b61931737e662dd293b40578ccornelius debugout( UnicodeString("AffixesForCurrency( -=\"") + 18459d709d503bab6e2b61931737e662dd293b40578ccornelius negPrefixForCurrency + (UnicodeString)"\"/\"" + 18559d709d503bab6e2b61931737e662dd293b40578ccornelius negSuffixForCurrency + (UnicodeString)"\" +=\"" + 18659d709d503bab6e2b61931737e662dd293b40578ccornelius posPrefixForCurrency + (UnicodeString)"\"/\"" + 18759d709d503bab6e2b61931737e662dd293b40578ccornelius posSuffixForCurrency + (UnicodeString)"\" )"); 18859d709d503bab6e2b61931737e662dd293b40578ccornelius } 18959d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CDECL_BEGIN 193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/** 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @internal ICU 4.2 196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 19750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool U_CALLCONV decimfmtAffixValueComparator(UHashTok val1, UHashTok val2); 198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/** 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @internal ICU 4.2 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 20250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool U_CALLCONV decimfmtAffixPatternValueComparator(UHashTok val1, UHashTok val2); 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 20550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool 206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CALLCONV decimfmtAffixValueComparator(UHashTok val1, UHashTok val2) { 20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixesForCurrency* affix_1 = 20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixesForCurrency*)val1.pointer; 20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixesForCurrency* affix_2 = 21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixesForCurrency*)val2.pointer; 211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return affix_1->negPrefixForCurrency == affix_2->negPrefixForCurrency && 212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->negSuffixForCurrency == affix_2->negSuffixForCurrency && 213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->posPrefixForCurrency == affix_2->posPrefixForCurrency && 214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->posSuffixForCurrency == affix_2->posSuffixForCurrency; 215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 21850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool 219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CALLCONV decimfmtAffixPatternValueComparator(UHashTok val1, UHashTok val2) { 22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixPatternsForCurrency* affix_1 = 22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixPatternsForCurrency*)val1.pointer; 22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixPatternsForCurrency* affix_2 = 22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixPatternsForCurrency*)val2.pointer; 22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return affix_1->negPrefixPatternForCurrency == 225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->negPrefixPatternForCurrency && 22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix_1->negSuffixPatternForCurrency == 227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->negSuffixPatternForCurrency && 22850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix_1->posPrefixPatternForCurrency == 229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->posPrefixPatternForCurrency && 23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix_1->posSuffixPatternForCurrency == 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->posSuffixPatternForCurrency && 232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->patternType == affix_2->patternType; 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 23550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CDECL_END 23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ***************************************************************************** 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class DecimalFormat 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ***************************************************************************** 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormat) 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constants for characters used in programmatic (unlocalized) patterns. 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternZeroDigit ((UChar)0x0030) /*'0'*/ 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternSignificantDigit ((UChar)0x0040) /*'@'*/ 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternGroupingSeparator ((UChar)0x002C) /*','*/ 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternDecimalSeparator ((UChar)0x002E) /*'.'*/ 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPerMill ((UChar)0x2030) 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPercent ((UChar)0x0025) /*'%'*/ 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternDigit ((UChar)0x0023) /*'#'*/ 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternSeparator ((UChar)0x003B) /*';'*/ 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternExponent ((UChar)0x0045) /*'E'*/ 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPlus ((UChar)0x002B) /*'+'*/ 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternMinus ((UChar)0x002D) /*'-'*/ 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPadEscape ((UChar)0x002A) /*'*'*/ 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kQuote ((UChar)0x0027) /*'\''*/ 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The CURRENCY_SIGN is the standard Unicode symbol for currency. It 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is used in patterns and substitued with either the currency symbol, 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or if it is doubled, with the international currency symbol. If the 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CURRENCY_SIGN is seen in a pattern, then the decimal separator is 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * replaced with the monetary decimal separator. 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kCurrencySign ((UChar)0x00A4) 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kDefaultPad ((UChar)0x0020) /* */ 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t DecimalFormat::kDoubleIntegerDigits = 309; 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t DecimalFormat::kDoubleFractionDigits = 340; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t DecimalFormat::kMaxScientificIntegerDigits = 8; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * These are the tags we expect to see in normal resource bundle files associated 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with a locale. 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 27927f654740f2a26ad62a5c155af9199af9e69b889clairehoconst char DecimalFormat::fgNumberPatterns[]="NumberPatterns"; // Deprecated - not used 28027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgNumberElements[]="NumberElements"; 28127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgLatn[]="latn"; 28227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgPatterns[]="patterns"; 28327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgDecimalFormat[]="decimalFormat"; 28427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgCurrencyFormat[]="currencyFormat"; 28559d709d503bab6e2b61931737e662dd293b40578ccornelius 286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar fgTripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0}; 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline int32_t _min(int32_t a, int32_t b) { return (a<b) ? a : b; } 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline int32_t _max(int32_t a, int32_t b) { return (a<b) ? b : a; } 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void copyString(const UnicodeString& src, UBool isBogus, UnicodeString *& dest, UErrorCode &status) { 292fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (U_FAILURE(status)) { 293fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 294fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 295fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (isBogus) { 296fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius delete dest; 297fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius dest = NULL; 298fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 299fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (dest != NULL) { 300fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *dest = src; 301fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 302fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius dest = new UnicodeString(src); 303fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (dest == NULL) { 304fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius status = U_MEMORY_ALLOCATION_ERROR; 305fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 306fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 307fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 308fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 309fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 310fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 311fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance in the default locale. 31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 31550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::DecimalFormat(UErrorCode& status) { 31659d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern in the default locale. 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 32759d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError, &pattern); 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern and the number format symbols in the default locale. The 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// created instance owns the symbols. 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt, 33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 34059d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbolsToAdopt == NULL) 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError, &pattern, symbolsToAdopt); 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat( const UnicodeString& pattern, 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt, 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError& parseErr, 35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 35159d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbolsToAdopt == NULL) 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status,parseErr, &pattern, symbolsToAdopt); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 35650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern and the number format symbols in the default locale. The 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// created instance owns the clone of the symbols. 36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DecimalFormatSymbols& symbols, 36450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 36559d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError, &pattern, new DecimalFormatSymbols(symbols)); 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// pattern, the number format symbols, and the number format style. 373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// The created instance owns the clone of the symbols. 37450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt, 377b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UNumberFormatStyle style, 37850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 37959d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 38050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fStyle = style; 381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseError; 382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru construct(status, parseError, &pattern, symbolsToAdopt); 383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//----------------------------------------------------------------------------- 38650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Common DecimalFormat initialization. 38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Put all fields of an uninitialized object into a known state. 38850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Common code, shared by all constructors. 38959d709d503bab6e2b61931737e662dd293b40578ccornelius// Can not fail. Leave the object in good enough shape that the destructor 39059d709d503bab6e2b61931737e662dd293b40578ccornelius// or assignment operator can run successfully. 39150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 39259d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::init() { 39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPosPrefixPattern = 0; 39450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPosSuffixPattern = 0; 39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fNegPrefixPattern = 0; 39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fNegSuffixPattern = 0; 39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fCurrencyChoice = 0; 39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier = NULL; 3998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius fScale = 0; 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fGroupingSize = 0; 40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fGroupingSize2 = 0; 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fDecimalSeparatorAlwaysShown = FALSE; 40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fSymbols = NULL; 40450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fUseSignificantDigits = FALSE; 40550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMinSignificantDigits = 1; 40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMaxSignificantDigits = 6; 40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fUseExponentialNotation = FALSE; 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMinExponentDigits = 0; 40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fExponentSignAlwaysShown = FALSE; 41054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fBoolFlags.clear(); 41150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fRoundingIncrement = 0; 41250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fRoundingMode = kRoundHalfEven; 41350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPad = 0; 41450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fFormatWidth = 0; 41550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPadPosition = kPadBeforePrefix; 416b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStyle = UNUM_DECIMAL; 41759d709d503bab6e2b61931737e662dd293b40578ccornelius fCurrencySignCount = fgCurrencySignCountZero; 41850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fAffixPatternsForCurrency = NULL; 41950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fAffixesForCurrency = NULL; 42050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPluralAffixesForCurrency = NULL; 42150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fCurrencyPluralInfo = NULL; 422103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 423103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fParseAllInput = UNUM_MAYBE; 424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 427103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatInternal &data = internalData(fReserved); 42854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastFormatStatus=kFastpathUNKNOWN; // don't try to calculate the fastpath until later. 42954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus=kFastpathUNKNOWN; // don't try to calculate the fastpath until later. 430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 43159d709d503bab6e2b61931737e662dd293b40578ccornelius fStaticSets = NULL; 43250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 43350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//------------------------------------------------------------------------------ 435b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern and the number format symbols in the desired locale. The 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// created instance owns the symbols. 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 44059d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::construct(UErrorCode& status, 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError& parseErr, 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* pattern, 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt) 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols = symbolsToAdopt; // Do this BEFORE aborting on status failure!!! 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingIncrement = NULL; 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingMode = kRoundHalfEven; 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = kPatternPadEscape; 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition = kPadBeforePrefix; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPosPrefixPattern = fPosSuffixPattern = NULL; 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern = fNegSuffixPattern = NULL; 45550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setMultiplier(1); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize = 3; 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 = 0; 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown = FALSE; 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation = FALSE; 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinExponentDigits = 0; 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fSymbols == NULL) 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols = new DecimalFormatSymbols(Locale::getDefault(), status); 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fSymbols == 0) { 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 47059d709d503bab6e2b61931737e662dd293b40578ccornelius fStaticSets = DecimalFormatStaticSets::getStaticSets(status); 47159d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 47259d709d503bab6e2b61931737e662dd293b40578ccornelius return; 47359d709d503bab6e2b61931737e662dd293b40578ccornelius } 474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode nsStatus = U_ZERO_ERROR; 475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius NumberingSystem *ns = NumberingSystem::createInstance(nsStatus); 476103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(nsStatus)) { 477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status = nsStatus; 478103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 479103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str; 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Uses the default locale's number format pattern if there isn't 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // one specified. 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pattern == NULL) 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 487103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UResourceBundle *top = ures_open(NULL, Locale::getDefault().getName(), &status); 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UResourceBundle *resource = ures_getByKeyWithFallback(top, fgNumberElements, NULL, &status); 490103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, ns->getName(), resource, &status); 491b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &status); 492b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar *resStr = ures_getStringByKeyWithFallback(resource, fgDecimalFormat, &len, &status); 493103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ( status == U_MISSING_RESOURCE_ERROR && uprv_strcmp(fgLatn,ns->getName())) { 494103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status = U_ZERO_ERROR; 495103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(top, fgNumberElements, resource, &status); 496103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, fgLatn, resource, &status); 497103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &status); 498103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resStr = ures_getStringByKeyWithFallback(resource, fgDecimalFormat, &len, &status); 499103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str.setTo(TRUE, resStr, len); 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern = &str; 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(resource); 503103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ures_close(top); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 506103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius delete ns; 507103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pattern->indexOf((UChar)kCurrencySign) >= 0) { 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If it looks like we are going to use a currency pattern 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // then do the time consuming lookup. 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setCurrencyForSymbols(); 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 518b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(NULL, status); 519b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 520b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* patternUsed; 522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString currencyPluralPatternForOther; 523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // apply pattern 524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = new CurrencyPluralInfo(fSymbols->getLocale(), status); 526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 527b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // the pattern used in format is not fixed until formatting, 53150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // in which, the number is known and 532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // will be used to pick the right pattern based on plural count. 533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Here, set the pattern as the pattern of plural count == "other". 534b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // For most locale, the patterns are probably the same for all 535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // plural count. If not, the right pattern need to be re-applied 536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // during format. 537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fCurrencyPluralInfo->getCurrencyPluralPattern(UNICODE_STRING("other", 5), currencyPluralPatternForOther); 538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru patternUsed = ¤cyPluralPatternForOther; 539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // TODO: not needed? 540b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyForSymbols(); 54150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru patternUsed = pattern; 544b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (patternUsed->indexOf(kCurrencySign) != -1) { 54750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // initialize for currency, not only for plural format, 548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // but also for mix parsing 549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == NULL) { 550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = new CurrencyPluralInfo(fSymbols->getLocale(), status); 551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // need it for mix parsing 556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixPatterns(status); 557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // expanded affixes for plural names 558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (patternUsed->indexOf(fgTripleCurrencySign, 3, 0) != -1) { 559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(*patternUsed, TRUE, TRUE, status); 560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 56150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(*patternUsed,FALSE, parseErr, status); 564b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // expand affixes 566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount != fgCurrencySignCountInPluralFormat) { 567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixAdjustWidth(NULL); 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If it was a currency format, apply the appropriate rounding by 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // resetting the currency. NOTE: this copies fCurrency on top of itself. 57259d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 573b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(getCurrency(), status); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatInternal &data = internalData(fReserved); 57754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastFormatStatus = kFastpathNO; // allow it to be calculated 57854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus = kFastpathNO; // allow it to be calculated 579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 583b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 584b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 585b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::setupCurrencyAffixPatterns(UErrorCode& status) { 586b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 588b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseErr; 590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency = initHashForAffixPattern(status); 591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius NumberingSystem *ns = NumberingSystem::createInstance(fSymbols->getLocale(),status); 596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(status)) { 597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Save the default currency patterns of this locale. 601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Here, chose onlyApplyPatternWithoutExpandAffix without 602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // expanding the affix patterns into affixes. 603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString currencyPattern; 60427f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode error = U_ZERO_ERROR; 60527f654740f2a26ad62a5c155af9199af9e69b889claireho 60627f654740f2a26ad62a5c155af9199af9e69b889claireho UResourceBundle *resource = ures_open(NULL, fSymbols->getLocale().getName(), &error); 607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UResourceBundle *numElements = ures_getByKeyWithFallback(resource, fgNumberElements, NULL, &error); 608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(numElements, ns->getName(), resource, &error); 609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &error); 610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t patLen = 0; 611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar *patResStr = ures_getStringByKeyWithFallback(resource, fgCurrencyFormat, &patLen, &error); 612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ( error == U_MISSING_RESOURCE_ERROR && uprv_strcmp(ns->getName(),fgLatn)) { 613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius error = U_ZERO_ERROR; 614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(numElements, fgLatn, resource, &error); 615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &error); 616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius patResStr = ures_getStringByKeyWithFallback(resource, fgCurrencyFormat, &patLen, &error); 617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ures_close(numElements); 619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ures_close(resource); 620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius delete ns; 621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(error)) { 623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(UnicodeString(patResStr, patLen), false, 624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parseErr, status); 625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixPatternsForCurrency* affixPtn = new AffixPatternsForCurrency( 626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegPrefixPattern, 627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegSuffixPattern, 628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosPrefixPattern, 629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosSuffixPattern, 630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCURR_SYMBOL_NAME); 631b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fAffixPatternsForCurrency->put(UNICODE_STRING("default", 7), affixPtn, status); 632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // save the unique currency plural patterns of this locale. 635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* pluralPtn = fCurrencyPluralInfo->fPluralCountToCurrencyUnitPattern; 636b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t pos = -1; 638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable pluralPatternSet; 639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ((element = pluralPtn->nextElement(pos)) != NULL) { 640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* value = (UnicodeString*)valueTok.pointer; 642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok keyTok = element->key; 643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* key = (UnicodeString*)keyTok.pointer; 644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (pluralPatternSet.geti(*value) != 1) { 645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pluralPatternSet.puti(*value, 1, status); 646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(*value, false, parseErr, status); 647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixPatternsForCurrency* affixPtn = new AffixPatternsForCurrency( 648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegPrefixPattern, 649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegSuffixPattern, 650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosPrefixPattern, 651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosSuffixPattern, 652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCURR_LONG_NAME); 653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency->put(*key, affixPtn, status); 654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 66050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::setupCurrencyAffixes(const UnicodeString& pattern, 661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool setupForCurrentPattern, 662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool setupForPluralPattern, 663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseErr; 668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (setupForCurrentPattern) { 669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fAffixesForCurrency) { 670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fAffixesForCurrency); 671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixesForCurrency = initHashForAffix(status); 673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(pattern, false, parseErr, status); 675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const PluralRules* pluralRules = fCurrencyPluralInfo->getPluralRules(); 676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru StringEnumeration* keywords = pluralRules->getKeywords(status); 677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 678b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString* pluralCount; 679b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while ((pluralCount = keywords->snext(status)) != NULL) { 680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_SUCCESS(status) ) { 681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho expandAffixAdjustWidth(pluralCount); 682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* affix = new AffixesForCurrency( 683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegativePrefix, fNegativeSuffix, fPositivePrefix, fPositiveSuffix); 684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fAffixesForCurrency->put(*pluralCount, affix, status); 685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 687b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete keywords; 689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 691b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (setupForPluralPattern) { 697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fPluralAffixesForCurrency) { 698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fPluralAffixesForCurrency); 699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPluralAffixesForCurrency = initHashForAffix(status); 701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const PluralRules* pluralRules = fCurrencyPluralInfo->getPluralRules(); 703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru StringEnumeration* keywords = pluralRules->getKeywords(status); 704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString* pluralCount; 706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while ((pluralCount = keywords->snext(status)) != NULL) { 707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_SUCCESS(status) ) { 708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString ptn; 709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fCurrencyPluralInfo->getCurrencyPluralPattern(*pluralCount, ptn); 710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho applyPatternInternally(*pluralCount, ptn, false, parseErr, status); 711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* affix = new AffixesForCurrency( 712b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegativePrefix, fNegativeSuffix, fPositivePrefix, fPositiveSuffix); 713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fPluralAffixesForCurrency->put(*pluralCount, affix, status); 714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 716b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 71750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete keywords; 718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::~DecimalFormat() 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosPrefixPattern; 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosSuffixPattern; 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegPrefixPattern; 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegSuffixPattern; 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fCurrencyChoice; 73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete fMultiplier; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fSymbols; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fRoundingIncrement; 735b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffixPattern(); 736b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fAffixesForCurrency); 737b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fPluralAffixesForCurrency); 738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete fCurrencyPluralInfo; 739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// copy constructor 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 74450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::DecimalFormat(const DecimalFormat &source) : 74550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NumberFormat(source) { 74659d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *this = source; 748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// assignment operator 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 75354dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustemplate <class T> 75454dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void _copy_ptr(T** pdest, const T* source) { 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (source == NULL) { 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete *pdest; 757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pdest = NULL; 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (*pdest == NULL) { 75954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pdest = new T(*source); 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 76154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius **pdest = *source; 76254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 76354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 76454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 76554dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustemplate <class T> 76654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void _clone_ptr(T** pdest, const T* source) { 76754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius delete *pdest; 76854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (source == NULL) { 76954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pdest = NULL; 77054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 77154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pdest = static_cast<T*>(source->clone()); 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat& 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::operator=(const DecimalFormat& rhs) 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(this != &rhs) { 77959d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode status = U_ZERO_ERROR; 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::operator=(rhs); 78159d709d503bab6e2b61931737e662dd293b40578ccornelius fStaticSets = DecimalFormatStaticSets::getStaticSets(status); 782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositivePrefix = rhs.fPositivePrefix; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositiveSuffix = rhs.fPositiveSuffix; 784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix = rhs.fNegativePrefix; 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix = rhs.fNegativeSuffix; 78654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fPosPrefixPattern, rhs.fPosPrefixPattern); 78754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fPosSuffixPattern, rhs.fPosSuffixPattern); 78854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fNegPrefixPattern, rhs.fNegPrefixPattern); 78954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fNegSuffixPattern, rhs.fNegSuffixPattern); 79054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _clone_ptr(&fCurrencyChoice, rhs.fCurrencyChoice); 79150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setRoundingIncrement(rhs.getRoundingIncrement()); 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingMode = rhs.fRoundingMode; 79350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setMultiplier(rhs.getMultiplier()); 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize = rhs.fGroupingSize; 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 = rhs.fGroupingSize2; 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown = rhs.fDecimalSeparatorAlwaysShown; 79754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fSymbols, rhs.fSymbols); 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation = rhs.fUseExponentialNotation; 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fExponentSignAlwaysShown = rhs.fExponentSignAlwaysShown; 80054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fBoolFlags = rhs.fBoolFlags; 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Bertrand A. D. Update 98.03.17*/ 802b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencySignCount = rhs.fCurrencySignCount; 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*end of Update*/ 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinExponentDigits = rhs.fMinExponentDigits; 80550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sfb 990629 */ 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fFormatWidth = rhs.fFormatWidth; 808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = rhs.fPad; 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition = rhs.fPadPosition; 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* end sfb */ 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinSignificantDigits = rhs.fMinSignificantDigits; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMaxSignificantDigits = rhs.fMaxSignificantDigits; 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseSignificantDigits = rhs.fUseSignificantDigits; 814b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fFormatPattern = rhs.fFormatPattern; 815b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fStyle = rhs.fStyle; 81654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _clone_ptr(&fCurrencyPluralInfo, rhs.fCurrencyPluralInfo); 81754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius deleteHashForAffixPattern(); 818b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (rhs.fAffixPatternsForCurrency) { 819b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 820b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency = initHashForAffixPattern(status); 82150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho copyHashForAffixPattern(rhs.fAffixPatternsForCurrency, 822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency, status); 823b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 82454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius deleteHashForAffix(fAffixesForCurrency); 825b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (rhs.fAffixesForCurrency) { 826b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 827b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixesForCurrency = initHashForAffixPattern(status); 828b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru copyHashForAffix(rhs.fAffixesForCurrency, fAffixesForCurrency, status); 829b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 83054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius deleteHashForAffix(fPluralAffixesForCurrency); 831b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (rhs.fPluralAffixesForCurrency) { 832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 833b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPluralAffixesForCurrency = initHashForAffixPattern(status); 834b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru copyHashForAffix(rhs.fPluralAffixesForCurrency, fPluralAffixesForCurrency, status); 835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 836103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 837fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius DecimalFormatInternal &data = internalData(fReserved); 838fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius const DecimalFormatInternal &rhsData = internalData(rhs.fReserved); 839fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius data = rhsData; 840103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 841fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *this; 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::operator==(const Format& that) const 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &that) 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NumberFormat::operator== guarantees this cast is safe 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DecimalFormat* other = (DecimalFormat*)&that; 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef FMT_DEBUG 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This code makes it easy to determine why two format objects that should 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // be equal aren't. 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool first = TRUE; 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!NumberFormat::operator==(that)) { 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NumberFormat::!="); 863b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fPosPrefixPattern == other->fPosPrefixPattern && // both null 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositivePrefix == other->fPositivePrefix) 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fPosPrefixPattern != 0 && other->fPosPrefixPattern != 0 && 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fPosPrefixPattern == *other->fPosPrefixPattern))) { 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Pos Prefix !="); 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fPosSuffixPattern == other->fPosSuffixPattern && // both null 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositiveSuffix == other->fPositiveSuffix) 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fPosSuffixPattern != 0 && other->fPosSuffixPattern != 0 && 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fPosSuffixPattern == *other->fPosSuffixPattern))) { 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Pos Suffix !="); 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fNegPrefixPattern == other->fNegPrefixPattern && // both null 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix == other->fNegativePrefix) 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fNegPrefixPattern != 0 && other->fNegPrefixPattern != 0 && 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fNegPrefixPattern == *other->fNegPrefixPattern))) { 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Neg Prefix "); 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegPrefixPattern == NULL) { 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(fNegativePrefix); 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*fNegPrefixPattern); 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(" != "); 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (other->fNegPrefixPattern == NULL) { 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(other->fNegativePrefix); 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*other->fNegPrefixPattern); 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fNegSuffixPattern == other->fNegSuffixPattern && // both null 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix == other->fNegativeSuffix) 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fNegSuffixPattern != 0 && other->fNegSuffixPattern != 0 && 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fNegSuffixPattern == *other->fNegSuffixPattern))) { 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Neg Suffix "); 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegSuffixPattern == NULL) { 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(fNegativeSuffix); 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*fNegSuffixPattern); 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(" != "); 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (other->fNegSuffixPattern == NULL) { 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(other->fNegativeSuffix); 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*other->fNegSuffixPattern); 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fRoundingIncrement == other->fRoundingIncrement) // both null 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fRoundingIncrement != NULL && 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru other->fRoundingIncrement != NULL && 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fRoundingIncrement == *other->fRoundingIncrement))) { 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Rounding Increment !="); 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 929fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fRoundingMode != other->fRoundingMode) { 930fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 931fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius printf("Rounding Mode %d != %d", (int)fRoundingMode, (int)other->fRoundingMode); 932fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 93350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (getMultiplier() != other->getMultiplier()) { 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } 93550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("Multiplier %ld != %ld", getMultiplier(), other->getMultiplier()); 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fGroupingSize != other->fGroupingSize) { 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Grouping Size %ld != %ld", fGroupingSize, other->fGroupingSize); 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fGroupingSize2 != other->fGroupingSize2) { 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Secondary Grouping Size %ld != %ld", fGroupingSize2, other->fGroupingSize2); 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fDecimalSeparatorAlwaysShown != other->fDecimalSeparatorAlwaysShown) { 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 947fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius printf("fDecimalSeparatorAlwaysShown %d != %d", fDecimalSeparatorAlwaysShown, other->fDecimalSeparatorAlwaysShown); 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation != other->fUseExponentialNotation) { 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 951fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fUseExponentialNotation !="); 952fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 953fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fUseExponentialNotation && 954fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fMinExponentDigits != other->fMinExponentDigits) { 955fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 956fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fMinExponentDigits !="); 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 958fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fUseExponentialNotation && 959fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fExponentSignAlwaysShown != other->fExponentSignAlwaysShown) { 960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 961fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fExponentSignAlwaysShown !="); 962fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 963fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fBoolFlags.getAll() != other->fBoolFlags.getAll()) { 964fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 965fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fBoolFlags !="); 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*fSymbols != *(other->fSymbols)) { 968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Symbols !="); 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TODO Add debug stuff for significant digits here 972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fUseSignificantDigits != other->fUseSignificantDigits) { 973fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fUseSignificantDigits !="); 975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fUseSignificantDigits && 977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fMinSignificantDigits != other->fMinSignificantDigits) { 978fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fMinSignificantDigits !="); 980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fUseSignificantDigits && 982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fMaxSignificantDigits != other->fMaxSignificantDigits) { 983fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fMaxSignificantDigits !="); 985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 986fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fFormatWidth != other->fFormatWidth) { 987fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 988fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fFormatWidth !="); 989fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 990fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fPad != other->fPad) { 991fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 992fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fPad !="); 993fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 994fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fPadPosition != other->fPadPosition) { 995fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 996fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fPadPosition !="); 997fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 998fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fStyle == UNUM_CURRENCY_PLURAL && 999fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fStyle != other->fStyle) 1000fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 1001fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fStyle !="); 1002fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1003fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fStyle == UNUM_CURRENCY_PLURAL && 1004fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatPattern != other->fFormatPattern) { 1005fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 1006fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fFormatPattern !="); 1007fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!first) { printf(" ]"); } 1010b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount != other->fCurrencySignCount) { 1011b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencySignCount !="); 1012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1013b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == other->fCurrencyPluralInfo) { 1014b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo == "); 1015b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == NULL) { 1016b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo == NULL"); 1017b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo != NULL && other->fCurrencyPluralInfo != NULL && 1020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fCurrencyPluralInfo != *(other->fCurrencyPluralInfo)) { 1021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo !="); 1022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1023b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo != NULL && other->fCurrencyPluralInfo == NULL || 1024b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo == NULL && other->fCurrencyPluralInfo != NULL) { 1025b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo one NULL, the other not"); 1026b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == NULL && other->fCurrencyPluralInfo == NULL) { 1028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo == "); 1029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1033fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return ( 1034fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::operator==(that) && 1035fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1036fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fCurrencySignCount == fgCurrencySignCountInPluralFormat) ? 1037fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fAffixPatternsForCurrency->equals(*other->fAffixPatternsForCurrency)) : 1038fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (((fPosPrefixPattern == other->fPosPrefixPattern && // both null 1039fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPositivePrefix == other->fPositivePrefix) 1040fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fPosPrefixPattern != 0 && other->fPosPrefixPattern != 0 && 1041fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fPosPrefixPattern == *other->fPosPrefixPattern)) && 1042fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fPosSuffixPattern == other->fPosSuffixPattern && // both null 1043fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPositiveSuffix == other->fPositiveSuffix) 1044fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fPosSuffixPattern != 0 && other->fPosSuffixPattern != 0 && 1045fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fPosSuffixPattern == *other->fPosSuffixPattern)) && 1046fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fNegPrefixPattern == other->fNegPrefixPattern && // both null 1047fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fNegativePrefix == other->fNegativePrefix) 1048fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fNegPrefixPattern != 0 && other->fNegPrefixPattern != 0 && 1049fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fNegPrefixPattern == *other->fNegPrefixPattern)) && 1050fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fNegSuffixPattern == other->fNegSuffixPattern && // both null 1051fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fNegativeSuffix == other->fNegativeSuffix) 1052fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fNegSuffixPattern != 0 && other->fNegSuffixPattern != 0 && 1053fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fNegSuffixPattern == *other->fNegSuffixPattern)))) && 1054fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1055fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fRoundingIncrement == other->fRoundingIncrement) // both null 1056fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fRoundingIncrement != NULL && 1057fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius other->fRoundingIncrement != NULL && 1058fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fRoundingIncrement == *other->fRoundingIncrement)) && 1059fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1060fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fRoundingMode == other->fRoundingMode && 106150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho getMultiplier() == other->getMultiplier() && 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize == other->fGroupingSize && 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 == other->fGroupingSize2 && 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown == other->fDecimalSeparatorAlwaysShown && 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation == other->fUseExponentialNotation && 1066fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (!fUseExponentialNotation || 1068fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fMinExponentDigits == other->fMinExponentDigits && fExponentSignAlwaysShown == other->fExponentSignAlwaysShown)) && 1069fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1070fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fBoolFlags.getAll() == other->fBoolFlags.getAll() && 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fSymbols == *(other->fSymbols) && 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseSignificantDigits == other->fUseSignificantDigits && 1073fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (!fUseSignificantDigits || 1075fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fMinSignificantDigits == other->fMinSignificantDigits && fMaxSignificantDigits == other->fMaxSignificantDigits)) && 1076fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1077fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatWidth == other->fFormatWidth && 1078fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPad == other->fPad && 1079fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition == other->fPadPosition && 1080fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1081fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fStyle != UNUM_CURRENCY_PLURAL || 1082fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fStyle == other->fStyle && fFormatPattern == other->fFormatPattern)) && 1083fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencySignCount == other->fCurrencySignCount && 1085fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1086b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((fCurrencyPluralInfo == other->fCurrencyPluralInfo && 1087b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo == NULL) || 1088b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (fCurrencyPluralInfo != NULL && other->fCurrencyPluralInfo != NULL && 1089fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fCurrencyPluralInfo == *(other->fCurrencyPluralInfo))) 1090fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1091fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // depending on other settings we may also need to compare 1092fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // fCurrencyChoice (mostly deprecated?), 1093fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // fAffixesForCurrency & fPluralAffixesForCurrency (only relevant in some cases) 1094fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ); 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormat* 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::clone() const 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new DecimalFormat(*this); 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 110559d709d503bab6e2b61931737e662dd293b40578ccornelius 110659d709d503bab6e2b61931737e662dd293b40578ccorneliusFixedDecimal 110759d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::getFixedDecimal(double number, UErrorCode &status) const { 110859d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal result; 110959d709d503bab6e2b61931737e662dd293b40578ccornelius 111059d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 111159d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 111259d709d503bab6e2b61931737e662dd293b40578ccornelius } 111359d709d503bab6e2b61931737e662dd293b40578ccornelius 111459d709d503bab6e2b61931737e662dd293b40578ccornelius if (uprv_isNaN(number) || uprv_isPositiveInfinity(fabs(number))) { 111559d709d503bab6e2b61931737e662dd293b40578ccornelius // For NaN and Infinity the state of the formatter is ignored. 111659d709d503bab6e2b61931737e662dd293b40578ccornelius result.init(number); 111759d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 111859d709d503bab6e2b61931737e662dd293b40578ccornelius } 111959d709d503bab6e2b61931737e662dd293b40578ccornelius 112059d709d503bab6e2b61931737e662dd293b40578ccornelius if (fMultiplier == NULL && fScale == 0 && fRoundingIncrement == 0 && areSignificantDigitsUsed() == FALSE && 112159d709d503bab6e2b61931737e662dd293b40578ccornelius result.quickInit(number) && result.visibleDecimalDigitCount <= getMaximumFractionDigits()) { 112259d709d503bab6e2b61931737e662dd293b40578ccornelius // Fast Path. Construction of an exact FixedDecimal directly from the double, without passing 112359d709d503bab6e2b61931737e662dd293b40578ccornelius // through a DigitList, was successful, and the formatter is doing nothing tricky with rounding. 112459d709d503bab6e2b61931737e662dd293b40578ccornelius // printf("getFixedDecimal(%g): taking fast path.\n", number); 112559d709d503bab6e2b61931737e662dd293b40578ccornelius result.adjustForMinFractionDigits(getMinimumFractionDigits()); 112659d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 112759d709d503bab6e2b61931737e662dd293b40578ccornelius // Slow path. Create a DigitList, and have this formatter round it according to the 112859d709d503bab6e2b61931737e662dd293b40578ccornelius // requirements of the format, and fill the fixedDecimal from that. 112959d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList digits; 113059d709d503bab6e2b61931737e662dd293b40578ccornelius digits.set(number); 113159d709d503bab6e2b61931737e662dd293b40578ccornelius result = getFixedDecimal(digits, status); 113259d709d503bab6e2b61931737e662dd293b40578ccornelius } 113359d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 113459d709d503bab6e2b61931737e662dd293b40578ccornelius} 113559d709d503bab6e2b61931737e662dd293b40578ccornelius 113659d709d503bab6e2b61931737e662dd293b40578ccornelius// MSVC optimizer bug? 113759d709d503bab6e2b61931737e662dd293b40578ccornelius// turn off optimization as it causes different behavior in the int64->double->int64 conversion 113859d709d503bab6e2b61931737e662dd293b40578ccornelius#if defined (_MSC_VER) 113959d709d503bab6e2b61931737e662dd293b40578ccornelius#pragma optimize ( "", off ) 114059d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 114159d709d503bab6e2b61931737e662dd293b40578ccorneliusFixedDecimal 114259d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::getFixedDecimal(const Formattable &number, UErrorCode &status) const { 114359d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 114459d709d503bab6e2b61931737e662dd293b40578ccornelius return FixedDecimal(); 114559d709d503bab6e2b61931737e662dd293b40578ccornelius } 114659d709d503bab6e2b61931737e662dd293b40578ccornelius if (!number.isNumeric()) { 114759d709d503bab6e2b61931737e662dd293b40578ccornelius status = U_ILLEGAL_ARGUMENT_ERROR; 114859d709d503bab6e2b61931737e662dd293b40578ccornelius return FixedDecimal(); 114959d709d503bab6e2b61931737e662dd293b40578ccornelius } 115059d709d503bab6e2b61931737e662dd293b40578ccornelius 115159d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList *dl = number.getDigitList(); 115259d709d503bab6e2b61931737e662dd293b40578ccornelius if (dl != NULL) { 115359d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList clonedDL(*dl); 115459d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(clonedDL, status); 115559d709d503bab6e2b61931737e662dd293b40578ccornelius } 115659d709d503bab6e2b61931737e662dd293b40578ccornelius 115759d709d503bab6e2b61931737e662dd293b40578ccornelius Formattable::Type type = number.getType(); 115859d709d503bab6e2b61931737e662dd293b40578ccornelius if (type == Formattable::kDouble || type == Formattable::kLong) { 115959d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(number.getDouble(status), status); 116059d709d503bab6e2b61931737e662dd293b40578ccornelius } 116159d709d503bab6e2b61931737e662dd293b40578ccornelius 116259d709d503bab6e2b61931737e662dd293b40578ccornelius if (type == Formattable::kInt64) { 116359d709d503bab6e2b61931737e662dd293b40578ccornelius // "volatile" here is a workaround to avoid optimization issues. 116459d709d503bab6e2b61931737e662dd293b40578ccornelius volatile double fdv = number.getDouble(status); 116559d709d503bab6e2b61931737e662dd293b40578ccornelius // Note: conversion of int64_t -> double rounds with some compilers to 116659d709d503bab6e2b61931737e662dd293b40578ccornelius // values beyond what can be represented as a 64 bit int. Subsequent 116759d709d503bab6e2b61931737e662dd293b40578ccornelius // testing or conversion with int64_t produces bad results. 116859d709d503bab6e2b61931737e662dd293b40578ccornelius // So filter the problematic values, route them to DigitList. 116959d709d503bab6e2b61931737e662dd293b40578ccornelius if (fdv != (double)U_INT64_MAX && fdv != (double)U_INT64_MIN && 117059d709d503bab6e2b61931737e662dd293b40578ccornelius number.getInt64() == (int64_t)fdv) { 117159d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(number.getDouble(status), status); 117259d709d503bab6e2b61931737e662dd293b40578ccornelius } 117359d709d503bab6e2b61931737e662dd293b40578ccornelius } 117459d709d503bab6e2b61931737e662dd293b40578ccornelius 117559d709d503bab6e2b61931737e662dd293b40578ccornelius // The only case left is type==int64_t, with a value with more digits than a double can represent. 117659d709d503bab6e2b61931737e662dd293b40578ccornelius // Any formattable originating as a big decimal will have had a pre-existing digit list. 117759d709d503bab6e2b61931737e662dd293b40578ccornelius // Any originating as a double or int32 will have been handled as a double. 117859d709d503bab6e2b61931737e662dd293b40578ccornelius 117959d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(type == Formattable::kInt64); 118059d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList digits; 118159d709d503bab6e2b61931737e662dd293b40578ccornelius digits.set(number.getInt64()); 118259d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(digits, status); 118359d709d503bab6e2b61931737e662dd293b40578ccornelius} 118459d709d503bab6e2b61931737e662dd293b40578ccornelius// end workaround MSVC optimizer bug 118559d709d503bab6e2b61931737e662dd293b40578ccornelius#if defined (_MSC_VER) 118659d709d503bab6e2b61931737e662dd293b40578ccornelius#pragma optimize ( "", on ) 118759d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 118859d709d503bab6e2b61931737e662dd293b40578ccornelius 118959d709d503bab6e2b61931737e662dd293b40578ccornelius 119059d709d503bab6e2b61931737e662dd293b40578ccornelius// Create a fixed decimal from a DigitList. 119159d709d503bab6e2b61931737e662dd293b40578ccornelius// The digit list may be modified. 119259d709d503bab6e2b61931737e662dd293b40578ccornelius// Internal function only. 119359d709d503bab6e2b61931737e662dd293b40578ccorneliusFixedDecimal 119459d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::getFixedDecimal(DigitList &number, UErrorCode &status) const { 119559d709d503bab6e2b61931737e662dd293b40578ccornelius // Round the number according to the requirements of this Format. 119659d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal result; 119759d709d503bab6e2b61931737e662dd293b40578ccornelius _round(number, number, result.isNegative, status); 119859d709d503bab6e2b61931737e662dd293b40578ccornelius 119959d709d503bab6e2b61931737e662dd293b40578ccornelius // The int64_t fields in FixedDecimal can easily overflow. 120059d709d503bab6e2b61931737e662dd293b40578ccornelius // In deciding what to discard in this event, consider that fixedDecimal 120159d709d503bab6e2b61931737e662dd293b40578ccornelius // is being used only with PluralRules, and those rules mostly look at least significant 120259d709d503bab6e2b61931737e662dd293b40578ccornelius // few digits of the integer part, and whether the fraction part is zero or not. 120359d709d503bab6e2b61931737e662dd293b40578ccornelius // 120459d709d503bab6e2b61931737e662dd293b40578ccornelius // So, in case of overflow when filling in the fields of the FixedDecimal object, 120559d709d503bab6e2b61931737e662dd293b40578ccornelius // for the integer part, discard the most significant digits. 120659d709d503bab6e2b61931737e662dd293b40578ccornelius // for the fraction part, discard the least significant digits, 120759d709d503bab6e2b61931737e662dd293b40578ccornelius // don't truncate the fraction value to zero. 120859d709d503bab6e2b61931737e662dd293b40578ccornelius // For simplicity, the int64_t fields are limited to 18 decimal digits, even 120959d709d503bab6e2b61931737e662dd293b40578ccornelius // though they could hold most (but not all) 19 digit values. 121059d709d503bab6e2b61931737e662dd293b40578ccornelius 121159d709d503bab6e2b61931737e662dd293b40578ccornelius // Integer Digits. 121259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t di = number.getDecimalAt()-18; // Take at most 18 digits. 121359d709d503bab6e2b61931737e662dd293b40578ccornelius if (di < 0) { 121459d709d503bab6e2b61931737e662dd293b40578ccornelius di = 0; 121559d709d503bab6e2b61931737e662dd293b40578ccornelius } 121659d709d503bab6e2b61931737e662dd293b40578ccornelius result.intValue = 0; 121759d709d503bab6e2b61931737e662dd293b40578ccornelius for (; di<number.getDecimalAt(); di++) { 121859d709d503bab6e2b61931737e662dd293b40578ccornelius result.intValue = result.intValue * 10 + (number.getDigit(di) & 0x0f); 121959d709d503bab6e2b61931737e662dd293b40578ccornelius } 122059d709d503bab6e2b61931737e662dd293b40578ccornelius if (result.intValue == 0 && number.getDecimalAt()-18 > 0) { 122159d709d503bab6e2b61931737e662dd293b40578ccornelius // The number is something like 100000000000000000000000. 122259d709d503bab6e2b61931737e662dd293b40578ccornelius // More than 18 digits integer digits, but the least significant 18 are all zero. 122359d709d503bab6e2b61931737e662dd293b40578ccornelius // We don't want to return zero as the int part, but want to keep zeros 122459d709d503bab6e2b61931737e662dd293b40578ccornelius // for several of the least significant digits. 122559d709d503bab6e2b61931737e662dd293b40578ccornelius result.intValue = 100000000000000000LL; 122659d709d503bab6e2b61931737e662dd293b40578ccornelius } 122759d709d503bab6e2b61931737e662dd293b40578ccornelius 122859d709d503bab6e2b61931737e662dd293b40578ccornelius // Fraction digits. 122959d709d503bab6e2b61931737e662dd293b40578ccornelius result.decimalDigits = result.decimalDigitsWithoutTrailingZeros = result.visibleDecimalDigitCount = 0; 123059d709d503bab6e2b61931737e662dd293b40578ccornelius for (di = number.getDecimalAt(); di < number.getCount(); di++) { 123159d709d503bab6e2b61931737e662dd293b40578ccornelius result.visibleDecimalDigitCount++; 123259d709d503bab6e2b61931737e662dd293b40578ccornelius if (result.decimalDigits < 100000000000000000LL) { 123359d709d503bab6e2b61931737e662dd293b40578ccornelius // 9223372036854775807 Largest 64 bit signed integer 123459d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t digitVal = number.getDigit(di) & 0x0f; // getDigit() returns a char, '0'-'9'. 123559d709d503bab6e2b61931737e662dd293b40578ccornelius result.decimalDigits = result.decimalDigits * 10 + digitVal; 123659d709d503bab6e2b61931737e662dd293b40578ccornelius if (digitVal > 0) { 123759d709d503bab6e2b61931737e662dd293b40578ccornelius result.decimalDigitsWithoutTrailingZeros = result.decimalDigits; 123859d709d503bab6e2b61931737e662dd293b40578ccornelius } 123959d709d503bab6e2b61931737e662dd293b40578ccornelius } 124059d709d503bab6e2b61931737e662dd293b40578ccornelius } 124159d709d503bab6e2b61931737e662dd293b40578ccornelius 124259d709d503bab6e2b61931737e662dd293b40578ccornelius result.hasIntegerValue = (result.decimalDigits == 0); 124359d709d503bab6e2b61931737e662dd293b40578ccornelius 124459d709d503bab6e2b61931737e662dd293b40578ccornelius // Trailing fraction zeros. The format specification may require more trailing 124559d709d503bab6e2b61931737e662dd293b40578ccornelius // zeros than the numeric value. Add any such on now. 124659d709d503bab6e2b61931737e662dd293b40578ccornelius 124759d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t minFractionDigits; 124859d709d503bab6e2b61931737e662dd293b40578ccornelius if (areSignificantDigitsUsed()) { 124959d709d503bab6e2b61931737e662dd293b40578ccornelius minFractionDigits = getMinimumSignificantDigits() - number.getDecimalAt(); 125059d709d503bab6e2b61931737e662dd293b40578ccornelius if (minFractionDigits < 0) { 125159d709d503bab6e2b61931737e662dd293b40578ccornelius minFractionDigits = 0; 125259d709d503bab6e2b61931737e662dd293b40578ccornelius } 125359d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 125459d709d503bab6e2b61931737e662dd293b40578ccornelius minFractionDigits = getMinimumFractionDigits(); 125559d709d503bab6e2b61931737e662dd293b40578ccornelius } 125659d709d503bab6e2b61931737e662dd293b40578ccornelius result.adjustForMinFractionDigits(minFractionDigits); 125759d709d503bab6e2b61931737e662dd293b40578ccornelius 125859d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 125959d709d503bab6e2b61931737e662dd293b40578ccornelius} 126059d709d503bab6e2b61931737e662dd293b40578ccornelius 126159d709d503bab6e2b61931737e662dd293b40578ccornelius 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 126350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::format(int32_t number, 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& appendTo, 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& fieldPosition) const 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return format((int64_t)number, appendTo, fieldPosition); 1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 127350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(int32_t number, 127450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 127554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPosition& fieldPosition, 127654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 127754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 127854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return format((int64_t)number, appendTo, fieldPosition, status); 127954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 128054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 128154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUnicodeString& 128254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat::format(int32_t number, 128354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString& appendTo, 128450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator* posIter, 128550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) const 128650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 128750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return format((int64_t)number, appendTo, posIter, status); 128850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 128950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1290103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1291103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 1292103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid DecimalFormat::handleChanged() { 1293103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatInternal &data = internalData(fReserved); 1294103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 129554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(data.fFastFormatStatus == kFastpathUNKNOWN || data.fFastParseStatus == kFastpathUNKNOWN) { 1296103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; // still constructing. Wait. 1297103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1298103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 129954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus = data.fFastFormatStatus = kFastpathNO; 1300103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 130154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 130254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(fParseAllInput == UNUM_NO) { 130354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: fParseAllInput==UNUM_NO"); 130454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else 130554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 130654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (fFormatWidth!=0) { 130754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: fFormatWidth"); 130854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fPositivePrefix.length()>0) { 130954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: positive prefix"); 131054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fPositiveSuffix.length()>0) { 131154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: positive suffix"); 131254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fNegativePrefix.length()>1 131354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius || ((fNegativePrefix.length()==1) && (fNegativePrefix.charAt(0)!=0x002D))) { 131454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: negative prefix that isn't '-'"); 131554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fNegativeSuffix.length()>0) { 131654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: negative suffix"); 131754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 131854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus = kFastpathYES; 131954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("parse fastpath: YES"); 132054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 132154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 132254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (fGroupingSize!=0 && isGroupingUsed()) { 132354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fGroupingSize!=0 and grouping is used"); 132454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#ifdef FMT_DEBUG 132554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("groupingsize=%d\n", fGroupingSize); 132654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 132754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fGroupingSize2!=0 && isGroupingUsed()) { 132854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fGroupingSize2!=0"); 1329103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fUseExponentialNotation) { 133054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fUseExponentialNotation"); 1331103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fFormatWidth!=0) { 133254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fFormatWidth!=0"); 1333103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fMinSignificantDigits!=1) { 133454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fMinSignificantDigits!=1"); 1335103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fMultiplier!=NULL) { 133654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fMultiplier!=NULL"); 13378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else if(fScale!=0) { 13388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius debug("No format fastpath: fScale!=0"); 1339103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(0x0030 != getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0)) { 134054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: 0x0030 != getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0)"); 1341103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fDecimalSeparatorAlwaysShown) { 134254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fDecimalSeparatorAlwaysShown"); 1343103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(getMinimumFractionDigits()>0) { 134454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fMinFractionDigits>0"); 134559d709d503bab6e2b61931737e662dd293b40578ccornelius } else if(fCurrencySignCount != fgCurrencySignCountZero) { 134659d709d503bab6e2b61931737e662dd293b40578ccornelius debug("No format fastpath: fCurrencySignCount != fgCurrencySignCountZero"); 134754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fRoundingIncrement!=0) { 134854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fRoundingIncrement!=0"); 1349103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 135054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastFormatStatus = kFastpathYES; 135154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("format:kFastpathYES!"); 1352103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 135354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 135454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1355103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 1356103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 135850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::format(int64_t number, 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& appendTo, 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& fieldPosition) const 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 136454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode status = U_ZERO_ERROR; /* ignored */ 136554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionOnlyHandler handler(fieldPosition); 136654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 136754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 136854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 136954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUnicodeString& 137054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat::format(int64_t number, 137154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString& appendTo, 137254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPosition& fieldPosition, 137354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 137454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 137554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionOnlyHandler handler(fieldPosition); 137654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 137750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 137950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 138050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(int64_t number, 138150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 138250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator* posIter, 138350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) const 138450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 138550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 138654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 138750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 139050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::_format(int64_t number, 139150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 139254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionHandler& handler, 139354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status) const 139450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 1395103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Bottleneck function for formatting int64_t 139654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_FAILURE(status)) { 139754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return appendTo; 139854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 1399103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1400103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 1401103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // const UnicodeString *posPrefix = fPosPrefixPattern; 1402103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // const UnicodeString *posSuffix = fPosSuffixPattern; 1403103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // const UnicodeString *negSuffix = fNegSuffixPattern; 1404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1405103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const DecimalFormatInternal &data = internalData(fReserved); 1406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1407103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 1408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius data.dump(); 1409103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("fastpath? [%d]\n", number); 1410103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1411103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 141254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if( data.fFastFormatStatus==kFastpathYES) { 1413103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1414103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define kZero 0x0030 1415103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const int32_t MAX_IDX = MAX_DIGITS+2; 1416103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar outputStr[MAX_IDX]; 1417103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t destIdx = MAX_IDX; 1418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputStr[--destIdx] = 0; // term 1419103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1420103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int64_t n = number; 1421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (number < 1) { 1422103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Negative numbers are slightly larger than positive 1423103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // output the first digit (or the leading zero) 1424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputStr[--destIdx] = (-(n % 10) + kZero); 1425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n /= -10; 1426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1427103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // get any remaining digits 1428103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while (n > 0) { 1429103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputStr[--destIdx] = (n % 10) + kZero; 1430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n /= 10; 1431103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1432103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1433103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1434103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Slide the number to the start of the output str 1435103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U_ASSERT(destIdx >= 0); 1436103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t length = MAX_IDX - destIdx -1; 143754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /*int32_t prefixLen = */ appendAffix(appendTo, number, handler, number<0, TRUE); 1438103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t maxIntDig = getMaximumIntegerDigits(); 143954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t destlength = length<=maxIntDig?length:maxIntDig; // dest length pinned to max int digits 144054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 144154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(length>maxIntDig && fBoolFlags.contains(UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)) { 144254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ILLEGAL_ARGUMENT_ERROR; 144354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 144454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 144554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t prependZero = getMinimumIntegerDigits() - destlength; 1446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 144854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("prependZero=%d, length=%d, minintdig=%d maxintdig=%d destlength=%d skip=%d\n", prependZero, length, getMinimumIntegerDigits(), maxIntDig, destlength, length-destlength); 1449103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1450103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t intBegin = appendTo.length(); 1451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while((prependZero--)>0) { 145354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius appendTo.append((UChar)0x0030); // '0' 1454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 145654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius appendTo.append(outputStr+destIdx+ 145754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (length-destlength), // skip any leading digits 145854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destlength); 1459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handler.addAttribute(kIntegerField, intBegin, appendTo.length()); 1460103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 146154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /*int32_t suffixLen =*/ appendAffix(appendTo, number, handler, number<0, FALSE); 1462103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1463103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius //outputStr[length]=0; 1464103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1465103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 1466103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("Writing [%s] length [%d] max %d for [%d]\n", outputStr+destIdx, length, MAX_IDX, number); 1467103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1468103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1469103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#undef kZero 1470103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1471103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return appendTo; 1472103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } // end fastpath 1473103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Else the slow way - via DigitList 147650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DigitList digits; 147750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.set(number); 147850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return _format(digits, appendTo, handler, status); 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 148050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::format( double number, 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& appendTo, 1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& fieldPosition) const 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 148854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode status = U_ZERO_ERROR; /* ignored */ 148954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionOnlyHandler handler(fieldPosition); 149054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 149154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 149254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 149354dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUnicodeString& 149454dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat::format( double number, 149554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString& appendTo, 149654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPosition& fieldPosition, 149754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 149854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 149950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionOnlyHandler handler(fieldPosition); 150054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 150150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 150450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format( double number, 150550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 150650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator* posIter, 150750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) const 150850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 150950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 151054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 151150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 151250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 151350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 151450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::_format( double number, 151550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 151654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionHandler& handler, 151754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status) const 151850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 151954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_FAILURE(status)) { 152054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return appendTo; 152154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Special case for NaN, sets the begin and end index to be the 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the string length of localized name of NaN. 152450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TODO: let NaNs go through DigitList. 1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_isNaN(number)) 1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 152750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int begin = appendTo.length(); 152850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho appendTo += getConstSymbol(DecimalFormatSymbols::kNaNSymbol); 152950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, begin, appendTo.length()); 153150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addPadding(appendTo, handler, 0, 0); 153350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 153450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 153550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DigitList digits; 153750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.set(number); 153850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(digits, appendTo, handler, status); 153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // No way to return status from here. 154050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 154150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 154250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 154750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(const StringPiece &number, 154850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString &toAppendTo, 154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator *posIter, 155050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &status) const 155150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 1552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 1553103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // don't bother if the int64 path is not optimized 1554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t len = number.length(); 1555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(len>0&&len<10) { /* 10 or more digits may not be an int64 */ 1557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char *data = number.data(); 1558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int64_t num = 0; 1559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool neg = FALSE; 1560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool ok = TRUE; 1561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t start = 0; 1563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(data[start]=='+') { 1565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius start++; 1566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(data[start]=='-') { 1567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius neg=TRUE; 1568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius start++; 1569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t place = 1; /* 1, 10, ... */ 1572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for(int32_t i=len-1;i>=start;i--) { 1573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(data[i]>='0'&&data[i]<='9') { 1574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius num+=place*(int64_t)(data[i]-'0'); 1575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ok=FALSE; 1577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius break; 1578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius place *= 10; 1580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(ok) { 1583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(neg) { 1584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius num = -num;// add minus bit 1585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // format as int64_t 1587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return format(num, toAppendTo, posIter, status); 1588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // else fall through 1590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 159350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DigitList dnum; 159450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dnum.set(number, status); 159550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 159650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return toAppendTo; 159750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 159850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 159950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(dnum, toAppendTo, handler, status); 160050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return toAppendTo; 160150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 160250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 160350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 160450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 160550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(const DigitList &number, 160650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString &appendTo, 160750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator *posIter, 160850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &status) const { 160950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 161050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(number, appendTo, handler, status); 161150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 161250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 161350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 161450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 161650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 161750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(const DigitList &number, 161850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 161950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPosition& pos, 162050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &status) const { 162150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionOnlyHandler handler(pos); 162250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(number, appendTo, handler, status); 162350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 162450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 162550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusDigitList& 16278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusDecimalFormat::_round(const DigitList &number, DigitList &adjustedNum, UBool& isNegative, UErrorCode &status) const { 16288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 163159d709d503bab6e2b61931737e662dd293b40578ccornelius 163259d709d503bab6e2b61931737e662dd293b40578ccornelius // note: number and adjustedNum may refer to the same DigitList, in cases where a copy 163359d709d503bab6e2b61931737e662dd293b40578ccornelius // is not needed by the caller. 163459d709d503bab6e2b61931737e662dd293b40578ccornelius 16358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius adjustedNum = number; 16368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius isNegative = false; 16378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (number.isNaN()) { 16388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1641c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Do this BEFORE checking to see if value is infinite or negative! Sets the 1642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // begin and end index to be length of the string composed of 1643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // localized name of Infinite and the positive/negative localized 1644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // signs. 1645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 164650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.setRoundingMode(fRoundingMode); 164750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier != NULL) { 164850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.mult(*fMultiplier, status); 16498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 165250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1653c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 16548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale != 0) { 16558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius DigitList ten; 165659d709d503bab6e2b61931737e662dd293b40578ccornelius ten.set((int32_t)10); 16578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale > 0) { 16588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale ; i > 0 ; i--) { 16598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius adjustedNum.mult(ten, status); 16608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 16658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale ; i < 0 ; i++) { 16668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius adjustedNum.div(ten, status); 16678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 16748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /* 167550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Note: sign is important for zero as well as non-zero numbers. 167650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Proper detection of -0.0 is needed to deal with the 1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * issues raised by bugs 4106658, 4106667, and 4147706. Liu 7/6/98. 1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 16798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius isNegative = !adjustedNum.isPositive(); 1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Apply rounding after multiplier 16828393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 1683b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho adjustedNum.fContext.status &= ~DEC_Inexact; 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fRoundingIncrement != NULL) { 168550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.div(*fRoundingIncrement, status); 168650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.toIntegralValue(); 168750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.mult(*fRoundingIncrement, status); 168850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.trim(); 16898393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16908393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1693b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fRoundingMode == kRoundUnnecessary && (adjustedNum.fContext.status & DEC_Inexact)) { 1694b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_FORMAT_INEXACT_ERROR; 16958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 1696b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 169850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (adjustedNum.isInfinite()) { 16998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 170227f654740f2a26ad62a5c155af9199af9e69b889claireho if (fUseExponentialNotation || areSignificantDigitsUsed()) { 170327f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t sigDigits = precision(); 170427f654740f2a26ad62a5c155af9199af9e69b889claireho if (sigDigits > 0) { 170527f654740f2a26ad62a5c155af9199af9e69b889claireho adjustedNum.round(sigDigits); 1706fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // Travis Keep (21/2/2014): Calling round on a digitList does not necessarily 1707fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // preserve the sign of that digit list. Preserving the sign is especially 1708fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // important when formatting -0.0 for instance. Not preserving the sign seems 1709fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // like a bug because I cannot think of any case where the sign would actually 1710fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // have to change when rounding. For now, we preserve the sign by setting the 1711fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // positive attribute directly. 1712fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius adjustedNum.setPositive(!isNegative); 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 171427f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 171527f654740f2a26ad62a5c155af9199af9e69b889claireho // Fixed point format. Round to a set number of fraction digits. 171627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t numFractionDigits = precision(); 171727f654740f2a26ad62a5c155af9199af9e69b889claireho adjustedNum.roundFixedPoint(numFractionDigits); 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fRoundingMode == kRoundUnnecessary && (adjustedNum.fContext.status & DEC_Inexact)) { 1720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_FORMAT_INEXACT_ERROR; 17218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 17228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 17248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 17258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUnicodeString& 17278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusDecimalFormat::_format(const DigitList &number, 17288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UnicodeString& appendTo, 17298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius FieldPositionHandler& handler, 17308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode &status) const 17318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{ 17328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 17338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return appendTo; 17348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // Special case for NaN, sets the begin and end index to be the 17378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // the string length of localized name of NaN. 17388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (number.isNaN()) 17398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius { 17408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int begin = appendTo.length(); 17418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius appendTo += getConstSymbol(DecimalFormatSymbols::kNaNSymbol); 17428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius handler.addAttribute(kIntegerField, begin, appendTo.length()); 17448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius addPadding(appendTo, handler, 0, 0); 17468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return appendTo; 17478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius DigitList adjustedNum; 17508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UBool isNegative; 17518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius _round(number, adjustedNum, isNegative, status); 17528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 17538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return appendTo; 17548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // Special case for INFINITE, 17578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (adjustedNum.isInfinite()) { 17588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int32_t prefixLen = appendAffix(appendTo, adjustedNum.getDouble(), handler, isNegative, TRUE); 17598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int begin = appendTo.length(); 17618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius appendTo += getConstSymbol(DecimalFormatSymbols::kInfinitySymbol); 17628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius handler.addAttribute(kIntegerField, begin, appendTo.length()); 17648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int32_t suffixLen = appendAffix(appendTo, adjustedNum.getDouble(), handler, isNegative, FALSE); 17668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius addPadding(appendTo, handler, prefixLen, suffixLen); 1768b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return appendTo; 1769b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 177054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return subformat(appendTo, handler, adjustedNum, FALSE, status); 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return true if a grouping separator belongs at the given 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * position, based on whether grouping is in use and the values of 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the primary and secondary grouping interval. 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos the number of integer digits to the right of 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the current position. Zero indicates the position after the 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * rightmost integer digit. 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return true if a grouping character belongs at the current 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * position. 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool DecimalFormat::isGroupingPosition(int32_t pos) const { 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result = FALSE; 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isGroupingUsed() && (pos > 0) && (fGroupingSize > 0)) { 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((fGroupingSize2 > 0) && (pos > fGroupingSize)) { 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ((pos - fGroupingSize) % fGroupingSize2) == 0; 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = pos % fGroupingSize == 0; 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 179850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Complete the formatting of a finite number. On entry, the DigitList must 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * be filled in with the correct digits. 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::subformat(UnicodeString& appendTo, 180350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 1804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DigitList& digits, 180554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool isInteger, 180654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 180827f654740f2a26ad62a5c155af9199af9e69b889claireho // char zero = '0'; 180927f654740f2a26ad62a5c155af9199af9e69b889claireho // DigitList returns digits as '0' thru '9', so we will need to 181027f654740f2a26ad62a5c155af9199af9e69b889claireho // always need to subtract the character 0 to get the numeric value to use for indexing. 181127f654740f2a26ad62a5c155af9199af9e69b889claireho 181227f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 localizedDigits[10]; 181327f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[0] = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); 181427f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[1] = getConstSymbol(DecimalFormatSymbols::kOneDigitSymbol).char32At(0); 181527f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[2] = getConstSymbol(DecimalFormatSymbols::kTwoDigitSymbol).char32At(0); 181627f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[3] = getConstSymbol(DecimalFormatSymbols::kThreeDigitSymbol).char32At(0); 181727f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[4] = getConstSymbol(DecimalFormatSymbols::kFourDigitSymbol).char32At(0); 181827f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[5] = getConstSymbol(DecimalFormatSymbols::kFiveDigitSymbol).char32At(0); 181927f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[6] = getConstSymbol(DecimalFormatSymbols::kSixDigitSymbol).char32At(0); 182027f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[7] = getConstSymbol(DecimalFormatSymbols::kSevenDigitSymbol).char32At(0); 182127f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[8] = getConstSymbol(DecimalFormatSymbols::kEightDigitSymbol).char32At(0); 182227f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[9] = getConstSymbol(DecimalFormatSymbols::kNineDigitSymbol).char32At(0); 182327f654740f2a26ad62a5c155af9199af9e69b889claireho 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *grouping ; 182559d709d503bab6e2b61931737e662dd293b40578ccornelius if(fCurrencySignCount == fgCurrencySignCountZero) { 1826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru grouping = &getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol); 182759d709d503bab6e2b61931737e662dd293b40578ccornelius }else{ 182859d709d503bab6e2b61931737e662dd293b40578ccornelius grouping = &getConstSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol); 1829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *decimal; 183159d709d503bab6e2b61931737e662dd293b40578ccornelius if(fCurrencySignCount == fgCurrencySignCountZero) { 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decimal = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 183359d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 183459d709d503bab6e2b61931737e662dd293b40578ccornelius decimal = &getConstSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool useSigDig = areSignificantDigitsUsed(); 1837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxIntDig = getMaximumIntegerDigits(); 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minIntDig = getMinimumIntegerDigits(); 1839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Appends the prefix. 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double doubleValue = digits.getDouble(); 184250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t prefixLen = appendAffix(appendTo, doubleValue, handler, !digits.isPositive(), TRUE); 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation) 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 184650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int currentLength = appendTo.length(); 184750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int intBegin = currentLength; 184850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int intEnd = -1; 184950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int fracBegin = -1; 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minFracDig = 0; 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxIntDig = minIntDig = 1; 1854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minFracDig = getMinimumSignificantDigits() - 1; 1855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minFracDig = getMinimumFractionDigits(); 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig > kMaxScientificIntegerDigits) { 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxIntDig = 1; 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig < minIntDig) { 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxIntDig = minIntDig; 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig > minIntDig) { 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minIntDig = 1; 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Minimum integer digits are handled in exponential format by 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // adjusting the exponent. For example, 0.01234 with 3 minimum 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // integer digits is "123.4E-4". 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Maximum integer digits are interpreted as indicating the 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // repeating range. This is useful for engineering notation, in 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // which the exponent is restricted to a multiple of 3. For 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // example, 0.01234 with 3 maximum integer digits is "12.34e-3". 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If maximum integer digits are defined and are larger than 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // minimum integer digits, then minimum integer digits are 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ignored. 187950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.reduce(); // Removes trailing zero digits. 188050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t exponent = digits.getDecimalAt(); 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig > 1 && maxIntDig != minIntDig) { 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A exponent increment is defined; adjust to it. 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent = (exponent > 0) ? (exponent - 1) / maxIntDig 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : (exponent / maxIntDig) - 1; 1885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent *= maxIntDig; 1886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // No exponent increment is defined; use minimum integer digits. 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If none is specified, as in "#E0", generate 1 integer digit. 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent -= (minIntDig > 0 || minFracDig > 0) 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? minIntDig : 1; 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We now output a minimum number of digits, and more if there 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // are more digits, up to the maximum number of digits. We 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // place the decimal point after the "integer" digits, which 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // are the first (decimalAt - exponent) digits. 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minimumDigits = minIntDig + minFracDig; 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The number of integer digits is handled specially if the number 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is zero, since then there may be no digits. 1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t integerDigits = digits.isZero() ? minIntDig : 190150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.getDecimalAt() - exponent; 190250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t totalDigits = digits.getCount(); 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (minimumDigits > totalDigits) 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru totalDigits = minimumDigits; 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (integerDigits > totalDigits) 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru totalDigits = integerDigits; 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // totalDigits records total number of digits needs to be processed 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<totalDigits; ++i) 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i == integerDigits) 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 191450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho intEnd = appendTo.length(); 191550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, intBegin, intEnd); 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += *decimal; 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 191950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fracBegin = appendTo.length(); 192050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kDecimalSeparatorField, fracBegin - 1, fracBegin); 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Restores the digit character or pads the buffer with zeros. 192350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar32 c = (UChar32)((i < digits.getCount()) ? 192427f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[digits.getDigitValue(i)] : 192527f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[0]); 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 192950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 193050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (intEnd < 0) { 193250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, intBegin, currentLength); 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 193450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fracBegin > 0) { 193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kFractionField, fracBegin, currentLength); 1936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The exponent is output using the pattern-specified minimum 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // exponent digits. There is no maximum limit to the exponent 1940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // digits, since truncating the exponent would appendTo in an 1941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unacceptable inaccuracy. 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentSymbolField, currentLength, appendTo.length()); 194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // For zero values, we force the exponent to zero. We 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // must do this here, and not earlier, because the value 1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is used to determine integer digit count above. 1950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (digits.isZero()) 1951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent = 0; 1952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exponent < 0) { 1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentSignField, currentLength, appendTo.length()); 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (fExponentSignAlwaysShown) { 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentSignField, currentLength, appendTo.length()); 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DigitList expDigits; 1964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expDigits.set(exponent); 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int expDig = fMinExponentDigits; 1967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation && expDig < 1) { 1968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expDig = 1; 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i=expDigits.getDecimalAt(); i<expDig; ++i) 197127f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += (localizedDigits[0]); 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i=0; i<expDigits.getDecimalAt(); ++i) 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 197550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar32 c = (UChar32)((i < expDigits.getCount()) ? 197627f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[expDigits.getDigitValue(i)] : 197727f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[0]); 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 198050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 198150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentField, currentLength, appendTo.length()); 1982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else // Not using exponential notation 1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 198550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int currentLength = appendTo.length(); 198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int intBegin = currentLength; 1987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sigCount = 0; 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minSigDig = getMinimumSignificantDigits(); 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxSigDig = getMaximumSignificantDigits(); 1991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!useSigDig) { 1992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minSigDig = 0; 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxSigDig = INT32_MAX; 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output the integer portion. Here 'count' is the total 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // number of integer digits we will display, including both 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // leading zeros required to satisfy getMinimumIntegerDigits, 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // and actual digits present in the number. 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = useSigDig ? 200150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _max(1, digits.getDecimalAt()) : minIntDig; 200250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digits.getDecimalAt() > 0 && count < digits.getDecimalAt()) { 200350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho count = digits.getDecimalAt(); 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle the case where getMaximumIntegerDigits() is smaller 2007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // than the real number of integer digits. If this is so, we 2008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // output the least significant max integer digits. For example, 2009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the value 1997 printed with 2 max integer digits is just "97". 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digitIndex = 0; // Index into digitList.fDigits[] 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (count > maxIntDig && maxIntDig >= 0) { 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = maxIntDig; 201450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digitIndex = digits.getDecimalAt() - count; 201554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(fBoolFlags.contains(UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)) { 201654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ILLEGAL_ARGUMENT_ERROR; 201754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sizeBeforeIntegerPart = appendTo.length(); 2021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 2023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=count-1; i>=0; --i) 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 202550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (i < digits.getDecimalAt() && digitIndex < digits.getCount() && 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sigCount < maxSigDig) { 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a real digit 202827f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += (UChar32)localizedDigits[digits.getDigitValue(digitIndex++)]; 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++sigCount; 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a zero (leading or trailing) 203427f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sigCount > 0) { 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++sigCount; 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output grouping separator if necessary. 2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isGroupingPosition(i)) { 204250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(*grouping); 204450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kGroupingSeparatorField, currentLength, appendTo.length()); 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 204859d709d503bab6e2b61931737e662dd293b40578ccornelius // This handles the special case of formatting 0. For zero only, we count the 204959d709d503bab6e2b61931737e662dd293b40578ccornelius // zero to the left of the decimal point as one signficant digit. Ordinarily we 205059d709d503bab6e2b61931737e662dd293b40578ccornelius // do not count any leading 0's as significant. If the number we are formatting 205159d709d503bab6e2b61931737e662dd293b40578ccornelius // is not zero, then either sigCount or digits.getCount() will be non-zero. 205259d709d503bab6e2b61931737e662dd293b40578ccornelius if (sigCount == 0 && digits.getCount() == 0) { 205359d709d503bab6e2b61931737e662dd293b40578ccornelius sigCount = 1; 205459d709d503bab6e2b61931737e662dd293b40578ccornelius } 205559d709d503bab6e2b61931737e662dd293b40578ccornelius 205650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TODO(dlf): this looks like it was a bug, we marked the int field as ending 205750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // before the zero was generated. 2058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Record field information for caller. 205950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if (fieldPosition.getField() == NumberFormat::kIntegerField) 206050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // fieldPosition.setEndIndex(appendTo.length()); 2061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Determine whether or not there are any printable fractional 2063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // digits. If we've used up the digits we know there aren't. 206450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool fractionPresent = (!isInteger && digitIndex < digits.getCount()) || 2065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (useSigDig ? (sigCount < minSigDig) : (getMinimumFractionDigits() > 0)); 2066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If there is no fraction present, and we haven't printed any 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // integer digits, then print a zero. Otherwise we won't print 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // _any_ digits, and we won't be able to parse this string. 2070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!fractionPresent && appendTo.length() == sizeBeforeIntegerPart) 207127f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 207350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 207450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, intBegin, currentLength); 207550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output the decimal separator if we always do so. 207750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fDecimalSeparatorAlwaysShown || fractionPresent) { 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += *decimal; 207950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kDecimalSeparatorField, currentLength, appendTo.length()); 208050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 208150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 208350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int fracBegin = currentLength; 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = useSigDig ? INT32_MAX : getMaximumFractionDigits(); 2086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig && (sigCount == maxSigDig || 208750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (sigCount >= minSigDig && digitIndex == digits.getCount()))) { 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = 0; 2089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i < count; ++i) { 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Here is where we escape from the loop. We escape 2093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // if we've output the maximum fraction digits 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (specified in the for expression above). We also 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // stop when we've output the minimum digits and 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // either: we have an integer, so there is no 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // fractional stuff to display, or we're out of 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // significant digits. 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!useSigDig && i >= getMinimumFractionDigits() && 210050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (isInteger || digitIndex >= digits.getCount())) { 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output leading fractional zeros. These are zeros 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that come after the decimal but before any 2106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // significant digits. These are only output if 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // abs(number being formatted) < 1.0. 210850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (-1-i > (digits.getDecimalAt()-1)) { 210927f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a digit, if we have any precision left, or a 2114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // zero if we don't. We don't want to output noise digits. 211550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!isInteger && digitIndex < digits.getCount()) { 211627f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += (UChar32)localizedDigits[digits.getDigitValue(digitIndex++)]; 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 211827f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we reach the maximum number of significant 2122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // digits, or if we output all the real digits and 2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // reach the minimum, then we are done. 2124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++sigCount; 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig && 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (sigCount == maxSigDig || 212750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (digitIndex == digits.getCount() && sigCount >= minSigDig))) { 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kFractionField, fracBegin, appendTo.length()); 2133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t suffixLen = appendAffix(appendTo, doubleValue, handler, !digits.isPositive(), FALSE); 2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addPadding(appendTo, handler, prefixLen, suffixLen); 2138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return appendTo; 2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Inserts the character fPad as needed to expand result to fFormatWidth. 2143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param result the string to be padded 2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::addPadding(UnicodeString& appendTo, 214650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prefixLen, 2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t suffixLen) const 2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0) { 2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = fFormatWidth - appendTo.length(); 2152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (len > 0) { 2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString padding; 2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<len; ++i) { 2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padding += fPad; 2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (fPadPosition) { 2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadAfterPrefix: 2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.insert(prefixLen, padding); 2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadBeforePrefix: 2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.insert(0, padding); 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadBeforeSuffix: 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.insert(appendTo.length() - suffixLen, padding); 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadAfterSuffix: 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += padding; 2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 217150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fPadPosition == kPadBeforePrefix || fPadPosition == kPadAfterPrefix) { 217250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.shiftLast(len); 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 217950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::parse(const UnicodeString& text, 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable& result, 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition& parsePosition) const { 2184103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parse(text, result, parsePosition, NULL); 2185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2187103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, 2188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ParsePosition& pos) const { 2189103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Formattable parseResult; 2190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t start = pos.getIndex(); 21918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UChar curbuf[4] = {}; 2192103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parse(text, parseResult, pos, curbuf); 2193103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (pos.getIndex() != start) { 2194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode ec = U_ZERO_ERROR; 2195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius LocalPointer<CurrencyAmount> currAmt(new CurrencyAmount(parseResult, curbuf, ec)); 2196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(ec)) { 2197103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pos.setIndex(start); // indicate failure 2198103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return currAmt.orphan(); 2200103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2201103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2202103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 2203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2206103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Parses the given text as a number, optionally providing a currency amount. 2207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param text the string to parse 2208103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @param result output parameter for the numeric result. 2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param parsePosition input-output position; on input, the 2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * position within text to match; must have 0 <= pos.getIndex() < 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * text.length(); on output, the position after the last matched 2212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character. If the parse fails, the position in unchanged upon 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * output. 2214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @param currency if non-NULL, it should point to a 4-UChar buffer. 2215103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * In this case the text is parsed as a currency format, and the 2216103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * ISO 4217 code for the parsed currency is put into the buffer. 2217103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Otherwise the text is parsed as a non-currency format. 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::parse(const UnicodeString& text, 2220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable& result, 2221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition& parsePosition, 2222103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar* currency) const { 2223103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t startIdx, backup; 2224103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t i = startIdx = backup = parsePosition.getIndex(); 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 222650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // clear any old contents in the result. In particular, clears any DigitList 222750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // that it may be holding. 222850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result.setLong(0); 222959d709d503bab6e2b61931737e662dd293b40578ccornelius if (currency != NULL) { 223059d709d503bab6e2b61931737e662dd293b40578ccornelius for (int32_t ci=0; ci<4; ci++) { 223159d709d503bab6e2b61931737e662dd293b40578ccornelius currency[ci] = 0; 223259d709d503bab6e2b61931737e662dd293b40578ccornelius } 223359d709d503bab6e2b61931737e662dd293b40578ccornelius } 223450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle NaN as a special case: 223650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Skip padding characters, if around prefix 2238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && (fPadPosition == kPadBeforePrefix || 2239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition == kPadAfterPrefix)) { 2240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = skipPadding(text, i); 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (isLenient()) { 2244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // skip any leading whitespace 2245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho i = backup = skipUWhiteSpace(text, i); 2246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the text is composed of the representation of NaN, returns NaN.length 2249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *nan = &getConstSymbol(DecimalFormatSymbols::kNaNSymbol); 2250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nanLen = (text.compare(i, nan->length(), *nan) 2251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? 0 : nan->length()); 2252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nanLen) { 2253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += nanLen; 2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && (fPadPosition == kPadBeforeSuffix || 2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition == kPadAfterSuffix)) { 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = skipPadding(text, i); 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setIndex(i); 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.setDouble(uprv_getNaN()); 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 226250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NaN parse failed; start over 2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = backup; 2265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsePosition.setIndex(i); 2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // status is used to record whether a number is infinite. 2268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool status[fgStatusLength]; 2269103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2270103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DigitList *digits = result.getInternalDigitList(); // get one from the stack buffer 227150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digits == NULL) { 227250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; // no way to report error from here. 227350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 227559d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 227650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!parseForCurrency(text, parsePosition, *digits, 2277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status, currency)) { 2278103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 2279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 228150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!subparse(text, 2282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegPrefixPattern, fNegSuffixPattern, 2283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPosPrefixPattern, fPosSuffixPattern, 2284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru FALSE, UCURR_SYMBOL_NAME, 228550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsePosition, *digits, status, currency)) { 2286103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("!subparse(...) - rewind"); 2287103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsePosition.setIndex(startIdx); 2288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 2289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle infinity 2293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status[fgStatusInfinite]) { 2294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double inf = uprv_getInfinity(); 229550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result.setDouble(digits->isPositive() ? inf : -inf); 2296103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // TODO: set the dl to infinity, and let it fall into the code below. 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier != NULL) { 230250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode ec = U_ZERO_ERROR; 230350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits->div(*fMultiplier, ec); 2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 230550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 23068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale != 0) { 23078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius DigitList ten; 230859d709d503bab6e2b61931737e662dd293b40578ccornelius ten.set((int32_t)10); 23098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale > 0) { 23108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale; i > 0; i--) { 23118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode ec = U_ZERO_ERROR; 23128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius digits->div(ten,ec); 23138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 23158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale; i < 0; i++) { 23168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode ec = U_ZERO_ERROR; 23178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius digits->mult(ten,ec); 23188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 232250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Negative zero special case: 232350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if parsing integerOnly, change to +0, which goes into an int32 in a Formattable. 232450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if not parsing integerOnly, leave as -0, which a double can represent. 232550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digits->isZero() && !digits->isPositive() && isParseIntegerOnly()) { 232650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits->setPositive(TRUE); 2327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 232850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result.adoptDigitList(digits); 2329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2334b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUBool 2335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::parseForCurrency(const UnicodeString& text, 2336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition& parsePosition, 2337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList& digits, 2338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool* status, 2339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar* currency) const { 2340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int origPos = parsePosition.getIndex(); 2341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int maxPosIndex = origPos; 2342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int maxErrorPos = -1; 2343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // First, parse against current pattern. 2344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Since current pattern could be set by applyPattern(), 2345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // it could be an arbitrary pattern, and it may not be the one 2346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // defined in current locale. 2347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool tmpStatus[fgStatusLength]; 2348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition tmpPos(origPos); 2349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList tmpDigitList; 2350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool found; 2351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 235250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho found = subparse(text, 2353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegPrefixPattern, fNegSuffixPattern, 2354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPosPrefixPattern, fPosSuffixPattern, 2355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TRUE, UCURR_LONG_NAME, 2356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos, tmpDigitList, tmpStatus, currency); 2357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 235850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho found = subparse(text, 2359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegPrefixPattern, fNegSuffixPattern, 2360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPosPrefixPattern, fPosSuffixPattern, 2361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TRUE, UCURR_SYMBOL_NAME, 2362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos, tmpDigitList, tmpStatus, currency); 2363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (found) { 2365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tmpPos.getIndex() > maxPosIndex) { 2366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxPosIndex = tmpPos.getIndex(); 2367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < fgStatusLength; ++i) { 2368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status[i] = tmpStatus[i]; 2369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru digits = tmpDigitList; 2371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxErrorPos = tmpPos.getErrorIndex(); 2374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Then, parse against affix patterns. 2376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Those are currency patterns and currency plural patterns. 2377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t pos = -1; 2378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 2379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = fAffixPatternsForCurrency->nextElement(pos)) != NULL ) { 2380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 2381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixPatternsForCurrency* affixPtn = (AffixPatternsForCurrency*)valueTok.pointer; 2382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool tmpStatus[fgStatusLength]; 2383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition tmpPos(origPos); 2384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList tmpDigitList; 238559d709d503bab6e2b61931737e662dd293b40578ccornelius 238659d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 238759d709d503bab6e2b61931737e662dd293b40578ccornelius debug("trying affix for currency.."); 238859d709d503bab6e2b61931737e662dd293b40578ccornelius affixPtn->dump(); 238959d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 239059d709d503bab6e2b61931737e662dd293b40578ccornelius 239150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result = subparse(text, 2392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &affixPtn->negPrefixPatternForCurrency, 239350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &affixPtn->negSuffixPatternForCurrency, 239450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &affixPtn->posPrefixPatternForCurrency, 2395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &affixPtn->posSuffixPatternForCurrency, 2396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TRUE, affixPtn->patternType, 2397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos, tmpDigitList, tmpStatus, currency); 2398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (result) { 2399b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru found = true; 2400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tmpPos.getIndex() > maxPosIndex) { 2401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxPosIndex = tmpPos.getIndex(); 2402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < fgStatusLength; ++i) { 2403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status[i] = tmpStatus[i]; 2404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru digits = tmpDigitList; 2406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxErrorPos = (tmpPos.getErrorIndex() > maxErrorPos) ? 2409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos.getErrorIndex() : maxErrorPos; 2410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Finally, parse against simple affix to find the match. 2413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // For example, in TestMonster suite, 2414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // if the to-be-parsed text is "-\u00A40,00". 2415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // complexAffixCompare will not find match, 2416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // since there is no ISO code matches "\u00A4", 2417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // and the parse stops at "\u00A4". 2418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // We will just use simple affix comparison (look for exact match) 2419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // to pass it. 242059d709d503bab6e2b61931737e662dd293b40578ccornelius // 242159d709d503bab6e2b61931737e662dd293b40578ccornelius // TODO: We should parse against simple affix first when 242259d709d503bab6e2b61931737e662dd293b40578ccornelius // output currency is not requested. After the complex currency 242359d709d503bab6e2b61931737e662dd293b40578ccornelius // parsing implementation was introduced, the default currency 242459d709d503bab6e2b61931737e662dd293b40578ccornelius // instance parsing slowed down because of the new code flow. 242559d709d503bab6e2b61931737e662dd293b40578ccornelius // I filed #10312 - Yoshito 2426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool tmpStatus_2[fgStatusLength]; 2427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition tmpPos_2(origPos); 2428b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList tmpDigitList_2; 242959d709d503bab6e2b61931737e662dd293b40578ccornelius 243059d709d503bab6e2b61931737e662dd293b40578ccornelius // Disable complex currency parsing and try it again. 243150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result = subparse(text, 2432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &fNegativePrefix, &fNegativeSuffix, 2433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &fPositivePrefix, &fPositiveSuffix, 243459d709d503bab6e2b61931737e662dd293b40578ccornelius FALSE /* disable complex currency parsing */, UCURR_SYMBOL_NAME, 243550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho tmpPos_2, tmpDigitList_2, tmpStatus_2, 2436b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru currency); 2437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (result) { 2438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tmpPos_2.getIndex() > maxPosIndex) { 2439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxPosIndex = tmpPos_2.getIndex(); 2440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < fgStatusLength; ++i) { 2441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status[i] = tmpStatus_2[i]; 2442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru digits = tmpDigitList_2; 2444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru found = true; 2446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxErrorPos = (tmpPos_2.getErrorIndex() > maxErrorPos) ? 2448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos_2.getErrorIndex() : maxErrorPos; 2449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (!found) { 2452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru //parsePosition.setIndex(origPos); 2453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parsePosition.setErrorIndex(maxErrorPos); 2454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parsePosition.setIndex(maxPosIndex); 2456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parsePosition.setErrorIndex(-1); 2457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return found; 2459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 2460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Parse the given text into a number. The text is parsed beginning at 2464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * parsePosition, until an unparseable character is seen. 2465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param text the string to parse. 2466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param negPrefix negative prefix. 2467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param negSuffix negative suffix. 2468b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param posPrefix positive prefix. 2469b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param posSuffix positive suffix. 247059d709d503bab6e2b61931737e662dd293b40578ccornelius * @param complexCurrencyParsing whether it is complex currency parsing or not. 2471b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param type the currency type to parse against, LONG_NAME only or not. 2472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param parsePosition The position at which to being parsing. Upon 2473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * return, the first unparsed character. 2474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param digits the DigitList to set to the parsed value. 2475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param status output param containing boolean status flags indicating 2476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * whether the value was infinite and whether it was positive. 2477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param currency return value for parsed currency, for generic 2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, or NULL for normal parsing. In generic 2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, any currency is parsed, not just the 2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency that this formatter is set to. 2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 248250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUBool DecimalFormat::subparse(const UnicodeString& text, 2483b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* negPrefix, 2484b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* negSuffix, 2485b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* posPrefix, 2486b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* posSuffix, 248759d709d503bab6e2b61931737e662dd293b40578ccornelius UBool complexCurrencyParsing, 2488b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int8_t type, 2489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition& parsePosition, 2490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DigitList& digits, UBool* status, 2491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* currency) const 2492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 249350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // The parsing process builds up the number as char string, in the neutral format that 249450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // will be acceptable to the decNumber library, then at the end passes that string 249550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // off for conversion to a decNumber. 249650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode err = U_ZERO_ERROR; 249727f654740f2a26ad62a5c155af9199af9e69b889claireho CharString parsedNum; 249850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.setToZero(); 249950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t position = parsePosition.getIndex(); 2501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t oldStart = position; 2502103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t textLength = text.length(); // One less pointer to follow 2503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool strictParse = !isLenient(); 2504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 zero = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); 250559d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeString *groupingString = &getConstSymbol(fCurrencySignCount == fgCurrencySignCountZero ? 250659d709d503bab6e2b61931737e662dd293b40578ccornelius DecimalFormatSymbols::kGroupingSeparatorSymbol : DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol); 250754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar32 groupingChar = groupingString->char32At(0); 250854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t groupingStringLength = groupingString->length(); 250954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t groupingCharLength = U16_LENGTH(groupingChar); 251054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool groupingUsed = isGroupingUsed(); 2511103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2512103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar dbgbuf[300]; 2513103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString s(dbgbuf,0,300);; 2514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius s.append((UnicodeString)"PARSE \"").append(text.tempSubString(position)).append((UnicodeString)"\" " ); 251554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#define DBGAPPD(x) if(x) { s.append(UnicodeString(#x "=")); if(x->isEmpty()) { s.append(UnicodeString("<empty>")); } else { s.append(*x); } s.append(UnicodeString(" ")); } else { s.append(UnicodeString(#x "=NULL ")); } 2516103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(negPrefix); 2517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(negSuffix); 2518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(posPrefix); 2519103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(posSuffix); 2520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debugout(s); 252154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("currencyParsing=%d, fFormatWidth=%d, isParseIntegerOnly=%c text.length=%d negPrefLen=%d\n", currencyParsing, fFormatWidth, (isParseIntegerOnly())?'Y':'N', text.length(), negPrefix!=NULL?negPrefix->length():-1); 2522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool fastParseOk = false; /* TRUE iff fast parse is OK */ 25258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // UBool fastParseHadDecimal = FALSE; /* true if fast parse saw a decimal point. */ 252654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const DecimalFormatInternal &data = internalData(fReserved); 252754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if((data.fFastParseStatus==kFastpathYES) && 252859d709d503bab6e2b61931737e662dd293b40578ccornelius fCurrencySignCount == fgCurrencySignCountZero && 252954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (negPrefix!=NULL&&negPrefix->isEmpty()) || 253054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius text.length()>0 && 253154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius text.length()<32 && 253254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (posPrefix==NULL||posPrefix->isEmpty()) && 253354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (posSuffix==NULL||posSuffix->isEmpty()) && 253454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (negPrefix==NULL||negPrefix->isEmpty()) && 253554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (negSuffix==NULL||(negSuffix->isEmpty()) ) && 253654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius TRUE) { // optimized path 2537103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int j=position; 2538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int l=text.length(); 2539103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int digitCount=0; 2540103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 ch = text.char32At(j); 2541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UnicodeString *decimalString = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 2542103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 decimalChar = 0; 254354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool intOnly = FALSE; 254454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar32 lookForGroup = (groupingUsed&&intOnly&&strictParse)?groupingChar:0; 254554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 2546103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t decimalCount = decimalString->countChar32(0,3); 2547103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(isParseIntegerOnly()) { 2548103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius decimalChar = 0; // not allowed 254954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius intOnly = TRUE; // Don't look for decimals. 2550103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(decimalCount==1) { 255154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius decimalChar = decimalString->char32At(0); // Look for this decimal 2552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(decimalCount==0) { 255354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius decimalChar=0; // NO decimal set 2554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 255554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius j=l+1;//Set counter to end of line, so that we break. Unknown decimal situation. 2556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 255854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#ifdef FMT_DEBUG 255954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("Preparing to do fastpath parse: decimalChar=U+%04X, groupingChar=U+%04X, first ch=U+%04X intOnly=%c strictParse=%c\n", 256054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius decimalChar, groupingChar, ch, 256154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (intOnly)?'y':'n', 256254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (strictParse)?'y':'n'); 256354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 256454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(ch==0x002D) { // '-' 256554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius j=l+1;//=break - negative number. 2566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 2568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append('-',err); 2569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius j+=U16_LENGTH(ch); 2570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(j<l) ch = text.char32At(j); 2571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 2572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append('+',err); 2574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while(j<l) { 2576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t digit = ch - zero; 2577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(digit >=0 && digit <= 9) { 2578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append((char)(digit + '0'), err); 2579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if((digitCount>0) || digit!=0 || j==(l-1)) { 2580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius digitCount++; 2581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 258254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(ch == 0) { // break out 258354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digitCount=-1; 258454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 2585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(ch == decimalChar) { 2586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append((char)('.'), err); 2587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius decimalChar=0; // no more decimals. 25888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // fastParseHadDecimal=TRUE; 258954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(ch == lookForGroup) { 259054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // ignore grouping char. No decimals, so it has to be an ignorable grouping sep 259154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(intOnly && (lookForGroup!=0) && !u_isdigit(ch)) { 259254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // parsing integer only and can fall through 2593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 259454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digitCount=-1; // fail - fall through to slow parse 2595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius break; 2596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius j+=U16_LENGTH(ch); 2598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ch = text.char32At(j); // for next 2599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 260054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if( 260154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ((j==l)||intOnly) // end OR only parsing integer 260254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius && (digitCount>0)) { // and have at least one digit 2603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("PP -> %d, good = [%s] digitcount=%d, fGroupingSize=%d fGroupingSize2=%d!\n", j, parsedNum.data(), digitCount, fGroupingSize, fGroupingSize2); 2605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2606103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fastParseOk=true; // Fast parse OK! 2607103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2608103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef SKIP_OPT 2609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("SKIP_OPT"); 2610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* for testing, try it the slow way. also */ 2611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fastParseOk=false; 2612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.clear(); 2613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 2614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsePosition.setIndex(position=j); 2615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status[fgStatusInfinite]=false; 2616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // was not OK. reset, retry 2619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("Fall through: j=%d, l=%d, digitCount=%d\n", j, l, digitCount); 2621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.clear(); 2623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 262454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 262554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#ifdef FMT_DEBUG 262654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("Could not fastpath parse. "); 262754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("fFormatWidth=%d ", fFormatWidth); 262854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("text.length()=%d ", text.length()); 262954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("posPrefix=%p posSuffix=%p ", posPrefix, posSuffix); 263054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 263154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("\n"); 263254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 2633103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2634103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2635103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!fastParseOk 2636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 2637103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius && fParseAllInput!=UNUM_YES 2638103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2639103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ) 2640103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { 2641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before prefix 2642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadBeforePrefix) { 2643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 2644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match positive and negative prefixes; prefer longest match. 264759d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t posMatch = compareAffix(text, position, FALSE, TRUE, posPrefix, complexCurrencyParsing, type, currency); 264859d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t negMatch = compareAffix(text, position, TRUE, TRUE, negPrefix, complexCurrencyParsing, type, currency); 2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posMatch >= 0 && negMatch >= 0) { 2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posMatch > negMatch) { 2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru negMatch = -1; 2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (negMatch > posMatch) { 2653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posMatch = -1; 265450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posMatch >= 0) { 2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += posMatch; 265850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append('+', err); 2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (negMatch >= 0) { 2660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += negMatch; 266150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append('-', err); 2662b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (strictParse){ 2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(position); 2664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 2665103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2666103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Temporary set positive. This might be changed after checking suffix 2667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append('+', err); 2668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before prefix 2671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadAfterPrefix) { 2672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 2673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2675b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (! strictParse) { 2676b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position = skipUWhiteSpace(text, position); 2677b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2678b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // process digits or Inf, find decimal position 2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *inf = &getConstSymbol(DecimalFormatSymbols::kInfinitySymbol); 2681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t infLen = (text.compare(position, inf->length(), *inf) 2682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? 0 : inf->length()); 2683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += infLen; // infLen is non-zero when it does equal to infinity 2684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status[fgStatusInfinite] = infLen != 0; 2685b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2686b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (infLen != 0) { 268750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append("Infinity", err); 268850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We now have a string of digits, possibly with grouping symbols, 2690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // and decimal points. We want to process these into a DigitList. 2691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We don't want to put a bunch of leading zeros into the DigitList 2692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // though, so we keep track of the location of the decimal point, 2693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // put only significant digits into the DigitList, and adjust the 2694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // exponent as needed. 2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2697b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool strictFail = FALSE; // did we exit with a strict parse failure? 2698b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t lastGroup = -1; // where did we last see a grouping separator? 2699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t digitStart = position; 2700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t gs2 = fGroupingSize2 == 0 ? fGroupingSize : fGroupingSize2; 2701b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString *decimalString; 270359d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 2704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalString = &getConstSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); 2705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalString = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 2707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2708103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 decimalChar = decimalString->char32At(0); 2709103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t decimalStringLength = decimalString->length(); 2710103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t decimalCharLength = U16_LENGTH(decimalChar); 2711103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool sawDecimal = FALSE; 2713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 sawDecimalChar = 0xFFFF; 2714b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool sawGrouping = FALSE; 2715b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 sawGroupingChar = 0xFFFF; 2716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool sawDigit = FALSE; 2717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t backup = -1; 2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digit; 2719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // equivalent grouping and decimal support 2721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *decimalSet = NULL; 2722b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *groupingSet = NULL; 2723b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2724b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (decimalCharLength == decimalStringLength) { 2725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalSet = DecimalFormatStaticSets::getSimilarDecimals(decimalChar, strictParse); 2726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (groupingCharLength == groupingStringLength) { 2729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse) { 273059d709d503bab6e2b61931737e662dd293b40578ccornelius groupingSet = fStaticSets->fStrictDefaultGroupingSeparators; 2731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 273259d709d503bab6e2b61931737e662dd293b40578ccornelius groupingSet = fStaticSets->fDefaultGroupingSeparators; 2733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2736b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We need to test groupingChar and decimalChar separately from groupingSet and decimalSet, if the sets are even initialized. 2737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If sawDecimal is TRUE, only consider sawDecimalChar and NOT decimalSet 2738b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If a character matches decimalSet, don't consider it to be a member of the groupingSet. 2739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We have to track digitCount ourselves, because digits.fCount will 2741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pin when the maximum allowable digits is reached. 2742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digitCount = 0; 2743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t integerDigitCount = 0; 2744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; position < textLength; ) 2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = text.char32At(position); 2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We recognize all digit ranges, not only the Latin digit range 2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * '0'..'9'. We do so by using the Character.digit() method, 2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which converts a valid Unicode digit to the range 0..9. 2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The character 'ch' may be a digit. If so, place its value 2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * from 0 to 9 in 'digit'. First try using the locale digit, 2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which may or MAY NOT be a standard Unicode digit range. If 2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * this fails, try using the standard Unicode digit ranges by 275750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * calling Character.digit(). If this also fails, digit will 2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * have a value outside the range 0..9. 2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit = ch - zero; 2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (digit < 0 || digit > 9) 2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit = u_charDigitValue(ch); 2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 276527f654740f2a26ad62a5c155af9199af9e69b889claireho 276627f654740f2a26ad62a5c155af9199af9e69b889claireho // As a last resort, look through the localized digits if the zero digit 276727f654740f2a26ad62a5c155af9199af9e69b889claireho // is not a "standard" Unicode digit. 276827f654740f2a26ad62a5c155af9199af9e69b889claireho if ( (digit < 0 || digit > 9) && u_charDigitValue(zero) != 0) { 276927f654740f2a26ad62a5c155af9199af9e69b889claireho digit = 0; 277027f654740f2a26ad62a5c155af9199af9e69b889claireho if ( getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)(DecimalFormatSymbols::kZeroDigitSymbol)).char32At(0) == ch ) { 277127f654740f2a26ad62a5c155af9199af9e69b889claireho break; 277227f654740f2a26ad62a5c155af9199af9e69b889claireho } 277327f654740f2a26ad62a5c155af9199af9e69b889claireho for (digit = 1 ; digit < 10 ; digit++ ) { 277427f654740f2a26ad62a5c155af9199af9e69b889claireho if ( getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)(DecimalFormatSymbols::kOneDigitSymbol+digit-1)).char32At(0) == ch ) { 277527f654740f2a26ad62a5c155af9199af9e69b889claireho break; 277627f654740f2a26ad62a5c155af9199af9e69b889claireho } 277727f654740f2a26ad62a5c155af9199af9e69b889claireho } 277827f654740f2a26ad62a5c155af9199af9e69b889claireho } 2779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 278050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digit >= 0 && digit <= 9) 2781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2782b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse && backup != -1) { 2783b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // comma followed by digit, so group before comma is a 2784b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // secondary group. If there was a group separator 2785b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // before that, the group must == the secondary group 2786b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // length, else it can be <= the the secondary group 2787b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // length. 2788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((lastGroup != -1 && backup - lastGroup - 1 != gs2) || 2789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (lastGroup == -1 && position - digitStart - 1 > gs2)) { 2790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho lastGroup = backup; 2795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Cancel out backup setting (see grouping handler below) 2798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backup = -1; 2799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sawDigit = TRUE; 2800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Note: this will append leading zeros 280227f654740f2a26ad62a5c155af9199af9e69b889claireho parsedNum.append((char)(digit + '0'), err); 2803b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2804b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // count any digit that's not a leading zero 2805b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (digit > 0 || digitCount > 0 || sawDecimal) { 2806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho digitCount += 1; 2807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2808b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // count any integer digit that's not a leading zero 2809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (! sawDecimal) { 2810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho integerDigitCount += 1; 2811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += U16_LENGTH(ch); 2815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho else if (groupingStringLength > 0 && 2817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho matchGrouping(groupingChar, sawGrouping, sawGroupingChar, groupingSet, 2818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalChar, decimalSet, 281954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ch) && groupingUsed) 2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2821b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (sawDecimal) { 2822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2825b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse) { 2826b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((!sawDigit || backup != -1)) { 2827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // leading group, or two group separators in a row 2828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ignore grouping characters, if we are using them, but require 2834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that they be followed by a digit. Otherwise we backup and 2835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // reprocess them. 2836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backup = position; 2837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position += groupingStringLength; 2838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sawGrouping=TRUE; 2839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Once we see a grouping character, we only accept that grouping character from then on. 2840b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sawGroupingChar=ch; 2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2842b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho else if (matchDecimal(decimalChar,sawDecimal,sawDecimalChar, decimalSet, ch)) 2843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse) { 2845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (backup != -1 || 2846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (lastGroup != -1 && position - lastGroup != fGroupingSize + 1)) { 2847b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2849b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we're only parsing integers, or if we ALREADY saw the 2853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // decimal, then don't parse this one. 2854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (isParseIntegerOnly() || sawDecimal) { 2855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 285850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append('.', err); 2859b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position += decimalStringLength; 2860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sawDecimal = TRUE; 2861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Once we see a decimal character, we only accept that decimal character from then on. 2862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sawDecimalChar=ch; 2863b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // decimalSet is considered to consist of (ch,ch) 2864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 286754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!fBoolFlags.contains(UNUM_PARSE_NO_EXPONENT) || // don't parse if this is set unless.. 286859d709d503bab6e2b61931737e662dd293b40578ccornelius isScientificNotation()) { // .. it's an exponent format - ignore setting and parse anyways 286954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const UnicodeString *tmp; 287054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tmp = &getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); 287154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // TODO: CASE 287254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!text.caseCompare(position, tmp->length(), *tmp, U_FOLD_CASE_DEFAULT)) // error code is set below if !sawDigit 2873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 287454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // Parse sign, if present 287554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t pos = position + tmp->length(); 287654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius char exponentSign = '+'; 287754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 287854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (pos < textLength) 2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 288054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tmp = &getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 2881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!text.compare(pos, tmp->length(), *tmp)) 2882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos += tmp->length(); 2884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 288554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else { 288654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tmp = &getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 288754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!text.compare(pos, tmp->length(), *tmp)) 288854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { 288954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius exponentSign = '-'; 289054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pos += tmp->length(); 289154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 289254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 289554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool sawExponentDigit = FALSE; 289654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius while (pos < textLength) { 289754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ch = text[(int32_t)pos]; 289854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digit = ch - zero; 2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (digit < 0 || digit > 9) { 290154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digit = u_charDigitValue(ch); 290254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 290354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (0 <= digit && digit <= 9) { 290454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!sawExponentDigit) { 290554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parsedNum.append('E', err); 290654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parsedNum.append(exponentSign, err); 290754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius sawExponentDigit = TRUE; 290854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 290954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ++pos; 291054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parsedNum.append((char)(digit + '0'), err); 291154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 291254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 291350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 291654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (sawExponentDigit) { 291754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius position = pos; // Advance past the exponent 291854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; // Whether we fail or succeed, we exit this loop 292154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 292254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 292354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 292454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { // not parsing exponent 2925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 292654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (backup != -1) 2931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = backup; 2933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse && !sawDecimal) { 2936b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (lastGroup != -1 && position - lastGroup != fGroupingSize + 1) { 2937b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2938b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2939b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2940b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2941b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictFail) { 2942b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // only set with strictParse and a grouping separator error 2943b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2944b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsePosition.setIndex(oldStart); 2945b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsePosition.setErrorIndex(position); 2946103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("strictFail!"); 2947b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 2948b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2949b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If there was no decimal point we have an integer 2951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If none of the text string was recognized. For example, parse 2953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "x" with pattern "#0.00" (return index and error index both 0) 2954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // parse "$" with pattern "$#0.00". (return index 0 and error index 2955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1). 2956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!sawDigit && digitCount == 0) { 2957103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2958103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("none of text rec"); 2959103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("position=%d\n",position); 2960103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setIndex(oldStart); 2962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(oldStart); 2963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 2964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before suffix 2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadBeforeSuffix) { 2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2972b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t posSuffixMatch = -1, negSuffixMatch = -1; 2973b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match positive and negative suffixes; prefer longest match. 2975b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (posMatch >= 0 || (!strictParse && negMatch < 0)) { 297659d709d503bab6e2b61931737e662dd293b40578ccornelius posSuffixMatch = compareAffix(text, position, FALSE, FALSE, posSuffix, complexCurrencyParsing, type, currency); 2977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (negMatch >= 0) { 297959d709d503bab6e2b61931737e662dd293b40578ccornelius negSuffixMatch = compareAffix(text, position, TRUE, FALSE, negSuffix, complexCurrencyParsing, type, currency); 2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2981b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (posSuffixMatch >= 0 && negSuffixMatch >= 0) { 2982b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (posSuffixMatch > negSuffixMatch) { 2983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho negSuffixMatch = -1; 2984b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (negSuffixMatch > posSuffixMatch) { 2985b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho posSuffixMatch = -1; 298650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Fail if neither or both 2990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse && ((posSuffixMatch >= 0) == (negSuffixMatch >= 0))) { 2991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(position); 2992103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("neither or both"); 2993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 2994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2996b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position += (posSuffixMatch >= 0 ? posSuffixMatch : (negSuffixMatch >= 0 ? negSuffixMatch : 0)); 2997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before suffix 2999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadAfterSuffix) { 3000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 3001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setIndex(position); 3004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3005b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsedNum.data()[0] = (posSuffixMatch >= 0 || (!strictParse && negMatch < 0 && negSuffixMatch < 0)) ? '+' : '-'; 3006103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3007103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusprintf("PP -> %d, SLOW = [%s]! pp=%d, os=%d, err=%s\n", position, parsedNum.data(), parsePosition.getIndex(),oldStart,u_errorName(err)); 3008103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3009103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } /* end SLOW parse */ 3010103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(parsePosition.getIndex() == oldStart) 3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3012103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3013103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf(" PP didnt move, err\n"); 3014103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3015103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsePosition.setErrorIndex(position); 3016103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return FALSE; 3017103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 3018103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 3019103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius else if (fParseAllInput==UNUM_YES&&parsePosition.getIndex()!=textLength) 3020103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { 3021103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3022103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf(" PP didnt consume all (UNUM_YES), err\n"); 3023103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(position); 3025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 3026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3027103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 302854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // uint32_t bits = (fastParseOk?kFastpathOk:0) | 302954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (fastParseHadDecimal?0:kNoDecimal); 303054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius //printf("FPOK=%d, FPHD=%d, bits=%08X\n", fastParseOk, fastParseHadDecimal, bits); 303154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digits.set(parsedNum.toStringPiece(), 303254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius err, 303354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0//bits 303454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ); 303550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 303650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(err)) { 3037103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3038103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf(" err setting %s\n", u_errorName(err)); 3039103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 304050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsePosition.setErrorIndex(position); 304150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 304250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Starting at position, advance past a run of pad characters, if any. 3048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the index of the first character after position that is not a pad 3049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character. Result is >= position. 3050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::skipPadding(const UnicodeString& text, int32_t position) const { 3052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t padLen = U16_LENGTH(fPad); 3053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (position < text.length() && 3054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text.char32At(position) == fPad) { 3055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += padLen; 3056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return position; 3058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the length matched by the given affix, or -1 if none. 3062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Runs of white space in the affix, match runs of white space in 3063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the input. Pattern white space and input white space are 3064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * determined differently; see code. 3065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param text input text 3066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos offset into input at which to begin matching 3067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isNegative 3068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isPrefix 3069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param affixPat affix pattern used for currency affix comparison. 307059d709d503bab6e2b61931737e662dd293b40578ccornelius * @param complexCurrencyParsing whether it is currency parsing or not 3071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param type the currency type to parse against, LONG_NAME only or not. 3072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param currency return value for parsed currency, for generic 3073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, or null for normal parsing. In generic 3074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, any currency is parsed, not just the 3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency that this formatter is set to. 3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length of input that matches, or -1 if match failure 3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::compareAffix(const UnicodeString& text, 3079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos, 3080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isNegative, 3081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isPrefix, 3082b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* affixPat, 308359d709d503bab6e2b61931737e662dd293b40578ccornelius UBool complexCurrencyParsing, 3084b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int8_t type, 3085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* currency) const 3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *patternToCompare; 3088b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyChoice != NULL || currency != NULL || 308959d709d503bab6e2b61931737e662dd293b40578ccornelius (fCurrencySignCount != fgCurrencySignCountZero && complexCurrencyParsing)) { 309050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (affixPat != NULL) { 3092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return compareComplexAffix(*affixPat, text, pos, type, currency); 3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 309550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isNegative) { 3097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isPrefix) { 3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fNegativePrefix; 3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fNegativeSuffix; 3102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isPrefix) { 3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fPositivePrefix; 3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fPositiveSuffix; 3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return compareSimpleAffix(*patternToCompare, text, pos, isLenient()); 3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 311559d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool DecimalFormat::equalWithSignCompatibility(UChar32 lhs, UChar32 rhs) const { 311659d709d503bab6e2b61931737e662dd293b40578ccornelius if (lhs == rhs) { 311759d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 311859d709d503bab6e2b61931737e662dd293b40578ccornelius } 311959d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(fStaticSets != NULL); // should already be loaded 312059d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeSet *minusSigns = fStaticSets->fMinusSigns; 312159d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeSet *plusSigns = fStaticSets->fPlusSigns; 312259d709d503bab6e2b61931737e662dd293b40578ccornelius return (minusSigns->contains(lhs) && minusSigns->contains(rhs)) || 312359d709d503bab6e2b61931737e662dd293b40578ccornelius (plusSigns->contains(lhs) && plusSigns->contains(rhs)); 312459d709d503bab6e2b61931737e662dd293b40578ccornelius} 312559d709d503bab6e2b61931737e662dd293b40578ccornelius 312659d709d503bab6e2b61931737e662dd293b40578ccornelius// check for LRM 0x200E, RLM 0x200F, ALM 0x061C 312759d709d503bab6e2b61931737e662dd293b40578ccornelius#define IS_BIDI_MARK(c) (c==0x200E || c==0x200F || c==0x061C) 312859d709d503bab6e2b61931737e662dd293b40578ccornelius 312959d709d503bab6e2b61931737e662dd293b40578ccornelius#define TRIM_BUFLEN 32 313059d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString& DecimalFormat::trimMarksFromAffix(const UnicodeString& affix, UnicodeString& trimmedAffix) { 313159d709d503bab6e2b61931737e662dd293b40578ccornelius UChar trimBuf[TRIM_BUFLEN]; 313259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t affixLen = affix.length(); 313359d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t affixPos, trimLen = 0; 313459d709d503bab6e2b61931737e662dd293b40578ccornelius 313559d709d503bab6e2b61931737e662dd293b40578ccornelius for (affixPos = 0; affixPos < affixLen; affixPos++) { 313659d709d503bab6e2b61931737e662dd293b40578ccornelius UChar c = affix.charAt(affixPos); 313759d709d503bab6e2b61931737e662dd293b40578ccornelius if (!IS_BIDI_MARK(c)) { 3138fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (trimLen < TRIM_BUFLEN) { 3139fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius trimBuf[trimLen++] = c; 3140fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 3141fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius trimLen = 0; 3142fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 3143fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 314459d709d503bab6e2b61931737e662dd293b40578ccornelius } 314559d709d503bab6e2b61931737e662dd293b40578ccornelius } 314659d709d503bab6e2b61931737e662dd293b40578ccornelius return (trimLen > 0)? trimmedAffix.setTo(trimBuf, trimLen): trimmedAffix.setTo(affix); 314759d709d503bab6e2b61931737e662dd293b40578ccornelius} 314859d709d503bab6e2b61931737e662dd293b40578ccornelius 3149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the length matched by the given affix, or -1 if none. 3151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Runs of white space in the affix, match runs of white space in 3152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the input. Pattern white space and input white space are 3153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * determined differently; see code. 3154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affix pattern string, taken as a literal 3155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param input input text 3156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos offset into input at which to begin matching 3157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length of input that matches, or -1 if match failure 3158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::compareSimpleAffix(const UnicodeString& affix, 3160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& input, 3161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t pos, 316259d709d503bab6e2b61931737e662dd293b40578ccornelius UBool lenient) const { 3163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t start = pos; 316459d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString trimmedAffix; 316559d709d503bab6e2b61931737e662dd293b40578ccornelius // For more efficiency we should keep lazily-created trimmed affixes around in 316659d709d503bab6e2b61931737e662dd293b40578ccornelius // instance variables instead of trimming each time they are used (the next step) 316759d709d503bab6e2b61931737e662dd293b40578ccornelius trimMarksFromAffix(affix, trimmedAffix); 316859d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 affixChar = trimmedAffix.char32At(0); 316959d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t affixLength = trimmedAffix.length(); 3170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t inputLength = input.length(); 3171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t affixCharLength = U16_LENGTH(affixChar); 3172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeSet *affixSet; 317359d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode status = U_ZERO_ERROR; 317459d709d503bab6e2b61931737e662dd293b40578ccornelius 317559d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(fStaticSets != NULL); // should already be loaded 3176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 317759d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 317859d709d503bab6e2b61931737e662dd293b40578ccornelius return -1; 317959d709d503bab6e2b61931737e662dd293b40578ccornelius } 3180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (!lenient) { 318159d709d503bab6e2b61931737e662dd293b40578ccornelius affixSet = fStaticSets->fStrictDashEquivalents; 318259d709d503bab6e2b61931737e662dd293b40578ccornelius 318359d709d503bab6e2b61931737e662dd293b40578ccornelius // If the trimmedAffix is exactly one character long and that character 3184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // is in the dash set and the very next input character is also 3185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // in the dash set, return a match. 3186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (affixCharLength == affixLength && affixSet->contains(affixChar)) { 318759d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 318859d709d503bab6e2b61931737e662dd293b40578ccornelius if (affixSet->contains(ic)) { 318959d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(ic); 319059d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipBidiMarks(input, pos); // skip any trailing bidi marks 319159d709d503bab6e2b61931737e662dd293b40578ccornelius return pos - start; 3192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int32_t i = 0; i < affixLength; ) { 319659d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 c = trimmedAffix.char32At(i); 3197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t len = U16_LENGTH(c); 3198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(c)) { 3199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We may have a pattern like: \u200F \u0020 3200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // and input text like: \u200F \u0020 3201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Note that U+200F and U+0020 are Pattern_White_Space but only 3202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // U+0020 is UWhiteSpace. So we have to first do a direct 3203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // match of the run of Pattern_White_Space in the pattern, 3204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // then match any extra characters. 3205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool literalMatch = FALSE; 320659d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < inputLength) { 320759d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 320859d709d503bab6e2b61931737e662dd293b40578ccornelius if (ic == c) { 320959d709d503bab6e2b61931737e662dd293b40578ccornelius literalMatch = TRUE; 321059d709d503bab6e2b61931737e662dd293b40578ccornelius i += len; 321159d709d503bab6e2b61931737e662dd293b40578ccornelius pos += len; 321259d709d503bab6e2b61931737e662dd293b40578ccornelius if (i == affixLength) { 321359d709d503bab6e2b61931737e662dd293b40578ccornelius break; 321459d709d503bab6e2b61931737e662dd293b40578ccornelius } 321559d709d503bab6e2b61931737e662dd293b40578ccornelius c = trimmedAffix.char32At(i); 321659d709d503bab6e2b61931737e662dd293b40578ccornelius len = U16_LENGTH(c); 321759d709d503bab6e2b61931737e662dd293b40578ccornelius if (!PatternProps::isWhiteSpace(c)) { 321859d709d503bab6e2b61931737e662dd293b40578ccornelius break; 321959d709d503bab6e2b61931737e662dd293b40578ccornelius } 322059d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (IS_BIDI_MARK(ic)) { 322159d709d503bab6e2b61931737e662dd293b40578ccornelius pos ++; // just skip over this input text 322259d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 3223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 3224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Advance over run in pattern 322859d709d503bab6e2b61931737e662dd293b40578ccornelius i = skipPatternWhiteSpace(trimmedAffix, i); 3229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Advance over run in input text 3231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Must see at least one white space char in input, 3232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // unless we've already matched some characters literally. 3233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t s = pos; 3234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pos = skipUWhiteSpace(input, pos); 3235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pos == s && !literalMatch) { 3236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 3237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If we skip UWhiteSpace in the input text, we need to skip it in the pattern. 3240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Otherwise, the previous lines may have skipped over text (such as U+00A0) that 324159d709d503bab6e2b61931737e662dd293b40578ccornelius // is also in the trimmedAffix. 324259d709d503bab6e2b61931737e662dd293b40578ccornelius i = skipUWhiteSpace(trimmedAffix, i); 3243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 324459d709d503bab6e2b61931737e662dd293b40578ccornelius UBool match = FALSE; 324559d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < inputLength) { 324659d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 324759d709d503bab6e2b61931737e662dd293b40578ccornelius if (!match && ic == c) { 324859d709d503bab6e2b61931737e662dd293b40578ccornelius i += len; 324959d709d503bab6e2b61931737e662dd293b40578ccornelius pos += len; 325059d709d503bab6e2b61931737e662dd293b40578ccornelius match = TRUE; 325159d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (IS_BIDI_MARK(ic)) { 325259d709d503bab6e2b61931737e662dd293b40578ccornelius pos++; // just skip over this input text 325359d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 325459d709d503bab6e2b61931737e662dd293b40578ccornelius break; 325559d709d503bab6e2b61931737e662dd293b40578ccornelius } 325659d709d503bab6e2b61931737e662dd293b40578ccornelius } 325759d709d503bab6e2b61931737e662dd293b40578ccornelius if (!match) { 3258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 3259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool match = FALSE; 326459d709d503bab6e2b61931737e662dd293b40578ccornelius 326559d709d503bab6e2b61931737e662dd293b40578ccornelius affixSet = fStaticSets->fDashEquivalents; 3266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (affixCharLength == affixLength && affixSet->contains(affixChar)) { 326859d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipUWhiteSpaceAndMarks(input, pos); 326959d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 327059d709d503bab6e2b61931737e662dd293b40578ccornelius 327159d709d503bab6e2b61931737e662dd293b40578ccornelius if (affixSet->contains(ic)) { 327259d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(ic); 327359d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipBidiMarks(input, pos); 327459d709d503bab6e2b61931737e662dd293b40578ccornelius return pos - start; 3275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3277c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 3278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int32_t i = 0; i < affixLength; ) 3279b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 328059d709d503bab6e2b61931737e662dd293b40578ccornelius //i = skipRuleWhiteSpace(trimmedAffix, i); 328159d709d503bab6e2b61931737e662dd293b40578ccornelius i = skipUWhiteSpace(trimmedAffix, i); 328259d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipUWhiteSpaceAndMarks(input, pos); 3283b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (i >= affixLength || pos >= inputLength) { 3285b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 3286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3287b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 328859d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 c = trimmedAffix.char32At(i); 328959d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 3290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 329159d709d503bab6e2b61931737e662dd293b40578ccornelius if (!equalWithSignCompatibility(ic, c)) { 3292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 3293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho match = TRUE; 329659d709d503bab6e2b61931737e662dd293b40578ccornelius i += U16_LENGTH(c); 329759d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(ic); 329859d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipBidiMarks(input, pos); 3299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3301b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (affixLength > 0 && ! match) { 3302b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 3303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos - start; 3306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Skip over a run of zero or more Pattern_White_Space characters at 3310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pos in text. 3311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3312b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t DecimalFormat::skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) { 3313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar* s = text.getBuffer(); 3314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (int32_t)(PatternProps::skipWhiteSpace(s + pos, text.length() - pos) - s); 3315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Skip over a run of zero or more isUWhiteSpace() characters at pos 3319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in text. 3320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::skipUWhiteSpace(const UnicodeString& text, int32_t pos) { 3322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (pos < text.length()) { 3323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = text.char32At(pos); 3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!u_isUWhiteSpace(c)) { 3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos += U16_LENGTH(c); 3328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos; 3330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 333359d709d503bab6e2b61931737e662dd293b40578ccornelius * Skip over a run of zero or more isUWhiteSpace() characters or bidi marks at pos 333459d709d503bab6e2b61931737e662dd293b40578ccornelius * in text. 333559d709d503bab6e2b61931737e662dd293b40578ccornelius */ 333659d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t DecimalFormat::skipUWhiteSpaceAndMarks(const UnicodeString& text, int32_t pos) { 333759d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < text.length()) { 333859d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 c = text.char32At(pos); 333959d709d503bab6e2b61931737e662dd293b40578ccornelius if (!u_isUWhiteSpace(c) && !IS_BIDI_MARK(c)) { // u_isUWhiteSpace doesn't include LRM,RLM,ALM 334059d709d503bab6e2b61931737e662dd293b40578ccornelius break; 334159d709d503bab6e2b61931737e662dd293b40578ccornelius } 334259d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(c); 334359d709d503bab6e2b61931737e662dd293b40578ccornelius } 334459d709d503bab6e2b61931737e662dd293b40578ccornelius return pos; 334559d709d503bab6e2b61931737e662dd293b40578ccornelius} 334659d709d503bab6e2b61931737e662dd293b40578ccornelius 334759d709d503bab6e2b61931737e662dd293b40578ccornelius/** 334859d709d503bab6e2b61931737e662dd293b40578ccornelius * Skip over a run of zero or more bidi marks at pos in text. 334959d709d503bab6e2b61931737e662dd293b40578ccornelius */ 335059d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t DecimalFormat::skipBidiMarks(const UnicodeString& text, int32_t pos) { 335159d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < text.length()) { 335259d709d503bab6e2b61931737e662dd293b40578ccornelius UChar c = text.charAt(pos); 335359d709d503bab6e2b61931737e662dd293b40578ccornelius if (!IS_BIDI_MARK(c)) { 335459d709d503bab6e2b61931737e662dd293b40578ccornelius break; 335559d709d503bab6e2b61931737e662dd293b40578ccornelius } 335659d709d503bab6e2b61931737e662dd293b40578ccornelius pos++; 335759d709d503bab6e2b61931737e662dd293b40578ccornelius } 335859d709d503bab6e2b61931737e662dd293b40578ccornelius return pos; 335959d709d503bab6e2b61931737e662dd293b40578ccornelius} 336059d709d503bab6e2b61931737e662dd293b40578ccornelius 336159d709d503bab6e2b61931737e662dd293b40578ccornelius/** 3362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the length matched by the given affix, or -1 if none. 3363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affixPat pattern string 3364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param input input text 3365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos offset into input at which to begin matching 3366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param type the currency type to parse against, LONG_NAME only or not. 3367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param currency return value for parsed currency, for generic 3368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, or null for normal parsing. In generic 3369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, any currency is parsed, not just the 3370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency that this formatter is set to. 3371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length of input that matches, or -1 if match failure 3372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::compareComplexAffix(const UnicodeString& affixPat, 3374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& text, 3375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos, 3376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int8_t type, 3377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* currency) const 3378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t start = pos; 3380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(currency != NULL || 3381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (fCurrencyChoice != NULL && *getCurrency() != 0) || 338259d709d503bab6e2b61931737e662dd293b40578ccornelius fCurrencySignCount != fgCurrencySignCountZero); 3383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 338450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (int32_t i=0; 3385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i<affixPat.length() && pos >= 0; ) { 3386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = affixPat.char32At(i); 3387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 3388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == kQuote) { 3390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(i <= affixPat.length()); 3391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = affixPat.char32At(i); 3392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 3393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affix = NULL; 3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 3397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kCurrencySign: { 3398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // since the currency names in choice format is saved 339950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the same way as other currency names, 3400b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // do not need to do currency choice parsing here. 3401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // the general currency parsing parse against all names, 3402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // including names in choice format. 3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool intl = i<affixPat.length() && 3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPat.char32At(i) == kCurrencySign; 3405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (intl) { 3406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++i; 3407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool plural = i<affixPat.length() && 3409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affixPat.char32At(i) == kCurrencySign; 3410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (plural) { 3411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++i; 3412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru intl = FALSE; 3413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Parse generic currency -- anything for which we 3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // have a display name, or any 3-letter ISO code. 3416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Try to parse display name for our locale; first 3417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // determine our locale. 3418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char* loc = fCurrencyPluralInfo->getLocale().getName(); 3419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition ppos(pos); 3420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar curr[4]; 3421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Delegate parse of display name => ISO code to Currency 3423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_parseCurrency(loc, text, ppos, type, curr, ec); 3424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // If parse succeeds, populate currency[0] 3426b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(ec) && ppos.getIndex() != pos) { 3427b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (currency) { 3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(currency, curr); 3429b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3430b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // The formatter is currency-style but the client has not requested 3431b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // the value of the parsed currency. In this case, if that value does 3432b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // not match the formatter's current value, then the parse fails. 3433b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar effectiveCurr[4]; 3434b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho getEffectiveCurrency(effectiveCurr, ec); 3435b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_FAILURE(ec) || u_strncmp(curr,effectiveCurr,4) != 0 ) { 3436fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pos = -1; 3437fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius continue; 3438b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = ppos.getIndex(); 3441b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (!isLenient()){ 3442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = -1; 3443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPercent: 3447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 3448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPerMill: 3450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 3451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPlus: 3453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 3454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternMinus: 3456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 3457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 3459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // fall through to affix!=0 test, which will fail 3460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affix != NULL) { 3464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = match(text, pos, *affix); 3465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = match(text, pos, c); 3470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(c)) { 3471b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho i = skipPatternWhiteSpace(affixPat, i); 3472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos - start; 3475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Match a single character at text[pos] and return the index of the 3479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * next character upon success. Return -1 on failure. If 3480b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * ch is a Pattern_White_Space then match a run of white space in text. 3481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::match(const UnicodeString& text, int32_t pos, UChar32 ch) { 3483b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(ch)) { 3484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Advance over run of white space in input text 3485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Must see at least one white space char in input 3486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t s = pos; 3487b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pos = skipPatternWhiteSpace(text, pos); 3488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos == s) { 3489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 3490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos; 3492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (pos >= 0 && text.char32At(pos) == ch) ? 3494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (pos + U16_LENGTH(ch)) : -1; 3495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Match a string at text[pos] and return the index of the next 3499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character upon success. Return -1 on failure. Match a run of 3500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * white space in str with a run of white space in text. 3501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::match(const UnicodeString& text, int32_t pos, const UnicodeString& str) { 3503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<str.length() && pos >= 0; ) { 3504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = str.char32At(i); 3505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(ch); 3506b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(ch)) { 3507b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho i = skipPatternWhiteSpace(str, i); 3508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = match(text, pos, ch); 3510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos; 3512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3514b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool DecimalFormat::matchSymbol(const UnicodeString &text, int32_t position, int32_t length, const UnicodeString &symbol, 3515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeSet *sset, UChar32 schar) 3516b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 3517b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (sset != NULL) { 3518b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return sset->contains(schar); 3519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3520b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return text.compare(position, length, symbol) == 0; 3522b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 3523b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3524b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool DecimalFormat::matchDecimal(UChar32 symbolChar, 3525b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool sawDecimal, UChar32 sawDecimalChar, 3526b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *sset, UChar32 schar) { 3527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(sawDecimal) { 3528b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return schar==sawDecimalChar; 3529b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(schar==symbolChar) { 3530b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return TRUE; 3531b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(sset!=NULL) { 3532b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return sset->contains(schar); 3533b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3534b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 3535b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3536b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 3537b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool DecimalFormat::matchGrouping(UChar32 groupingChar, 3539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool sawGrouping, UChar32 sawGroupingChar, 3540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *sset, 3541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 /*decimalChar*/, const UnicodeSet *decimalSet, 3542b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 schar) { 3543b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(sawGrouping) { 3544b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return schar==sawGroupingChar; // previously found 3545b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(schar==groupingChar) { 3546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return TRUE; // char from symbols 3547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(sset!=NULL) { 3548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return sset->contains(schar) && // in groupingSet but... 3549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((decimalSet==NULL) || !decimalSet->contains(schar)); // Exclude decimalSet from groupingSet 3550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 3552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 3554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the pointer to the localized decimal format symbols 3559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst DecimalFormatSymbols* 3561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getDecimalFormatSymbols() const 3562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fSymbols; 3564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// De-owning the current localized symbols and adopt the new symbols. 3568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt) 3571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbolsToAdopt == NULL) { 3573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; // do not allow caller to set fSymbols to NULL 3574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool sameSymbols = FALSE; 3577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fSymbols != NULL) { 3578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sameSymbols = (UBool)(getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == 3579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbolsToAdopt->getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) && 3580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == 3581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbolsToAdopt->getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); 3582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fSymbols; 3583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols = symbolsToAdopt; 3586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!sameSymbols) { 3587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the currency symbols are the same, there is no need to recalculate. 3588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setCurrencyForSymbols(); 3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixes(NULL); 3591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Setting the symbols is equlivalent to adopting a newly created localized 3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// symbols. 3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setDecimalFormatSymbols(const DecimalFormatSymbols& symbols) 3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru adoptDecimalFormatSymbols(new DecimalFormatSymbols(symbols)); 3603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 360850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 360950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst CurrencyPluralInfo* 3610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::getCurrencyPluralInfo(void) const 3611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 3612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return fCurrencyPluralInfo; 3613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 361650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 3617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt) 3618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 3619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (toAdopt != NULL) { 362050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete fCurrencyPluralInfo; 3621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = toAdopt; 3622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // re-set currency affix patterns and currency affixes. 362359d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 3624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fAffixPatternsForCurrency) { 3626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffixPattern(); 3627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixPatterns(status); 3629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount == fgCurrencySignCountInPluralFormat) { 3630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // only setup the affixes of the plural pattern. 3631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(fFormatPattern, FALSE, TRUE, status); 3632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 363450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3635103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3637103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 364050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 3641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) 3642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 3643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru adoptCurrencyPluralInfo(info.clone()); 3644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Update the currency object to match the symbols. This method 3652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is used only when the caller has passed in a symbols object 3653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that may not be the default object for its locale. 3654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setCurrencyForSymbols() { 3657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Bug 4212072 3658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Update the affix strings accroding to symbols in order to keep 3659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru the affix strings up to date. 3660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru [Richard/GCL] 3661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // With the introduction of the Currency object, the currency 3664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // symbols in the DFS object are ignored. For backward 3665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // compatibility, we check any explicitly set DFS object. If it 3666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is a default symbols object for its locale, we change the 3667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // currency object to one for that locale. If it is custom, 3668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we set the currency to null. 3669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* c = NULL; 3671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* loc = fSymbols->getLocale().getName(); 367250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar intlCurrencySymbol[4]; 3673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucurr_forLocale(loc, intlCurrencySymbol, 4, &ec); 3674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString currencySymbol; 3675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_getStaticCurrencyName(intlCurrencySymbol, loc, currencySymbol, ec); 3677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(ec) 3678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == currencySymbol 3679b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho && getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == UnicodeString(intlCurrencySymbol)) 3680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Trap an error in mapping locale to currency. If we can't 3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // map, then don't fail and set the currency to "". 3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = intlCurrencySymbol; 3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; // reset local error code! 3686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(c, ec); 3687103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3688103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the positive prefix of the number pattern. 369550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getPositivePrefix(UnicodeString& result) const 3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fPositivePrefix; 3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 370250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the positive prefix of the number pattern. 370550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setPositivePrefix(const UnicodeString& newValue) 3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositivePrefix = newValue; 3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosPrefixPattern; 3711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPosPrefixPattern = 0; 3712103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3713103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the negative prefix of the number pattern. 3719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getNegativePrefix(UnicodeString& result) const 3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fNegativePrefix; 3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the negative prefix of the number pattern. 3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setNegativePrefix(const UnicodeString& newValue) 3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix = newValue; 3734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegPrefixPattern; 3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern = 0; 3736103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3737103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3738103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the positive suffix of the number pattern. 3743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getPositiveSuffix(UnicodeString& result) const 3746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fPositiveSuffix; 3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the positive suffix of the number pattern. 3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setPositiveSuffix(const UnicodeString& newValue) 3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositiveSuffix = newValue; 3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosSuffixPattern; 3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPosSuffixPattern = 0; 3760103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3761103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3762103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the negative suffix of the number pattern. 3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getNegativeSuffix(UnicodeString& result) const 3770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fNegativeSuffix; 3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the negative suffix of the number pattern. 3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setNegativeSuffix(const UnicodeString& newValue) 3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix = newValue; 3782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegSuffixPattern; 3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegSuffixPattern = 0; 3784103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3785103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3786103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the multiplier of the number pattern. 379150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Multipliers are stored as decimal numbers (DigitLists) because that 379250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// is the most convenient for muliplying or dividing the numbers to be formatted. 379350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// A NULL multiplier implies one, and the scaling operations are skipped. 3794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 379550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t 379650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::getMultiplier() const 3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 379850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier == NULL) { 379950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 1; 380050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 380150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return fMultiplier->getLong(); 380250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the multiplier of the number pattern. 3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setMultiplier(int32_t newValue) 3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// if (newValue == 0) { 3811c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// throw new IllegalArgumentException("Bad multiplier: " + newValue); 3812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// } 381350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (newValue == 0) { 381450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho newValue = 1; // one being the benign default value for a multiplier. 381550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 381650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (newValue == 1) { 381750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete fMultiplier; 381850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier = NULL; 381950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 382050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier == NULL) { 382150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier = new DigitList; 382250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 382350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier != NULL) { 382450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier->set(newValue); 382550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3827103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3828103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3829103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the rounding increment. 3834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return A positive rounding increment, or 0.0 if rounding 3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is not in effect. 3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingIncrement 3837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingMode 3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingMode 3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querudouble DecimalFormat::getRoundingIncrement() const { 384150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fRoundingIncrement == NULL) { 384250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0.0; 384350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 384450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return fRoundingIncrement->getDouble(); 384550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the rounding increment. This method also controls whether 3850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * rounding is enabled. 3851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param newValue A positive rounding increment, or 0.0 to disable rounding. 3852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Negative increments are equivalent to 0.0. 3853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingIncrement 3854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingMode 3855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingMode 3856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setRoundingIncrement(double newValue) { 3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newValue > 0.0) { 3859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fRoundingIncrement == NULL) { 3860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingIncrement = new DigitList(); 3861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (fRoundingIncrement != NULL) { 386350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fRoundingIncrement->set(newValue); 3864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 3865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 386650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // These statements are executed if newValue is less than 0.0 3868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // or fRoundingIncrement could not be created. 3869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fRoundingIncrement; 3870c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fRoundingIncrement = NULL; 3871103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3872103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3873103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the rounding mode. 3878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return A rounding mode 3879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingIncrement 3880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingIncrement 3881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingMode 3882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::ERoundingMode DecimalFormat::getRoundingMode() const { 3884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fRoundingMode; 3885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the rounding mode. This has no effect unless the rounding 3889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * increment is greater than zero. 3890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param roundingMode A rounding mode 3891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingIncrement 3892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingIncrement 3893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingMode 3894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { 3896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingMode = roundingMode; 3897103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3898103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3899103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the width to which the output of <code>format()</code> is padded. 3904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the format width, or zero if no padding is in effect 3905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setFormatWidth 3906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadPosition 3909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadPosition 3910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::getFormatWidth() const { 3912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fFormatWidth; 3913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the width to which the output of <code>format()</code> is padded. 3917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This method also controls whether padding is enabled. 3918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param width the width to which to pad the result of 3919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>format()</code>, or zero to disable padding. A negative 3920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * width is equivalent to 0. 3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getFormatWidth 3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadPosition 3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadPosition 3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setFormatWidth(int32_t width) { 3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fFormatWidth = (width > 0) ? width : 0; 3929103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3930103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3931103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString DecimalFormat::getPadCharacterString() const { 3935b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return UnicodeString(fPad); 3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setPadCharacter(const UnicodeString &padChar) { 3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (padChar.length() > 0) { 3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = padChar.char32At(0); 3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = kDefaultPad; 3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3945103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3946103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3947103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the position at which padding will take place. This is the location 3952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * at which padding will be inserted if the result of <code>format()</code> 3953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is shorter than the format width. 3954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the pad position, one of <code>kPadBeforePrefix</code>, 3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterPrefix</code>, <code>kPadBeforeSuffix</code>, or 3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterSuffix</code>. 3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setFormatWidth 3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getFormatWidth 3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadPosition 3962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforePrefix 3963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterPrefix 3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforeSuffix 3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterSuffix 3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::EPadPosition DecimalFormat::getPadPosition() const { 3968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fPadPosition; 3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <strong><font face=helvetica color=red>NEW</font></strong> 3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the position at which padding will take place. This is the location 3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * at which padding will be inserted if the result of <code>format()</code> 3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is shorter than the format width. This has no effect unless padding is 3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * enabled. 3977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param padPos the pad position, one of <code>kPadBeforePrefix</code>, 3978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterPrefix</code>, <code>kPadBeforeSuffix</code>, or 3979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterSuffix</code>. 3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setFormatWidth 3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getFormatWidth 3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadPosition 3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforePrefix 3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterPrefix 3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforeSuffix 3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterSuffix 3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setPadPosition(EPadPosition padPos) { 3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition = padPos; 3992103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3993103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3994103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return whether or not scientific notation is used. 3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return TRUE if this object formats and parses scientific notation 4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 400659d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool DecimalFormat::isScientificNotation() const { 4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fUseExponentialNotation; 4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set whether or not scientific notation is used. 4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param useScientific TRUE if this object formats and parses scientific 4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * notation 4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setScientificNotation(UBool useScientific) { 4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation = useScientific; 4022103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4023103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4024103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the minimum exponent digits that will be shown. 4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the minimum exponent digits that will be shown 4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint8_t DecimalFormat::getMinimumExponentDigits() const { 4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fMinExponentDigits; 4038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the minimum exponent digits that will be shown. This has no 4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effect unless scientific notation is in use. 4043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param minExpDig a value >= 1 indicating the fewest exponent digits 4044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that will be shown. Values less than 1 will be treated as 1. 4045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumExponentDigits(int8_t minExpDig) { 4052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinExponentDigits = (int8_t)((minExpDig > 0) ? minExpDig : 1); 4053103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4054103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4055103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return whether the exponent sign is always shown. 4060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return TRUE if the exponent is always prefixed with either the 4061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * localized minus sign or the localized plus sign, false if only negative 4062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * exponents are prefixed with the localized minus sign. 4063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 406959d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool DecimalFormat::isExponentSignAlwaysShown() const { 4070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fExponentSignAlwaysShown; 4071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set whether the exponent sign is always shown. This has no effect 4075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unless scientific notation is in use. 4076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expSignAlways TRUE if the exponent is always prefixed with either 4077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the localized minus sign or the localized plus sign, false if only 4078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * negative exponents are prefixed with the localized minus sign. 4079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setExponentSignAlwaysShown(UBool expSignAlways) { 4086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fExponentSignAlwaysShown = expSignAlways; 4087103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4088103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4089103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the grouping size of the number pattern. For example, thousand or 10 4094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// thousand groupings. 409550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 4097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getGroupingSize() const 4098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fGroupingSize; 4100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 410150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the grouping size of the number pattern. 410450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setGroupingSize(int32_t newValue) 4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize = newValue; 4109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 4117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getSecondaryGroupingSize() const 4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fGroupingSize2; 4120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setSecondaryGroupingSize(int32_t newValue) 4126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 = newValue; 4128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4129103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4130103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Checks if to show the decimal separator. 4135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::isDecimalSeparatorAlwaysShown() const 4138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fDecimalSeparatorAlwaysShown; 4140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets to always show the decimal separator. 4144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) 4147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown = newValue; 4149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4151103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Emits the pattern of this DecimalFormat instance. 4156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 4158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::toPattern(UnicodeString& result) const 4159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return toPattern(result, FALSE); 4161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Emits the localized pattern this DecimalFormat instance. 4165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 4167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::toLocalizedPattern(UnicodeString& result) const 4168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return toPattern(result, TRUE); 4170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Expand the affix pattern strings into the expanded affix strings. If any 4175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * affix pattern string is null, do not expand it. This method should be 4176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * called any time the symbols or the affix patterns change in order to keep 4177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the expanded affix strings up to date. 4178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * This method also will be called before formatting if format currency 417950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * plural names, since the plural name is not a static one, it is 4180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * based on the currency plural count, the affix will be known only 418150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * after the currency plural count is know. 4182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * In which case, the parameter 4183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 'pluralCount' will be a non-null currency plural count. 4184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * In all other cases, the 'pluralCount' is null, which means it is not needed. 4185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid DecimalFormat::expandAffixes(const UnicodeString* pluralCount) { 418750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler none; 4188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPosPrefixPattern != 0) { 418950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fPosPrefixPattern, fPositivePrefix, 0, none, FALSE, pluralCount); 4190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPosSuffixPattern != 0) { 419250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fPosSuffixPattern, fPositiveSuffix, 0, none, FALSE, pluralCount); 4193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegPrefixPattern != 0) { 419550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fNegPrefixPattern, fNegativePrefix, 0, none, FALSE, pluralCount); 4196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegSuffixPattern != 0) { 419850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fNegSuffixPattern, fNegativeSuffix, 0, none, FALSE, pluralCount); 4199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef FMT_DEBUG 4201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 4202103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius s.append(UnicodeString("[")) 4203103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append(DEREFSTR(fPosPrefixPattern)).append((UnicodeString)"|").append(DEREFSTR(fPosSuffixPattern)) 4204103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)";") .append(DEREFSTR(fNegPrefixPattern)).append((UnicodeString)"|").append(DEREFSTR(fNegSuffixPattern)) 4205103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)"]->[") 4206103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append(fPositivePrefix).append((UnicodeString)"|").append(fPositiveSuffix) 4207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)";") .append(fNegativePrefix).append((UnicodeString)"|").append(fNegativeSuffix) 4208103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)"]\n"); 4209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(s); 4210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 4211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Expand an affix pattern into an affix string. All characters in the 4215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pattern are literal unless prefixed by kQuote. The following characters 4216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * after kQuote are recognized: PATTERN_PERCENT, PATTERN_PER_MILLE, 4217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * PATTERN_MINUS, and kCurrencySign. If kCurrencySign is doubled (kQuote + 4218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * kCurrencySign + kCurrencySign), it is interpreted as an international 421950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * currency sign. If CURRENCY_SIGN is tripled, it is interpreted as 4220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * currency plural long names, such as "US Dollars". 4221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Any other character after a kQuote represents itself. 4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * kQuote must be followed by another character; kQuote may not occur by 4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * itself at the end of the pattern. 4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This method is used in two distinct ways. First, it is used to expand 4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the stored affix patterns into actual affixes. For this usage, doFormat 4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * must be false. Second, it is used to expand the stored affix patterns 4228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * given a specific number (doFormat == true), for those rare cases in 4229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which a currency format references a ChoiceFormat (e.g., en_IN display 4230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * name for INR). The number itself is taken from digitList. 4231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When used in the first way, this method has a side effect: It sets 4233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currencyChoice to a ChoiceFormat object, if the currency's display name 4234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in this locale is a ChoiceFormat pattern (very rare). It only does this 4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if currencyChoice is null to start with. 4236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pattern the non-null, fPossibly empty pattern 4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affix string to receive the expanded equivalent of pattern. 4239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Previous contents are deleted. 4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param doFormat if false, then the pattern will be expanded, and if a 4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency symbol is encountered that expands to a ChoiceFormat, the 4242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currencyChoice member variable will be initialized if it is null. If 4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * doFormat is true, then it is assumed that the currencyChoice has been 4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * created, and it will be used to format the value in digitList. 4245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param pluralCount the plural count. It is only used for currency 4246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * plural format. In which case, it is the plural 4247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * count of the currency amount. For example, 4248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * in en_US, it is the singular "one", or the plural 4249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * "other". For all other cases, it is null, and 4250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * is not being used. 4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::expandAffix(const UnicodeString& pattern, 4253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& affix, 4254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double number, 425550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 4256b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool doFormat, 4257b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* pluralCount) const { 4258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.remove(); 4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<pattern.length(); ) { 4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = pattern.char32At(i); 4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 4262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == kQuote) { 4263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = pattern.char32At(i); 4264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 426550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int beginIdx = affix.length(); 4266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 4267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kCurrencySign: { 4268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // As of ICU 2.2 we use the currency object, and 4269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ignore the currency symbols in the DFS, unless 4270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we have a null currency object. This occurs if 4271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // resurrecting a pre-2.2 object or if the user 4272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // sets a custom DFS. 4273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool intl = i<pattern.length() && 4274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern.char32At(i) == kCurrencySign; 4275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool plural = FALSE; 4276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (intl) { 4277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 4278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru plural = i<pattern.length() && 4279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pattern.char32At(i) == kCurrencySign; 4280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (plural) { 4281b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru intl = FALSE; 4282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++i; 4283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* currencyUChars = getCurrency(); 4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (currencyUChars[0] != 0) { 4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 4288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (plural && pluralCount != NULL) { 4289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // plural name is only needed when pluralCount != null, 4290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // which means when formatting currency plural names. 4291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // For other cases, pluralCount == null, 4292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // and plural names are not needed. 4293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len; 4294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho CharString pluralCountChar; 4295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pluralCountChar.appendInvariantChars(*pluralCount, ec); 4296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool isChoiceFormat; 4297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UChar* s = ucurr_getPluralName(currencyUChars, 4298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fSymbols != NULL ? fSymbols->getLocale().getName() : 4299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Locale::getDefault().getName(), &isChoiceFormat, 4300b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pluralCountChar.data(), &len, &ec); 4301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix += UnicodeString(s, len); 430250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if(intl) { 4304b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho affix.append(currencyUChars, -1); 430550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len; 4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isChoiceFormat; 4309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // If fSymbols is NULL, use default locale 431050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar* s = ucurr_getName(currencyUChars, 431150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fSymbols != NULL ? fSymbols->getLocale().getName() : Locale::getDefault().getName(), 431250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UCURR_SYMBOL_NAME, &isChoiceFormat, &len, &ec); 4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isChoiceFormat) { 4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Two modes here: If doFormat is false, we set up 4315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // currencyChoice. If doFormat is true, we use the 4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // previously created currencyChoice to format the 4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // value in digitList. 4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!doFormat) { 4319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the currency is handled by a ChoiceFormat, 4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // then we're not going to use the expanded 4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // patterns. Instantiate the ChoiceFormat and 4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // return. 4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fCurrencyChoice == NULL) { 4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TODO Replace double-check with proper thread-safe code 4325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ChoiceFormat* fmt = new ChoiceFormat(UnicodeString(s), ec); 4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(ec)) { 4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 4328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fCurrencyChoice == NULL) { 4329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Cast away const 4330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((DecimalFormat*)this)->fCurrencyChoice = fmt; 4331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt = NULL; 4332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We could almost return null or "" here, since the 4338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // expanded affixes are almost not used at all 4339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // in this situation. However, one method -- 4340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // toPattern() -- still does use the expanded 4341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // affixes, in order to set up a padding 4342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pattern. We use the CURRENCY_SIGN as a 4343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // placeholder. 4344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.append(kCurrencySign); 4345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fCurrencyChoice != NULL) { 4347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(0); // ignored 4348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (number < 0) { 4349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru number = -number; 4350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fCurrencyChoice->format(number, affix, pos); 4352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We only arrive here if the currency choice 4354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // format in the locale data is INVALID. 4355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho affix.append(currencyUChars, -1); 435650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += UnicodeString(s, len); 436250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(intl) { 4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kCurrencySymbol); 4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 437050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPercent: 4375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 437650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPercentField, beginIdx, affix.length()); 4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPerMill: 4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 438050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPermillField, beginIdx, affix.length()); 4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPlus: 4383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 438450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kSignField, beginIdx, affix.length()); 4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternMinus: 4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 438850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kSignField, beginIdx, affix.length()); 4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.append(c); 4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.append(c); 4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Append an affix to the given StringBuffer. 4403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param buf buffer to append to 4404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isNegative 4405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isPrefix 4406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::appendAffix(UnicodeString& buf, double number, 440850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isNegative, UBool isPrefix) const { 4410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // plural format precedes choice format 441150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fCurrencyChoice != 0 && 4412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencySignCount != fgCurrencySignCountInPluralFormat) { 4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affixPat; 4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isPrefix) { 4415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPat = isNegative ? fNegPrefixPattern : fPosPrefixPattern; 4416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPat = isNegative ? fNegSuffixPattern : fPosSuffixPattern; 4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affixPat) { 4420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString affixBuf; 442150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*affixPat, affixBuf, number, handler, TRUE, NULL); 4422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.append(affixBuf); 4423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return affixBuf.length(); 4424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // else someone called a function that reset the pattern. 4426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 442750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affix; 4429b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount == fgCurrencySignCountInPluralFormat) { 443059d709d503bab6e2b61931737e662dd293b40578ccornelius // TODO: get an accurate count of visible fraction digits. 443159d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString pluralCount; 443259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t minFractionDigits = this->getMinimumFractionDigits(); 443359d709d503bab6e2b61931737e662dd293b40578ccornelius if (minFractionDigits > 0) { 443459d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal ni(number, this->getMinimumFractionDigits()); 443559d709d503bab6e2b61931737e662dd293b40578ccornelius pluralCount = fCurrencyPluralInfo->getPluralRules()->select(ni); 443659d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 443759d709d503bab6e2b61931737e662dd293b40578ccornelius pluralCount = fCurrencyPluralInfo->getPluralRules()->select(number); 443859d709d503bab6e2b61931737e662dd293b40578ccornelius } 4439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* oneSet; 4440b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 4441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru oneSet = (AffixesForCurrency*)fPluralAffixesForCurrency->get(pluralCount); 4442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 4443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru oneSet = (AffixesForCurrency*)fAffixesForCurrency->get(pluralCount); 4444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (isPrefix) { 444650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix = isNegative ? &oneSet->negPrefixForCurrency : 4447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &oneSet->posPrefixForCurrency; 4448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 444950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix = isNegative ? &oneSet->negSuffixForCurrency : 4450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &oneSet->posSuffixForCurrency; 4451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (isPrefix) { 4454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix = isNegative ? &fNegativePrefix : &fPositivePrefix; 4455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 4456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix = isNegative ? &fNegativeSuffix : &fPositiveSuffix; 4457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 445950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 446050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t begin = (int) buf.length(); 446150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.append(*affix); 446350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 446450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (handler.isRecording()) { 446550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kCurrencySymbol)); 446650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 446750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kCurrencySymbol); 446850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, begin + offset, begin + offset + aff.length()); 446950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 447050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 447150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); 447250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 447350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 447450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, begin + offset, begin + offset + aff.length()); 447550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 447650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 447750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)); 447850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 447950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 448050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kSignField, begin + offset, begin + offset + aff.length()); 448150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 448250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 448350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kPercentSymbol)); 448450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 448550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 448650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPercentField, begin + offset, begin + offset + aff.length()); 448750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 448850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 448950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kPerMillSymbol)); 449050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 449150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 449250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPermillField, begin + offset, begin + offset + aff.length()); 449350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 449450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 4495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return affix->length(); 4496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Appends an affix pattern to the given StringBuffer, quoting special 4500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * characters as needed. Uses the internal affix pattern, if that exists, 4501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or the literal affix, if the internal affix pattern is null. The 4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * appended string will generate the same affix pattern (or literal affix) 4503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * when passed to toPattern(). 4504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param appendTo the affix string is appended to this 4506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affixPattern a pattern such as fPosPrefixPattern; may be null 4507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expAffix a corresponding expanded affix, such as fPositivePrefix. 4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Ignored unless affixPattern is null. If affixPattern is null, then 4509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * expAffix is appended as a literal affix. 4510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param localized true if the appended pattern should contain localized 4511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pattern characters; otherwise, non-localized pattern chars are appended 4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::appendAffixPattern(UnicodeString& appendTo, 4514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affixPattern, 4515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expAffix, 4516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool localized) const { 4517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affixPattern == 0) { 4518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(appendTo, expAffix, localized); 4519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 4521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int pos=0; pos<affixPattern->length(); pos=i) { 4522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = affixPattern->indexOf(kQuote, pos); 4523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i < 0) { 4524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 4525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPattern->extractBetween(pos, affixPattern->length(), s); 4526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(appendTo, s, localized); 4527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i > pos) { 4530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 4531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPattern->extractBetween(pos, i, s); 4532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(appendTo, s, localized); 4533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = affixPattern->char32At(++i); 4535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 4536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == kQuote) { 4537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c).append(c); 4538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Fall through and append another kQuote below 4539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (c == kCurrencySign && 4540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i<affixPattern->length() && 4541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPattern->char32At(i) == kCurrencySign) { 4542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 4543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c).append(c); 4544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (localized) { 4545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 4546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPercent: 4547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 4548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPerMill: 4550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 4551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPlus: 4553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 4554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternMinus: 4556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 4557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 4559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c); 4560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c); 4563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Append an affix to the given StringBuffer, using quotes if 4570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * there are special characters. Single quotes themselves must be 4571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * escaped in either case. 4572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::appendAffixPattern(UnicodeString& appendTo, 4575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& affix, 4576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool localized) const { 4577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool needQuote; 4578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(localized) { 4579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru needQuote = affix.indexOf(getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol)) >= 0 4580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)) >= 0 4581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)) >= 0 4582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPercentSymbol)) >= 0 4583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPerMillSymbol)) >= 0 4584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kDigitSymbol)) >= 0 4585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol)) >= 0 4586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol)) >= 0 4587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)) >= 0 4588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kCurrencySign) >= 0; 4589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru needQuote = affix.indexOf(kPatternZeroDigit) >= 0 4592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternGroupingSeparator) >= 0 4593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternDecimalSeparator) >= 0 4594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternPercent) >= 0 4595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternPerMill) >= 0 4596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternDigit) >= 0 4597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternSeparator) >= 0 4598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternExponent) >= 0 4599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternPlus) >= 0 4600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternMinus) >= 0 4601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kCurrencySign) >= 0; 4602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (needQuote) 4604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += (UChar)0x0027 /*'\''*/; 4605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affix.indexOf((UChar)0x0027 /*'\''*/) < 0) 4606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += affix; 4607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t j = 0; j < affix.length(); ) { 4609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = affix.char32At(j); 4610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j += U16_LENGTH(c); 4611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 4612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == 0x0027 /*'\''*/) 4613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 4614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (needQuote) 4617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += (UChar)0x0027 /*'\''*/; 4618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 4623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::toPattern(UnicodeString& result, UBool localized) const 4624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4625b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 4626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // the prefix or suffix pattern might not be defined yet, 4627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // so they can not be synthesized, 4628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // instead, get them directly. 4629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // but it might not be the actual pattern used in formatting. 463050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the actual pattern used in formatting depends on the 4631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // formatted number's plural count. 4632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru result = fFormatPattern; 4633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return result; 4634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 4636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 zero, sigDigit = kPatternSignificantDigit; 4637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString digit, group; 4638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 4639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t roundingDecimalPos = 0; // Pos of decimal in roundingDigits 4640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString roundingDigits; 4641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t padPos = (fFormatWidth > 0) ? fPadPosition : -1; 4642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString padSpec; 4643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool useSigDig = areSignificantDigitsUsed(); 4644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit.append(getConstSymbol(DecimalFormatSymbols::kDigitSymbol)); 4647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru group.append(getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); 4648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zero = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); 4649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 4650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sigDigit = getConstSymbol(DecimalFormatSymbols::kSignificantDigitSymbol).char32At(0); 4651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit.append((UChar)kPatternDigit); 4655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru group.append((UChar)kPatternGroupingSeparator); 4656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zero = (UChar32)kPatternZeroDigit; 4657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0) { 4659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padSpec.append(getConstSymbol(DecimalFormatSymbols::kPadEscapeSymbol)); 4661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padSpec.append((UChar)kPatternPadEscape); 4664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padSpec.append(fPad); 4666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fRoundingIncrement != NULL) { 466850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i=0; i<fRoundingIncrement->getCount(); ++i) { 466927f654740f2a26ad62a5c155af9199af9e69b889claireho roundingDigits.append(zero+(fRoundingIncrement->getDigitValue(i))); // Convert to Unicode digit 4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 467150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho roundingDecimalPos = fRoundingIncrement->getDecimalAt(); 4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t part=0; part<2; ++part) { 4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (padPos == kPadBeforePrefix) { 4675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(result, 4678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (part==0 ? fPosPrefixPattern : fNegPrefixPattern), 4679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (part==0 ? fPositivePrefix : fNegativePrefix), 4680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localized); 4681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (padPos == kPadAfterPrefix && ! padSpec.isEmpty()) { 4682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sub0Start = result.length(); 4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t g = isGroupingUsed() ? _max(0, fGroupingSize) : 0; 4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (g > 0 && fGroupingSize2 > 0 && fGroupingSize2 != fGroupingSize) { 4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru g += fGroupingSize2; 4688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxDig = 0, minDig = 0, maxSigDig = 0; 4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minDig = getMinimumSignificantDigits(); 4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = maxSigDig = getMaximumSignificantDigits(); 4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minDig = getMinimumIntegerDigits(); 4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = getMaximumIntegerDigits(); 4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation) { 4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxDig > kMaxScientificIntegerDigits) { 4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = 1; 4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (useSigDig) { 4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = _max(maxDig, g+1); 4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = _max(_max(g, getMinimumIntegerDigits()), 4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundingDecimalPos) + 1; 4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = maxDig; i > 0; --i) { 4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!fUseExponentialNotation && i<maxDig && 4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru isGroupingPosition(i)) { 4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(group); 4711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 4713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // #@,@### (maxSigDig == 5, minSigDig == 2) 4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 65 4321 (1-based pos, count from the right) 4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use # if pos > maxSigDig or 1 <= pos <= (maxSigDig - minSigDig) 4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use @ if (maxSigDig - minSigDig) < pos <= maxSigDig 4717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxSigDig >= i && i > (maxSigDig - minDig)) { 4718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(sigDigit); 4719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(digit); 4721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! roundingDigits.isEmpty()) { 4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos = roundingDecimalPos - i; 4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos >= 0 && pos < roundingDigits.length()) { 4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar) (roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); 4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i<=minDig) { 4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(digit); 4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!useSigDig) { 4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getMaximumFractionDigits() > 0 || fDecimalSeparatorAlwaysShown) { 4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternDecimalSeparator); 4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos = roundingDecimalPos; 4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < getMaximumFractionDigits(); ++i) { 4748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! roundingDigits.isEmpty() && pos < roundingDigits.length()) { 4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos < 0) { 4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)(roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); 4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++pos; 4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i<getMinimumFractionDigits()) { 4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(digit); 4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation) { 4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); 4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternExponent); 4772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fExponentSignAlwaysShown) { 4774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 4776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternPlus); 4779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<fMinExponentDigits; ++i) { 4782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! padSpec.isEmpty() && !fUseExponentialNotation) { 4786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t add = fFormatWidth - result.length() + sub0Start 4787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - ((part == 0) 4788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? fPositivePrefix.length() + fPositiveSuffix.length() 4789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : fNegativePrefix.length() + fNegativeSuffix.length()); 4790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (add > 0) { 4791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.insert(sub0Start, digit); 4792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++maxDig; 4793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --add; 4794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Only add a grouping separator if we have at least 4795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 2 additional characters to be added, so we don't 4796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // end up with ",###". 4797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (add>1 && isGroupingPosition(maxDig)) { 4798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.insert(sub0Start, group); 479950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho --add; 4800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPadPosition == kPadBeforeSuffix && ! padSpec.isEmpty()) { 4804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (part == 0) { 4807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(result, fPosSuffixPattern, fPositiveSuffix, localized); 4808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPadPosition == kPadAfterSuffix && ! padSpec.isEmpty()) { 4809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isDefault = FALSE; 4812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((fNegSuffixPattern == fPosSuffixPattern && // both null 4813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix == fPositiveSuffix) 4814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fNegSuffixPattern != 0 && fPosSuffixPattern != 0 && 4815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fNegSuffixPattern == *fPosSuffixPattern)) 4816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegPrefixPattern != NULL && fPosPrefixPattern != NULL) 4818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = fPosPrefixPattern->length(); 4820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru isDefault = fNegPrefixPattern->length() == (length+2) && 4821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (*fNegPrefixPattern)[(int32_t)0] == kQuote && 4822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (*fNegPrefixPattern)[(int32_t)1] == kPatternMinus && 4823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern->compare(2, length, *fPosPrefixPattern, 0, length) == 0; 4824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!isDefault && 4826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern == NULL && fPosPrefixPattern == NULL) 4827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = fPositivePrefix.length(); 4829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru isDefault = fNegativePrefix.length() == (length+1) && 4830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix.compare(getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)) == 0 && 4831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix.compare(1, length, fPositivePrefix, 0, length) == 0; 4832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isDefault) { 4835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; // Don't output default negative subpattern 4836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol); 4839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternSeparator); 4842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(result, fNegSuffixPattern, fNegativeSuffix, localized); 4846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPadPosition == kPadAfterSuffix && ! padSpec.isEmpty()) { 4847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 4853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) 4859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, FALSE, parseError, status); 4862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyPattern(const UnicodeString& pattern, 486850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UParseError& parseError, 4869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 4870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, FALSE, parseError, status); 4872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status) 4877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, TRUE,parseError,status); 4880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyLocalizedPattern(const UnicodeString& pattern, 4886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError& parseError, 4887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 4888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, TRUE,parseError,status); 4890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4895b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::applyPatternWithoutExpandAffix(const UnicodeString& pattern, 4896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool localized, 4897b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError& parseError, 4898b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) 4899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 4901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4904fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius DecimalFormatPatternParser patternParser; 4905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4906fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius patternParser.useSymbols(*fSymbols); 4907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4908fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatPattern = pattern; 4909fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius DecimalFormatPattern out; 4910fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius patternParser.applyPatternWithoutExpandAffix( 4911fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pattern, 4912fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius out, 4913fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius parseError, 4914fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius status); 4915fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (U_FAILURE(status)) { 4916fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 4917fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4918fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 4919fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMinimumIntegerDigits(out.fMinimumIntegerDigits); 4920fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMaximumIntegerDigits(out.fMaximumIntegerDigits); 4921fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMinimumFractionDigits(out.fMinimumFractionDigits); 4922fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMaximumFractionDigits(out.fMaximumFractionDigits); 4923fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setSignificantDigitsUsed(out.fUseSignificantDigits); 4924fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fUseSignificantDigits) { 4925fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMinimumSignificantDigits(out.fMinimumSignificantDigits); 4926fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMaximumSignificantDigits(out.fMaximumSignificantDigits); 4927fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4928fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fUseExponentialNotation = out.fUseExponentialNotation; 4929fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fUseExponentialNotation) { 4930fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fMinExponentDigits = out.fMinExponentDigits; 4931fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4932fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fExponentSignAlwaysShown = out.fExponentSignAlwaysShown; 4933fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fCurrencySignCount = out.fCurrencySignCount; 4934fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setGroupingUsed(out.fGroupingUsed); 4935fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fGroupingUsed) { 4936fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fGroupingSize = out.fGroupingSize; 4937fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fGroupingSize2 = out.fGroupingSize2; 4938fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4939fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMultiplier(out.fMultiplier); 4940fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fDecimalSeparatorAlwaysShown = out.fDecimalSeparatorAlwaysShown; 4941fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatWidth = out.fFormatWidth; 4942fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fRoundingIncrementUsed) { 4943fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fRoundingIncrement != NULL) { 4944fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fRoundingIncrement = out.fRoundingIncrement; 4945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4946fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fRoundingIncrement = new DigitList(out.fRoundingIncrement); 4947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 4948fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fRoundingIncrement == NULL) { 4949fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius status = U_MEMORY_ALLOCATION_ERROR; 4950fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 4951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4953fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 4954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setRoundingIncrement(0.0); 4955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4956fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPad = out.fPad; 4957fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius switch (out.fPadPosition) { 4958fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadBeforePrefix: 4959fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadBeforePrefix; 4960fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 4961fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadAfterPrefix: 4962fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadAfterPrefix; 4963fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 4964fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadBeforeSuffix: 4965fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadBeforeSuffix; 4966fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 4967fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadAfterSuffix: 4968fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadAfterSuffix; 4969fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 4970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4971fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fNegPrefixPattern, out.fNegPatternsBogus, fNegPrefixPattern, status); 4972fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fNegSuffixPattern, out.fNegPatternsBogus, fNegSuffixPattern, status); 4973fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fPosPrefixPattern, out.fPosPatternsBogus, fPosPrefixPattern, status); 4974fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fPosSuffixPattern, out.fPosPatternsBogus, fPosSuffixPattern, status); 4975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 4976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 4979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::expandAffixAdjustWidth(const UnicodeString* pluralCount) { 4980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixes(pluralCount); 4981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0) { 4982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Finish computing format width (see above) 498350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TODO: how to handle fFormatWidth, 4984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // need to save in f(Plural)AffixesForCurrecy? 4985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fFormatWidth += fPositivePrefix.length() + fPositiveSuffix.length(); 4986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 4990b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 4991b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::applyPattern(const UnicodeString& pattern, 4992b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool localized, 4993b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError& parseError, 4994b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) 499550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 4996b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // do the following re-set first. since they change private data by 4997b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // apply pattern again. 4998b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (pattern.indexOf(kCurrencySign) != -1) { 499950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fCurrencyPluralInfo == NULL) { 500050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // initialize currencyPluralInfo if needed 5001b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = new CurrencyPluralInfo(fSymbols->getLocale(), status); 5002b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5003b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fAffixPatternsForCurrency == NULL) { 5004b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixPatterns(status); 5005b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5006b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pattern.indexOf(fgTripleCurrencySign, 3, 0) != -1) { 5007b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // only setup the affixes of the current pattern. 5008b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(pattern, TRUE, FALSE, status); 5009b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5010b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5011b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(pattern, localized, parseError, status); 5012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixAdjustWidth(NULL); 5013103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5014103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5015103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5016b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5017b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 502050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::applyPatternInternally(const UnicodeString& pluralCount, 5021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString& pattern, 5022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool localized, 5023b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError& parseError, 5024b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 5025b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(pattern, localized, parseError, status); 5026b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixAdjustWidth(&pluralCount); 5027103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5028103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5029103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5032b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the maximum number of digits allowed in the integer portion of a 503559d709d503bab6e2b61931737e662dd293b40578ccornelius * number. 5036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMaximumIntegerDigits 5037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { 503959d709d503bab6e2b61931737e662dd293b40578ccornelius NumberFormat::setMaximumIntegerDigits(_min(newValue, gDefaultMaxIntegerDigits)); 5040103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5041103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5042103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the minimum number of digits allowed in the integer portion of a 5047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number. This override limits the integer digit count to 309. 5048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMinimumIntegerDigits 5049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { 5051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setMinimumIntegerDigits(_min(newValue, kDoubleIntegerDigits)); 5052103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5053103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5054103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the maximum number of digits allowed in the fraction portion of a 5059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number. This override limits the fraction digit count to 340. 5060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMaximumFractionDigits 5061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMaximumFractionDigits(int32_t newValue) { 5063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setMaximumFractionDigits(_min(newValue, kDoubleFractionDigits)); 5064103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5065103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5066103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the minimum number of digits allowed in the fraction portion of a 5071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number. This override limits the fraction digit count to 340. 5072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMinimumFractionDigits 5073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumFractionDigits(int32_t newValue) { 5075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setMinimumFractionDigits(_min(newValue, kDoubleFractionDigits)); 5076103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5077103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5078103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::getMinimumSignificantDigits() const { 5082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fMinSignificantDigits; 5083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::getMaximumSignificantDigits() const { 5086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fMaxSignificantDigits; 5087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumSignificantDigits(int32_t min) { 5090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (min < 1) { 509150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho min = 1; 5092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pin max sig dig to >= min 5094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t max = _max(fMaxSignificantDigits, min); 5095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinSignificantDigits = min; 5096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMaxSignificantDigits = max; 509759d709d503bab6e2b61931737e662dd293b40578ccornelius fUseSignificantDigits = TRUE; 5098103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5099103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5100103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMaximumSignificantDigits(int32_t max) { 5104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (max < 1) { 5105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru max = 1; 5106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pin min sig dig to 1..max 5108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(fMinSignificantDigits >= 1); 5109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t min = _min(fMinSignificantDigits, max); 5110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinSignificantDigits = min; 5111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMaxSignificantDigits = max; 511259d709d503bab6e2b61931737e662dd293b40578ccornelius fUseSignificantDigits = TRUE; 5113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool DecimalFormat::areSignificantDigitsUsed() const { 5119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fUseSignificantDigits; 5120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { 5123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseSignificantDigits = useSignificantDigits; 5124103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5125103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 512950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid DecimalFormat::setCurrencyInternally(const UChar* theCurrency, 5130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& ec) { 5131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we are a currency format, then modify our affixes to 5132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // encode the currency symbol for the given currency in our 5133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // locale, and adjust the decimal digits and rounding for the 5134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // given currency. 5135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Note: The code is ordered so that this object is *not changed* 5137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // until we are sure we are going to succeed. 513850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NULL or empty currency is *legal* and indicates no currency. 5140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isCurr = (theCurrency && *theCurrency); 5141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double rounding = 0.0; 5143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t frac = 0; 514459d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero && isCurr) { 5145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rounding = ucurr_getRoundingIncrement(theCurrency, &ec); 5146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru frac = ucurr_getDefaultFractionDigits(theCurrency, &ec); 5147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 514850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setCurrency(theCurrency, ec); 5150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) return; 5151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 515259d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 5153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NULL or empty currency is *legal* and indicates no currency. 5154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isCurr) { 5155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setRoundingIncrement(rounding); 5156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setMinimumFractionDigits(frac); 5157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setMaximumFractionDigits(frac); 5158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixes(NULL); 5160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid DecimalFormat::setCurrency(const UChar* theCurrency, UErrorCode& ec) { 5167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // set the currency before compute affixes to get the right currency names 5168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru NumberFormat::setCurrency(theCurrency, ec); 5169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fFormatPattern.indexOf(fgTripleCurrencySign, 3, 0) != -1) { 5170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString savedPtn = fFormatPattern; 5171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(fFormatPattern, TRUE, TRUE, ec); 5172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseErr; 5173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPattern(savedPtn, FALSE, parseErr, ec); 5174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // set the currency after apply pattern to get the correct rounding/fraction 5176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(theCurrency, ec); 5177103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5178103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5179103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Deprecated variant with no UErrorCode parameter 5183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setCurrency(const UChar* theCurrency) { 5184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 5185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setCurrency(theCurrency, ec); 5186103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5187103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5188103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid DecimalFormat::getEffectiveCurrency(UChar* result, UErrorCode& ec) const { 5192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (fSymbols == NULL) { 5193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ec = U_MEMORY_ALLOCATION_ERROR; 5194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 5195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 5196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ec = U_ZERO_ERROR; 5197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* c = getCurrency(); 5198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*c == 0) { 5199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString &intl = 5200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols->getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 5201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = intl.getBuffer(); // ok for intl to go out of scope 5202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strncpy(result, c, 3); 5204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[3] = 0; 5205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the number of fraction digits to display, or the total 5209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number of digits for significant digit formats and exponential 5210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * formats. 5211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 521350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::precision() const { 5214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (areSignificantDigitsUsed()) { 5215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getMaximumSignificantDigits(); 5216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (fUseExponentialNotation) { 5217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getMinimumIntegerDigits() + getMaximumFractionDigits(); 5218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 521950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getMaximumFractionDigits(); 5220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// TODO: template algorithm 5225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruHashtable* 5226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::initHashForAffix(UErrorCode& status) { 5227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* hTable; 5231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (hTable = new Hashtable(TRUE, status)) == NULL ) { 5232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 5233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_FAILURE(status) ) { 5236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete hTable; 5237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 5238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 523950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho hTable->setValueComparator(decimfmtAffixValueComparator); 5240b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return hTable; 5241b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5242b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5243b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruHashtable* 5244b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::initHashForAffixPattern(UErrorCode& status) { 5245b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5246b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5247b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5248b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* hTable; 5249b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (hTable = new Hashtable(TRUE, status)) == NULL ) { 5250b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 5251b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5252b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_FAILURE(status) ) { 5254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete hTable; 5255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 5256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 525750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho hTable->setValueComparator(decimfmtAffixPatternValueComparator); 5258b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return hTable; 5259b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5260b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5261b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 526250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::deleteHashForAffix(Hashtable*& table) 5263b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 5264b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( table == NULL ) { 5265b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5266b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5267b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t pos = -1; 5268b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5269b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = table->nextElement(pos)) != NULL ) { 5270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixesForCurrency* value = (AffixesForCurrency*)valueTok.pointer; 5272b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete value; 5273b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5274b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete table; 5275b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru table = NULL; 5276b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5277b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5278b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5279b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5280b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 528150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::deleteHashForAffixPattern() 5282b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 5283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( fAffixPatternsForCurrency == NULL ) { 5284b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t pos = -1; 5287b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = fAffixPatternsForCurrency->nextElement(pos)) != NULL ) { 5289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixPatternsForCurrency* value = (AffixPatternsForCurrency*)valueTok.pointer; 5291b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete value; 5292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5293b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete fAffixPatternsForCurrency; 5294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency = NULL; 5295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 5299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::copyHashForAffixPattern(const Hashtable* source, 5300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* target, 5301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 5302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t pos = -1; 5306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( source ) { 5308b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = source->nextElement(pos)) != NULL ) { 5309b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok keyTok = element->key; 5310b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* key = (UnicodeString*)keyTok.pointer; 5311b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixPatternsForCurrency* value = (AffixPatternsForCurrency*)valueTok.pointer; 5313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixPatternsForCurrency* copy = new AffixPatternsForCurrency( 5314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negPrefixPatternForCurrency, 5315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negSuffixPatternForCurrency, 5316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posPrefixPatternForCurrency, 5317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posSuffixPatternForCurrency, 5318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->patternType); 5319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru target->put(UnicodeString(*key), copy, status); 5320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5326b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5327fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// this is only overridden to call handleChanged() for fastpath purposes. 5328fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid 5329fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDecimalFormat::setGroupingUsed(UBool newValue) { 5330fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::setGroupingUsed(newValue); 5331fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius handleChanged(); 5332fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 5333fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 5334fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// this is only overridden to call handleChanged() for fastpath purposes. 5335fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid 5336fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDecimalFormat::setParseIntegerOnly(UBool newValue) { 5337fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::setParseIntegerOnly(newValue); 5338fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius handleChanged(); 5339fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 5340fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 5341fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// this is only overridden to call handleChanged() for fastpath purposes. 5342fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// setContext doesn't affect the fastPath right now, but this is called for completeness 5343fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid 5344fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDecimalFormat::setContext(UDisplayContext value, UErrorCode& status) { 5345fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::setContext(value, status); 5346fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius handleChanged(); 5347fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 5348fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 5349fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 535054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat& DecimalFormat::setAttribute( UNumberFormatAttribute attr, 535154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t newValue, 535254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status) { 535354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) return *this; 535454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 535554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius switch(attr) { 535654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_LENIENT_PARSE: 535754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setLenient(newValue!=0); 535854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 535954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 536054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_INT_ONLY: 536154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setParseIntegerOnly(newValue!=0); 536254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 536354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 536454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_USED: 536554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setGroupingUsed(newValue!=0); 536654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 536754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 536854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_DECIMAL_ALWAYS_SHOWN: 536954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setDecimalSeparatorAlwaysShown(newValue!=0); 537054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 537154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 537254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_INTEGER_DIGITS: 537354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumIntegerDigits(newValue); 537454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 537554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 537654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_INTEGER_DIGITS: 537754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumIntegerDigits(newValue); 537854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 537954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 538054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_INTEGER_DIGITS: 538154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumIntegerDigits(newValue); 538254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumIntegerDigits(newValue); 538354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 538454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 538554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_FRACTION_DIGITS: 538654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumFractionDigits(newValue); 538754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 538854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 538954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_FRACTION_DIGITS: 539054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumFractionDigits(newValue); 539154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 539254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 539354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FRACTION_DIGITS: 539454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumFractionDigits(newValue); 539554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumFractionDigits(newValue); 539654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 539754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 539854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SIGNIFICANT_DIGITS_USED: 539954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setSignificantDigitsUsed(newValue!=0); 540054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 540154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 540254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_SIGNIFICANT_DIGITS: 540354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumSignificantDigits(newValue); 540454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 540554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 540654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_SIGNIFICANT_DIGITS: 540754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumSignificantDigits(newValue); 540854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 540954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 541054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MULTIPLIER: 541154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMultiplier(newValue); 541254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 541354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 541454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_SIZE: 541554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setGroupingSize(newValue); 541654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 541754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 541854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_ROUNDING_MODE: 541954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setRoundingMode((DecimalFormat::ERoundingMode)newValue); 542054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 542154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 542254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_WIDTH: 542354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setFormatWidth(newValue); 542454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 542554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 542654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PADDING_POSITION: 542754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /** The position at which padding will take place. */ 542854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setPadPosition((DecimalFormat::EPadPosition)newValue); 542954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 543054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 543154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SECONDARY_GROUPING_SIZE: 543254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setSecondaryGroupingSize(newValue); 543354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 543454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 543554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 543654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_ALL_INPUT: 543754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setParseAllInput((UNumberFormatAttributeValue)newValue); 543854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 543954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 544054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 544154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* These are stored in fBoolFlags */ 544254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_NO_EXPONENT: 544354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS: 544454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!fBoolFlags.isValidValue(newValue)) { 544554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ILLEGAL_ARGUMENT_ERROR; 544654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 544754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fBoolFlags.set(attr, newValue); 544854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 544954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 545054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 54518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius case UNUM_SCALE: 54528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius fScale = newValue; 54538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius break; 54548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 545554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius default: 545654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_UNSUPPORTED_ERROR; 545754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 545854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 545954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return *this; 546054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 546154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 546254dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusint32_t DecimalFormat::getAttribute( UNumberFormatAttribute attr, 546354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status ) const { 546454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) return -1; 546554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius switch(attr) { 546654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_LENIENT_PARSE: 546754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isLenient(); 546854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 546954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_INT_ONLY: 547054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isParseIntegerOnly(); 547154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 547254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_USED: 547354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isGroupingUsed(); 547454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 547554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_DECIMAL_ALWAYS_SHOWN: 547654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isDecimalSeparatorAlwaysShown(); 547754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 547854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_INTEGER_DIGITS: 547954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMaximumIntegerDigits(); 548054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 548154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_INTEGER_DIGITS: 548254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumIntegerDigits(); 548354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 548454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_INTEGER_DIGITS: 548554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // TBD: what should this return? 548654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumIntegerDigits(); 548754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 548854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_FRACTION_DIGITS: 548954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMaximumFractionDigits(); 549054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 549154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_FRACTION_DIGITS: 549254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumFractionDigits(); 549354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 549454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FRACTION_DIGITS: 549554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // TBD: what should this return? 549654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumFractionDigits(); 549754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 549854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SIGNIFICANT_DIGITS_USED: 549954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return areSignificantDigitsUsed(); 550054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 550154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_SIGNIFICANT_DIGITS: 550254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMaximumSignificantDigits(); 550354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 550454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_SIGNIFICANT_DIGITS: 550554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumSignificantDigits(); 550654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 550754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MULTIPLIER: 550854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMultiplier(); 550954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 551054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_SIZE: 551154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getGroupingSize(); 551254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 551354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_ROUNDING_MODE: 551454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getRoundingMode(); 551554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 551654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_WIDTH: 551754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getFormatWidth(); 551854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 551954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PADDING_POSITION: 552054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getPadPosition(); 552154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 552254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SECONDARY_GROUPING_SIZE: 552354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getSecondaryGroupingSize(); 552454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 552554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* These are stored in fBoolFlags */ 552654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_NO_EXPONENT: 552754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS: 552854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return fBoolFlags.get(attr); 552954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 55308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius case UNUM_SCALE: 55318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return fScale; 55328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 553354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius default: 553454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_UNSUPPORTED_ERROR; 553554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 553654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 553754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 553854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return -1; /* undefined */ 553954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 554054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 5541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 5542103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid DecimalFormat::setParseAllInput(UNumberFormatAttributeValue value) { 5543103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fParseAllInput = value; 5544103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5545103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5546103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5547103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 5548103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5550b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 5551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::copyHashForAffix(const Hashtable* source, 5552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* target, 5553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 5554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t pos = -1; 5558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( source ) { 5560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = source->nextElement(pos)) != NULL ) { 5561b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok keyTok = element->key; 5562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* key = (UnicodeString*)keyTok.pointer; 5563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5564b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixesForCurrency* value = (AffixesForCurrency*)valueTok.pointer; 5566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* copy = new AffixesForCurrency( 5567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negPrefixForCurrency, 5568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negSuffixForCurrency, 5569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posPrefixForCurrency, 5570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posSuffixForCurrency); 5571b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru target->put(UnicodeString(*key), copy, status); 5572b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5573b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5574b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5575b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5576b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5577b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5578b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 5580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 5582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof 5584