1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 31b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert* Copyright (C) 1997-2015, 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" 751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "fmtableimp.h" 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/* 788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * On certain platforms, round is a macro defined in math.h 798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * This undefine is to avoid conflict between the macro and 808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * the function defined below. 818393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 828393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#ifdef round 838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#undef round 848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif 858393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 8659d709d503bab6e2b61931737e662dd293b40578ccornelius 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8959d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 9059d709d503bab6e2b61931737e662dd293b40578ccornelius#include <stdio.h> 9159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void _debugout(const char *f, int l, const UnicodeString& s) { 9259d709d503bab6e2b61931737e662dd293b40578ccornelius char buf[2000]; 9359d709d503bab6e2b61931737e662dd293b40578ccornelius s.extract((int32_t) 0, s.length(), buf, "utf-8"); 9459d709d503bab6e2b61931737e662dd293b40578ccornelius printf("%s:%d: %s\n", f,l, buf); 9559d709d503bab6e2b61931737e662dd293b40578ccornelius} 9659d709d503bab6e2b61931737e662dd293b40578ccornelius#define debugout(x) _debugout(__FILE__,__LINE__,x) 9759d709d503bab6e2b61931737e662dd293b40578ccornelius#define debug(x) printf("%s:%d: %s\n", __FILE__,__LINE__, x); 9859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UnicodeString dbg_null("<NULL>",""); 9959d709d503bab6e2b61931737e662dd293b40578ccornelius#define DEREFSTR(x) ((x!=NULL)?(*x):(dbg_null)) 10059d709d503bab6e2b61931737e662dd293b40578ccornelius#else 10159d709d503bab6e2b61931737e662dd293b40578ccornelius#define debugout(x) 10259d709d503bab6e2b61931737e662dd293b40578ccornelius#define debug(x) 10359d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 10459d709d503bab6e2b61931737e662dd293b40578ccornelius 10554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 107103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius/* == Fastpath calculation. == 108103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 109103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 110103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusinline DecimalFormatInternal& internalData(uint8_t *reserved) { 111103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return *reinterpret_cast<DecimalFormatInternal*>(reserved); 112103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 113103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusinline const DecimalFormatInternal& internalData(const uint8_t *reserved) { 114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return *reinterpret_cast<const DecimalFormatInternal*>(reserved); 115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 117103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 118103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* For currency parsing purose, 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Need to remember all prefix patterns and suffix patterns of 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * every currency format pattern, 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * including the pattern of default currecny style 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * and plural currency style. And the patterns are set through applyPattern. 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct AffixPatternsForCurrency : public UMemory { 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative prefix pattern 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negPrefixPatternForCurrency; 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative suffix pattern 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negSuffixPatternForCurrency; 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive prefix pattern 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posPrefixPatternForCurrency; 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive suffix pattern 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posSuffixPatternForCurrency; 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int8_t patternType; 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho AffixPatternsForCurrency(const UnicodeString& negPrefix, 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& negSuffix, 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posPrefix, 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posSuffix, 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int8_t type) { 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negPrefixPatternForCurrency = negPrefix; 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negSuffixPatternForCurrency = negSuffix; 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posPrefixPatternForCurrency = posPrefix; 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posSuffixPatternForCurrency = posSuffix; 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho patternType = type; 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 14759d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 14859d709d503bab6e2b61931737e662dd293b40578ccornelius void dump() const { 14959d709d503bab6e2b61931737e662dd293b40578ccornelius debugout( UnicodeString("AffixPatternsForCurrency( -=\"") + 15059d709d503bab6e2b61931737e662dd293b40578ccornelius negPrefixPatternForCurrency + (UnicodeString)"\"/\"" + 15159d709d503bab6e2b61931737e662dd293b40578ccornelius negSuffixPatternForCurrency + (UnicodeString)"\" +=\"" + 15259d709d503bab6e2b61931737e662dd293b40578ccornelius posPrefixPatternForCurrency + (UnicodeString)"\"/\"" + 15359d709d503bab6e2b61931737e662dd293b40578ccornelius posSuffixPatternForCurrency + (UnicodeString)"\" )"); 15459d709d503bab6e2b61931737e662dd293b40578ccornelius } 15559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* affix for currency formatting when the currency sign in the pattern 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * equals to 3, such as the pattern contains 3 currency sign or 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * the formatter style is currency plural format style. 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 16250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct AffixesForCurrency : public UMemory { 16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative prefix 16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negPrefixForCurrency; 16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // negative suffix 16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString negSuffixForCurrency; 16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive prefix 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posPrefixForCurrency; 16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // positive suffix 17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString posSuffixForCurrency; 17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t formatWidth; 17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho AffixesForCurrency(const UnicodeString& negPrefix, 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& negSuffix, 17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posPrefix, 17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UnicodeString& posSuffix) { 17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negPrefixForCurrency = negPrefix; 17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho negSuffixForCurrency = negSuffix; 18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posPrefixForCurrency = posPrefix; 18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho posSuffixForCurrency = posSuffix; 18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 18359d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 18459d709d503bab6e2b61931737e662dd293b40578ccornelius void dump() const { 18559d709d503bab6e2b61931737e662dd293b40578ccornelius debugout( UnicodeString("AffixesForCurrency( -=\"") + 18659d709d503bab6e2b61931737e662dd293b40578ccornelius negPrefixForCurrency + (UnicodeString)"\"/\"" + 18759d709d503bab6e2b61931737e662dd293b40578ccornelius negSuffixForCurrency + (UnicodeString)"\" +=\"" + 18859d709d503bab6e2b61931737e662dd293b40578ccornelius posPrefixForCurrency + (UnicodeString)"\"/\"" + 18959d709d503bab6e2b61931737e662dd293b40578ccornelius posSuffixForCurrency + (UnicodeString)"\" )"); 19059d709d503bab6e2b61931737e662dd293b40578ccornelius } 19159d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}; 19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CDECL_BEGIN 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/** 197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @internal ICU 4.2 198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 19950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool U_CALLCONV decimfmtAffixValueComparator(UHashTok val1, UHashTok val2); 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru/** 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @internal ICU 4.2 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 20450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool U_CALLCONV decimfmtAffixPatternValueComparator(UHashTok val1, UHashTok val2); 205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 20750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool 208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CALLCONV decimfmtAffixValueComparator(UHashTok val1, UHashTok val2) { 20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixesForCurrency* affix_1 = 21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixesForCurrency*)val1.pointer; 21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixesForCurrency* affix_2 = 21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixesForCurrency*)val2.pointer; 213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return affix_1->negPrefixForCurrency == affix_2->negPrefixForCurrency && 214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->negSuffixForCurrency == affix_2->negSuffixForCurrency && 215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->posPrefixForCurrency == affix_2->posPrefixForCurrency && 216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->posSuffixForCurrency == affix_2->posSuffixForCurrency; 217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 22050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic UBool 221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruU_CALLCONV decimfmtAffixPatternValueComparator(UHashTok val1, UHashTok val2) { 22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixPatternsForCurrency* affix_1 = 22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixPatternsForCurrency*)val1.pointer; 22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const AffixPatternsForCurrency* affix_2 = 22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (AffixPatternsForCurrency*)val2.pointer; 22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return affix_1->negPrefixPatternForCurrency == 227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->negPrefixPatternForCurrency && 22850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix_1->negSuffixPatternForCurrency == 229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->negSuffixPatternForCurrency && 23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix_1->posPrefixPatternForCurrency == 231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->posPrefixPatternForCurrency && 23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix_1->posSuffixPatternForCurrency == 233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_2->posSuffixPatternForCurrency && 234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix_1->patternType == affix_2->patternType; 235b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 23750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CDECL_END 23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ***************************************************************************** 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class DecimalFormat 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ***************************************************************************** 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(DecimalFormat) 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constants for characters used in programmatic (unlocalized) patterns. 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternZeroDigit ((UChar)0x0030) /*'0'*/ 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternSignificantDigit ((UChar)0x0040) /*'@'*/ 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternGroupingSeparator ((UChar)0x002C) /*','*/ 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternDecimalSeparator ((UChar)0x002E) /*'.'*/ 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPerMill ((UChar)0x2030) 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPercent ((UChar)0x0025) /*'%'*/ 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternDigit ((UChar)0x0023) /*'#'*/ 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternSeparator ((UChar)0x003B) /*';'*/ 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternExponent ((UChar)0x0045) /*'E'*/ 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPlus ((UChar)0x002B) /*'+'*/ 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternMinus ((UChar)0x002D) /*'-'*/ 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kPatternPadEscape ((UChar)0x002A) /*'*'*/ 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kQuote ((UChar)0x0027) /*'\''*/ 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The CURRENCY_SIGN is the standard Unicode symbol for currency. It 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is used in patterns and substitued with either the currency symbol, 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or if it is doubled, with the international currency symbol. If the 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CURRENCY_SIGN is seen in a pattern, then the decimal separator is 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * replaced with the monetary decimal separator. 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kCurrencySign ((UChar)0x00A4) 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define kDefaultPad ((UChar)0x0020) /* */ 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t DecimalFormat::kDoubleIntegerDigits = 309; 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t DecimalFormat::kDoubleFractionDigits = 340; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t DecimalFormat::kMaxScientificIntegerDigits = 8; 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * These are the tags we expect to see in normal resource bundle files associated 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * with a locale. 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 28127f654740f2a26ad62a5c155af9199af9e69b889clairehoconst char DecimalFormat::fgNumberPatterns[]="NumberPatterns"; // Deprecated - not used 28227f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgNumberElements[]="NumberElements"; 28327f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgLatn[]="latn"; 28427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgPatterns[]="patterns"; 28527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgDecimalFormat[]="decimalFormat"; 28627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char fgCurrencyFormat[]="currencyFormat"; 28759d709d503bab6e2b61931737e662dd293b40578ccornelius 288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querustatic const UChar fgTripleCurrencySign[] = {0xA4, 0xA4, 0xA4, 0}; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline int32_t _min(int32_t a, int32_t b) { return (a<b) ? a : b; } 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline int32_t _max(int32_t a, int32_t b) { return (a<b) ? b : a; } 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 293fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusstatic void copyString(const UnicodeString& src, UBool isBogus, UnicodeString *& dest, UErrorCode &status) { 294fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (U_FAILURE(status)) { 295fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 296fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 297fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (isBogus) { 298fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius delete dest; 299fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius dest = NULL; 300fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 301fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (dest != NULL) { 302fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *dest = src; 303fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 304fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius dest = new UnicodeString(src); 305fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (dest == NULL) { 306fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius status = U_MEMORY_ALLOCATION_ERROR; 307fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 308fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 309fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 310fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 311fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 312fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 313fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance in the default locale. 31650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 31750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::DecimalFormat(UErrorCode& status) { 31859d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern in the default locale. 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 32959d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError, &pattern); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern and the number format symbols in the default locale. The 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// created instance owns the symbols. 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt, 34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 34259d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbolsToAdopt == NULL) 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError, &pattern, symbolsToAdopt); 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat( const UnicodeString& pattern, 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt, 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError& parseErr, 35250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 35359d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbolsToAdopt == NULL) 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status,parseErr, &pattern, symbolsToAdopt); 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 35850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern and the number format symbols in the default locale. The 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// created instance owns the clone of the symbols. 36350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DecimalFormatSymbols& symbols, 36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 36759d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru construct(status, parseError, &pattern, new DecimalFormatSymbols(symbols)); 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// pattern, the number format symbols, and the number format style. 375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// The created instance owns the clone of the symbols. 37650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::DecimalFormat(const UnicodeString& pattern, 378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt, 379b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UNumberFormatStyle style, 38050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) { 38159d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 38250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fStyle = style; 383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseError; 384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru construct(status, parseError, &pattern, symbolsToAdopt); 385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//----------------------------------------------------------------------------- 38850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Common DecimalFormat initialization. 38950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Put all fields of an uninitialized object into a known state. 39050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Common code, shared by all constructors. 39159d709d503bab6e2b61931737e662dd293b40578ccornelius// Can not fail. Leave the object in good enough shape that the destructor 39259d709d503bab6e2b61931737e662dd293b40578ccornelius// or assignment operator can run successfully. 39350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 39459d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::init() { 39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPosPrefixPattern = 0; 39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPosSuffixPattern = 0; 39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fNegPrefixPattern = 0; 39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fNegSuffixPattern = 0; 39950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fCurrencyChoice = 0; 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier = NULL; 4018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius fScale = 0; 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fGroupingSize = 0; 40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fGroupingSize2 = 0; 40450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fDecimalSeparatorAlwaysShown = FALSE; 40550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fSymbols = NULL; 40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fUseSignificantDigits = FALSE; 40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMinSignificantDigits = 1; 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMaxSignificantDigits = 6; 40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fUseExponentialNotation = FALSE; 41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMinExponentDigits = 0; 41150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fExponentSignAlwaysShown = FALSE; 41254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fBoolFlags.clear(); 41350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fRoundingIncrement = 0; 41450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fRoundingMode = kRoundHalfEven; 41550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPad = 0; 41650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fFormatWidth = 0; 41750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPadPosition = kPadBeforePrefix; 418b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fStyle = UNUM_DECIMAL; 41959d709d503bab6e2b61931737e662dd293b40578ccornelius fCurrencySignCount = fgCurrencySignCountZero; 42050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fAffixPatternsForCurrency = NULL; 42150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fAffixesForCurrency = NULL; 42250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fPluralAffixesForCurrency = NULL; 42350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fCurrencyPluralInfo = NULL; 424f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fCurrencyUsage = UCURR_USAGE_STANDARD; 425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fParseAllInput = UNUM_MAYBE; 427103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 428103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 429103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatInternal &data = internalData(fReserved); 43154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastFormatStatus=kFastpathUNKNOWN; // don't try to calculate the fastpath until later. 43254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus=kFastpathUNKNOWN; // don't try to calculate the fastpath until later. 433103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 43459d709d503bab6e2b61931737e662dd293b40578ccornelius fStaticSets = NULL; 43550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 43650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru//------------------------------------------------------------------------------ 438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Constructs a DecimalFormat instance with the specified number format 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// pattern and the number format symbols in the desired locale. The 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// created instance owns the symbols. 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 44359d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::construct(UErrorCode& status, 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError& parseErr, 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* pattern, 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DecimalFormatSymbols* symbolsToAdopt) 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols = symbolsToAdopt; // Do this BEFORE aborting on status failure!!! 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingIncrement = NULL; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingMode = kRoundHalfEven; 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = kPatternPadEscape; 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition = kPadBeforePrefix; 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPosPrefixPattern = fPosSuffixPattern = NULL; 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern = fNegSuffixPattern = NULL; 45850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setMultiplier(1); 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize = 3; 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 = 0; 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown = FALSE; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation = FALSE; 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinExponentDigits = 0; 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fSymbols == NULL) 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols = new DecimalFormatSymbols(Locale::getDefault(), status); 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fSymbols == 0) { 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 47359d709d503bab6e2b61931737e662dd293b40578ccornelius fStaticSets = DecimalFormatStaticSets::getStaticSets(status); 47459d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 47559d709d503bab6e2b61931737e662dd293b40578ccornelius return; 47659d709d503bab6e2b61931737e662dd293b40578ccornelius } 477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode nsStatus = U_ZERO_ERROR; 478103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius NumberingSystem *ns = NumberingSystem::createInstance(nsStatus); 479103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(nsStatus)) { 480103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status = nsStatus; 481103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 482103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString str; 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Uses the default locale's number format pattern if there isn't 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // one specified. 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pattern == NULL) 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 490103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UResourceBundle *top = ures_open(NULL, Locale::getDefault().getName(), &status); 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 492103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UResourceBundle *resource = ures_getByKeyWithFallback(top, fgNumberElements, NULL, &status); 493103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, ns->getName(), resource, &status); 494b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &status); 495b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar *resStr = ures_getStringByKeyWithFallback(resource, fgDecimalFormat, &len, &status); 496103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ( status == U_MISSING_RESOURCE_ERROR && uprv_strcmp(fgLatn,ns->getName())) { 497103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status = U_ZERO_ERROR; 498103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(top, fgNumberElements, resource, &status); 499103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, fgLatn, resource, &status); 500103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &status); 501103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resStr = ures_getStringByKeyWithFallback(resource, fgDecimalFormat, &len, &status); 502103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru str.setTo(TRUE, resStr, len); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern = &str; 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(resource); 506103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ures_close(top); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 509103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius delete ns; 510103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pattern->indexOf((UChar)kCurrencySign) >= 0) { 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If it looks like we are going to use a currency pattern 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // then do the time consuming lookup. 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setCurrencyForSymbols(); 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 521b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(NULL, status); 522b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 523b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 524b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* patternUsed; 525b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString currencyPluralPatternForOther; 526b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // apply pattern 527b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 528b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = new CurrencyPluralInfo(fSymbols->getLocale(), status); 529b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 530b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 531b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 532b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 533b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // the pattern used in format is not fixed until formatting, 53450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // in which, the number is known and 535b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // will be used to pick the right pattern based on plural count. 536b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Here, set the pattern as the pattern of plural count == "other". 537b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // For most locale, the patterns are probably the same for all 538b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // plural count. If not, the right pattern need to be re-applied 539b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // during format. 540b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fCurrencyPluralInfo->getCurrencyPluralPattern(UNICODE_STRING("other", 5), currencyPluralPatternForOther); 541b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru patternUsed = ¤cyPluralPatternForOther; 542b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // TODO: not needed? 543b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyForSymbols(); 54450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 545b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 546b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru patternUsed = pattern; 547b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 548b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 549b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (patternUsed->indexOf(kCurrencySign) != -1) { 55050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // initialize for currency, not only for plural format, 551b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // but also for mix parsing 552b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == NULL) { 553b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = new CurrencyPluralInfo(fSymbols->getLocale(), status); 554b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 555b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 556b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 557b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 558b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // need it for mix parsing 559b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixPatterns(status); 560b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // expanded affixes for plural names 561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (patternUsed->indexOf(fgTripleCurrencySign, 3, 0) != -1) { 562b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(*patternUsed, TRUE, TRUE, status); 563b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 565b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 566b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(*patternUsed,FALSE, parseErr, status); 567b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 568b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // expand affixes 569b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount != fgCurrencySignCountInPluralFormat) { 570b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixAdjustWidth(NULL); 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If it was a currency format, apply the appropriate rounding by 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // resetting the currency. NOTE: this copies fCurrency on top of itself. 57559d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 576b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(getCurrency(), status); 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatInternal &data = internalData(fReserved); 58054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastFormatStatus = kFastpathNO; // allow it to be calculated 58154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus = kFastpathNO; // allow it to be calculated 582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 586b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 587b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 588b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::setupCurrencyAffixPatterns(UErrorCode& status) { 589b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 590b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 591b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 592b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseErr; 593b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency = initHashForAffixPattern(status); 594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius NumberingSystem *ns = NumberingSystem::createInstance(fSymbols->getLocale(),status); 599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(status)) { 600103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Save the default currency patterns of this locale. 604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Here, chose onlyApplyPatternWithoutExpandAffix without 605b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // expanding the affix patterns into affixes. 606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString currencyPattern; 60727f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode error = U_ZERO_ERROR; 60827f654740f2a26ad62a5c155af9199af9e69b889claireho 60927f654740f2a26ad62a5c155af9199af9e69b889claireho UResourceBundle *resource = ures_open(NULL, fSymbols->getLocale().getName(), &error); 610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UResourceBundle *numElements = ures_getByKeyWithFallback(resource, fgNumberElements, NULL, &error); 611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(numElements, ns->getName(), resource, &error); 612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &error); 613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t patLen = 0; 614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar *patResStr = ures_getStringByKeyWithFallback(resource, fgCurrencyFormat, &patLen, &error); 615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if ( error == U_MISSING_RESOURCE_ERROR && uprv_strcmp(ns->getName(),fgLatn)) { 616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius error = U_ZERO_ERROR; 617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(numElements, fgLatn, resource, &error); 618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius resource = ures_getByKeyWithFallback(resource, fgPatterns, resource, &error); 619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius patResStr = ures_getStringByKeyWithFallback(resource, fgCurrencyFormat, &patLen, &error); 620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ures_close(numElements); 622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ures_close(resource); 623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius delete ns; 624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 625b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(error)) { 626b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(UnicodeString(patResStr, patLen), false, 627b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parseErr, status); 628b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixPatternsForCurrency* affixPtn = new AffixPatternsForCurrency( 629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegPrefixPattern, 630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegSuffixPattern, 631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosPrefixPattern, 632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosSuffixPattern, 633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCURR_SYMBOL_NAME); 634b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fAffixPatternsForCurrency->put(UNICODE_STRING("default", 7), affixPtn, status); 635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 63650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // save the unique currency plural patterns of this locale. 638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* pluralPtn = fCurrencyPluralInfo->fPluralCountToCurrencyUnitPattern; 639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 6401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t pos = UHASH_FIRST; 641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable pluralPatternSet; 642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ((element = pluralPtn->nextElement(pos)) != NULL) { 643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* value = (UnicodeString*)valueTok.pointer; 645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok keyTok = element->key; 646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* key = (UnicodeString*)keyTok.pointer; 647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (pluralPatternSet.geti(*value) != 1) { 648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pluralPatternSet.puti(*value, 1, status); 649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(*value, false, parseErr, status); 650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixPatternsForCurrency* affixPtn = new AffixPatternsForCurrency( 651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegPrefixPattern, 652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fNegSuffixPattern, 653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosPrefixPattern, 654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fPosSuffixPattern, 655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UCURR_LONG_NAME); 656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency->put(*key, affixPtn, status); 657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 66350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::setupCurrencyAffixes(const UnicodeString& pattern, 664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool setupForCurrentPattern, 665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool setupForPluralPattern, 666b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 667b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 668b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 669b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseErr; 671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (setupForCurrentPattern) { 672b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fAffixesForCurrency) { 673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fAffixesForCurrency); 674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixesForCurrency = initHashForAffix(status); 676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(pattern, false, parseErr, status); 678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const PluralRules* pluralRules = fCurrencyPluralInfo->getPluralRules(); 679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru StringEnumeration* keywords = pluralRules->getKeywords(status); 680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString* pluralCount; 682b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while ((pluralCount = keywords->snext(status)) != NULL) { 683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_SUCCESS(status) ) { 684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho expandAffixAdjustWidth(pluralCount); 685b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* affix = new AffixesForCurrency( 686b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegativePrefix, fNegativeSuffix, fPositivePrefix, fPositiveSuffix); 687b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fAffixesForCurrency->put(*pluralCount, affix, status); 688b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 689b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 690b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete keywords; 692b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 693b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 694b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 695b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(status)) { 696b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 697b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 698b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 699b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (setupForPluralPattern) { 700b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fPluralAffixesForCurrency) { 701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fPluralAffixesForCurrency); 702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPluralAffixesForCurrency = initHashForAffix(status); 704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const PluralRules* pluralRules = fCurrencyPluralInfo->getPluralRules(); 706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru StringEnumeration* keywords = pluralRules->getKeywords(status); 707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(status)) { 708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString* pluralCount; 709b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho while ((pluralCount = keywords->snext(status)) != NULL) { 710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_SUCCESS(status) ) { 711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString ptn; 712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fCurrencyPluralInfo->getCurrencyPluralPattern(*pluralCount, ptn); 713b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho applyPatternInternally(*pluralCount, ptn, false, parseErr, status); 714b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* affix = new AffixesForCurrency( 715b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegativePrefix, fNegativeSuffix, fPositivePrefix, fPositiveSuffix); 716b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fPluralAffixesForCurrency->put(*pluralCount, affix, status); 717b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 72050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete keywords; 721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::~DecimalFormat() 729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosPrefixPattern; 731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosSuffixPattern; 732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegPrefixPattern; 733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegSuffixPattern; 734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fCurrencyChoice; 73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete fMultiplier; 736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fSymbols; 737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fRoundingIncrement; 738b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffixPattern(); 739b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fAffixesForCurrency); 740b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffix(fPluralAffixesForCurrency); 741b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete fCurrencyPluralInfo; 742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// copy constructor 746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 74750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::DecimalFormat(const DecimalFormat &source) : 74850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NumberFormat(source) { 74959d709d503bab6e2b61931737e662dd293b40578ccornelius init(); 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *this = source; 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// assignment operator 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 75654dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustemplate <class T> 75754dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void _copy_ptr(T** pdest, const T* source) { 758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (source == NULL) { 759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete *pdest; 760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *pdest = NULL; 761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (*pdest == NULL) { 76254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pdest = new T(*source); 763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 76454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius **pdest = *source; 76554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 76654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 76754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 76854dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliustemplate <class T> 76954dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusstatic void _clone_ptr(T** pdest, const T* source) { 77054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius delete *pdest; 77154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (source == NULL) { 77254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pdest = NULL; 77354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 77454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius *pdest = static_cast<T*>(source->clone()); 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat& 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::operator=(const DecimalFormat& rhs) 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(this != &rhs) { 78259d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode status = U_ZERO_ERROR; 783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::operator=(rhs); 78459d709d503bab6e2b61931737e662dd293b40578ccornelius fStaticSets = DecimalFormatStaticSets::getStaticSets(status); 785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositivePrefix = rhs.fPositivePrefix; 786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositiveSuffix = rhs.fPositiveSuffix; 787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix = rhs.fNegativePrefix; 788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix = rhs.fNegativeSuffix; 78954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fPosPrefixPattern, rhs.fPosPrefixPattern); 79054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fPosSuffixPattern, rhs.fPosSuffixPattern); 79154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fNegPrefixPattern, rhs.fNegPrefixPattern); 79254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fNegSuffixPattern, rhs.fNegSuffixPattern); 79354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _clone_ptr(&fCurrencyChoice, rhs.fCurrencyChoice); 79450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setRoundingIncrement(rhs.getRoundingIncrement()); 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingMode = rhs.fRoundingMode; 79650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setMultiplier(rhs.getMultiplier()); 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize = rhs.fGroupingSize; 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 = rhs.fGroupingSize2; 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown = rhs.fDecimalSeparatorAlwaysShown; 80054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _copy_ptr(&fSymbols, rhs.fSymbols); 801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation = rhs.fUseExponentialNotation; 802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fExponentSignAlwaysShown = rhs.fExponentSignAlwaysShown; 80354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fBoolFlags = rhs.fBoolFlags; 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Bertrand A. D. Update 98.03.17*/ 805b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencySignCount = rhs.fCurrencySignCount; 806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*end of Update*/ 807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinExponentDigits = rhs.fMinExponentDigits; 80850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* sfb 990629 */ 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fFormatWidth = rhs.fFormatWidth; 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = rhs.fPad; 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition = rhs.fPadPosition; 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* end sfb */ 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinSignificantDigits = rhs.fMinSignificantDigits; 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMaxSignificantDigits = rhs.fMaxSignificantDigits; 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseSignificantDigits = rhs.fUseSignificantDigits; 817b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fFormatPattern = rhs.fFormatPattern; 818f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fCurrencyUsage = rhs.fCurrencyUsage; 819b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fStyle = rhs.fStyle; 82054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius _clone_ptr(&fCurrencyPluralInfo, rhs.fCurrencyPluralInfo); 82154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius deleteHashForAffixPattern(); 822b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (rhs.fAffixPatternsForCurrency) { 823b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 824b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency = initHashForAffixPattern(status); 82550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho copyHashForAffixPattern(rhs.fAffixPatternsForCurrency, 826b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency, status); 827b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 82854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius deleteHashForAffix(fAffixesForCurrency); 829b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (rhs.fAffixesForCurrency) { 830b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 831b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixesForCurrency = initHashForAffixPattern(status); 832b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru copyHashForAffix(rhs.fAffixesForCurrency, fAffixesForCurrency, status); 833b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 83454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius deleteHashForAffix(fPluralAffixesForCurrency); 835b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (rhs.fPluralAffixesForCurrency) { 836b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 837b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPluralAffixesForCurrency = initHashForAffixPattern(status); 838b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru copyHashForAffix(rhs.fPluralAffixesForCurrency, fPluralAffixesForCurrency, status); 839b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 840103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 841fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius DecimalFormatInternal &data = internalData(fReserved); 842fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius const DecimalFormatInternal &rhsData = internalData(rhs.fReserved); 843fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius data = rhsData; 844103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 845fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return *this; 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::operator==(const Format& that) const 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (this == &that) 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NumberFormat::operator== guarantees this cast is safe 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const DecimalFormat* other = (DecimalFormat*)&that; 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef FMT_DEBUG 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // This code makes it easy to determine why two format objects that should 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // be equal aren't. 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool first = TRUE; 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!NumberFormat::operator==(that)) { 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NumberFormat::!="); 867b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fPosPrefixPattern == other->fPosPrefixPattern && // both null 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositivePrefix == other->fPositivePrefix) 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fPosPrefixPattern != 0 && other->fPosPrefixPattern != 0 && 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fPosPrefixPattern == *other->fPosPrefixPattern))) { 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Pos Prefix !="); 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fPosSuffixPattern == other->fPosSuffixPattern && // both null 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositiveSuffix == other->fPositiveSuffix) 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fPosSuffixPattern != 0 && other->fPosSuffixPattern != 0 && 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fPosSuffixPattern == *other->fPosSuffixPattern))) { 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Pos Suffix !="); 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fNegPrefixPattern == other->fNegPrefixPattern && // both null 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix == other->fNegativePrefix) 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fNegPrefixPattern != 0 && other->fNegPrefixPattern != 0 && 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fNegPrefixPattern == *other->fNegPrefixPattern))) { 886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Neg Prefix "); 888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegPrefixPattern == NULL) { 889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(fNegativePrefix); 891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*fNegPrefixPattern); 894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(" != "); 896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (other->fNegPrefixPattern == NULL) { 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(other->fNegativePrefix); 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*other->fNegPrefixPattern); 902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fNegSuffixPattern == other->fNegSuffixPattern && // both null 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix == other->fNegativeSuffix) 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fNegSuffixPattern != 0 && other->fNegSuffixPattern != 0 && 907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fNegSuffixPattern == *other->fNegSuffixPattern))) { 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Neg Suffix "); 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegSuffixPattern == NULL) { 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(fNegativeSuffix); 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*fNegSuffixPattern); 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(" != "); 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (other->fNegSuffixPattern == NULL) { 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("NULL("); 920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(other->fNegativeSuffix); 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug(")"); 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(*other->fNegSuffixPattern); 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!((fRoundingIncrement == other->fRoundingIncrement) // both null 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fRoundingIncrement != NULL && 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru other->fRoundingIncrement != NULL && 929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fRoundingIncrement == *other->fRoundingIncrement))) { 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Rounding Increment !="); 932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 933fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fRoundingMode != other->fRoundingMode) { 934fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 935fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius printf("Rounding Mode %d != %d", (int)fRoundingMode, (int)other->fRoundingMode); 936fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 93750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (getMultiplier() != other->getMultiplier()) { 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } 93950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho printf("Multiplier %ld != %ld", getMultiplier(), other->getMultiplier()); 940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fGroupingSize != other->fGroupingSize) { 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Grouping Size %ld != %ld", fGroupingSize, other->fGroupingSize); 944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fGroupingSize2 != other->fGroupingSize2) { 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Secondary Grouping Size %ld != %ld", fGroupingSize2, other->fGroupingSize2); 948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fDecimalSeparatorAlwaysShown != other->fDecimalSeparatorAlwaysShown) { 950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 951fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius printf("fDecimalSeparatorAlwaysShown %d != %d", fDecimalSeparatorAlwaysShown, other->fDecimalSeparatorAlwaysShown); 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation != other->fUseExponentialNotation) { 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 955fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fUseExponentialNotation !="); 956fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 957fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fUseExponentialNotation && 958fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fMinExponentDigits != other->fMinExponentDigits) { 959fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 960fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fMinExponentDigits !="); 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 962fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fUseExponentialNotation && 963fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fExponentSignAlwaysShown != other->fExponentSignAlwaysShown) { 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 965fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fExponentSignAlwaysShown !="); 966fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 967fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fBoolFlags.getAll() != other->fBoolFlags.getAll()) { 968fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 969fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fBoolFlags !="); 970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*fSymbols != *(other->fSymbols)) { 972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debug("Symbols !="); 974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TODO Add debug stuff for significant digits here 976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fUseSignificantDigits != other->fUseSignificantDigits) { 977fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fUseSignificantDigits !="); 979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fUseSignificantDigits && 981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fMinSignificantDigits != other->fMinSignificantDigits) { 982fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fMinSignificantDigits !="); 984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 985b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fUseSignificantDigits && 986b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fMaxSignificantDigits != other->fMaxSignificantDigits) { 987fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 988b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fMaxSignificantDigits !="); 989b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 990fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fFormatWidth != other->fFormatWidth) { 991fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 992fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fFormatWidth !="); 993fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 994fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fPad != other->fPad) { 995fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 996fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fPad !="); 997fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 998fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fPadPosition != other->fPadPosition) { 999fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 1000fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fPadPosition !="); 1001fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1002fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fStyle == UNUM_CURRENCY_PLURAL && 1003fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fStyle != other->fStyle) 1004fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 1005fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fStyle !="); 1006fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1007fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fStyle == UNUM_CURRENCY_PLURAL && 1008fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatPattern != other->fFormatPattern) { 1009fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (first) { printf("[ "); first = FALSE; } else { printf(", "); } 1010fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius debug("fFormatPattern !="); 1011fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 1012b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!first) { printf(" ]"); } 1014b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount != other->fCurrencySignCount) { 1015b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencySignCount !="); 1016b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1017b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == other->fCurrencyPluralInfo) { 1018b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo == "); 1019b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == NULL) { 1020b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo == NULL"); 1021b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1022b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1023b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo != NULL && other->fCurrencyPluralInfo != NULL && 1024b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *fCurrencyPluralInfo != *(other->fCurrencyPluralInfo)) { 1025b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo !="); 1026b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo != NULL && other->fCurrencyPluralInfo == NULL || 1028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo == NULL && other->fCurrencyPluralInfo != NULL) { 1029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo one NULL, the other not"); 1030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyPluralInfo == NULL && other->fCurrencyPluralInfo == NULL) { 1032b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru debug("fCurrencyPluralInfo == "); 1033b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1034b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1037fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return ( 1038fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::operator==(that) && 1039fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1040fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fCurrencySignCount == fgCurrencySignCountInPluralFormat) ? 1041fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fAffixPatternsForCurrency->equals(*other->fAffixPatternsForCurrency)) : 1042fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (((fPosPrefixPattern == other->fPosPrefixPattern && // both null 1043fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPositivePrefix == other->fPositivePrefix) 1044fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fPosPrefixPattern != 0 && other->fPosPrefixPattern != 0 && 1045fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fPosPrefixPattern == *other->fPosPrefixPattern)) && 1046fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fPosSuffixPattern == other->fPosSuffixPattern && // both null 1047fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPositiveSuffix == other->fPositiveSuffix) 1048fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fPosSuffixPattern != 0 && other->fPosSuffixPattern != 0 && 1049fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fPosSuffixPattern == *other->fPosSuffixPattern)) && 1050fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fNegPrefixPattern == other->fNegPrefixPattern && // both null 1051fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fNegativePrefix == other->fNegativePrefix) 1052fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fNegPrefixPattern != 0 && other->fNegPrefixPattern != 0 && 1053fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fNegPrefixPattern == *other->fNegPrefixPattern)) && 1054fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fNegSuffixPattern == other->fNegSuffixPattern && // both null 1055fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fNegativeSuffix == other->fNegativeSuffix) 1056fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fNegSuffixPattern != 0 && other->fNegSuffixPattern != 0 && 1057fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fNegSuffixPattern == *other->fNegSuffixPattern)))) && 1058fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1059fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ((fRoundingIncrement == other->fRoundingIncrement) // both null 1060fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius || (fRoundingIncrement != NULL && 1061fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius other->fRoundingIncrement != NULL && 1062fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fRoundingIncrement == *other->fRoundingIncrement)) && 1063fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1064fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fRoundingMode == other->fRoundingMode && 106550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho getMultiplier() == other->getMultiplier() && 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize == other->fGroupingSize && 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 == other->fGroupingSize2 && 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown == other->fDecimalSeparatorAlwaysShown && 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation == other->fUseExponentialNotation && 1070fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (!fUseExponentialNotation || 1072fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fMinExponentDigits == other->fMinExponentDigits && fExponentSignAlwaysShown == other->fExponentSignAlwaysShown)) && 1073fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1074fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fBoolFlags.getAll() == other->fBoolFlags.getAll() && 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fSymbols == *(other->fSymbols) && 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseSignificantDigits == other->fUseSignificantDigits && 1077fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (!fUseSignificantDigits || 1079fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fMinSignificantDigits == other->fMinSignificantDigits && fMaxSignificantDigits == other->fMaxSignificantDigits)) && 1080fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1081fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatWidth == other->fFormatWidth && 1082fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPad == other->fPad && 1083fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition == other->fPadPosition && 1084fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1085fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fStyle != UNUM_CURRENCY_PLURAL || 1086fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius (fStyle == other->fStyle && fFormatPattern == other->fFormatPattern)) && 1087fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1088b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencySignCount == other->fCurrencySignCount && 1089fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1090b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ((fCurrencyPluralInfo == other->fCurrencyPluralInfo && 1091b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo == NULL) || 1092b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (fCurrencyPluralInfo != NULL && other->fCurrencyPluralInfo != NULL && 1093f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *fCurrencyPluralInfo == *(other->fCurrencyPluralInfo))) && 1094f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1095f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fCurrencyUsage == other->fCurrencyUsage 1096fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 1097fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // depending on other settings we may also need to compare 1098fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // fCurrencyChoice (mostly deprecated?), 1099fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // fAffixesForCurrency & fPluralAffixesForCurrency (only relevant in some cases) 1100fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius ); 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormat* 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::clone() const 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return new DecimalFormat(*this); 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111159d709d503bab6e2b61931737e662dd293b40578ccornelius 111259d709d503bab6e2b61931737e662dd293b40578ccorneliusFixedDecimal 111359d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::getFixedDecimal(double number, UErrorCode &status) const { 111459d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal result; 111559d709d503bab6e2b61931737e662dd293b40578ccornelius 111659d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 111759d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 111859d709d503bab6e2b61931737e662dd293b40578ccornelius } 111959d709d503bab6e2b61931737e662dd293b40578ccornelius 112059d709d503bab6e2b61931737e662dd293b40578ccornelius if (uprv_isNaN(number) || uprv_isPositiveInfinity(fabs(number))) { 112159d709d503bab6e2b61931737e662dd293b40578ccornelius // For NaN and Infinity the state of the formatter is ignored. 112259d709d503bab6e2b61931737e662dd293b40578ccornelius result.init(number); 112359d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 112459d709d503bab6e2b61931737e662dd293b40578ccornelius } 112559d709d503bab6e2b61931737e662dd293b40578ccornelius 112659d709d503bab6e2b61931737e662dd293b40578ccornelius if (fMultiplier == NULL && fScale == 0 && fRoundingIncrement == 0 && areSignificantDigitsUsed() == FALSE && 112759d709d503bab6e2b61931737e662dd293b40578ccornelius result.quickInit(number) && result.visibleDecimalDigitCount <= getMaximumFractionDigits()) { 112859d709d503bab6e2b61931737e662dd293b40578ccornelius // Fast Path. Construction of an exact FixedDecimal directly from the double, without passing 112959d709d503bab6e2b61931737e662dd293b40578ccornelius // through a DigitList, was successful, and the formatter is doing nothing tricky with rounding. 113059d709d503bab6e2b61931737e662dd293b40578ccornelius // printf("getFixedDecimal(%g): taking fast path.\n", number); 113159d709d503bab6e2b61931737e662dd293b40578ccornelius result.adjustForMinFractionDigits(getMinimumFractionDigits()); 113259d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 113359d709d503bab6e2b61931737e662dd293b40578ccornelius // Slow path. Create a DigitList, and have this formatter round it according to the 113459d709d503bab6e2b61931737e662dd293b40578ccornelius // requirements of the format, and fill the fixedDecimal from that. 113559d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList digits; 113659d709d503bab6e2b61931737e662dd293b40578ccornelius digits.set(number); 113759d709d503bab6e2b61931737e662dd293b40578ccornelius result = getFixedDecimal(digits, status); 113859d709d503bab6e2b61931737e662dd293b40578ccornelius } 113959d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 114059d709d503bab6e2b61931737e662dd293b40578ccornelius} 114159d709d503bab6e2b61931737e662dd293b40578ccornelius 114259d709d503bab6e2b61931737e662dd293b40578ccorneliusFixedDecimal 114359d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::getFixedDecimal(const Formattable &number, UErrorCode &status) const { 114459d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 114559d709d503bab6e2b61931737e662dd293b40578ccornelius return FixedDecimal(); 114659d709d503bab6e2b61931737e662dd293b40578ccornelius } 114759d709d503bab6e2b61931737e662dd293b40578ccornelius if (!number.isNumeric()) { 114859d709d503bab6e2b61931737e662dd293b40578ccornelius status = U_ILLEGAL_ARGUMENT_ERROR; 114959d709d503bab6e2b61931737e662dd293b40578ccornelius return FixedDecimal(); 115059d709d503bab6e2b61931737e662dd293b40578ccornelius } 115159d709d503bab6e2b61931737e662dd293b40578ccornelius 115259d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList *dl = number.getDigitList(); 115359d709d503bab6e2b61931737e662dd293b40578ccornelius if (dl != NULL) { 115459d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList clonedDL(*dl); 115559d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(clonedDL, status); 115659d709d503bab6e2b61931737e662dd293b40578ccornelius } 115759d709d503bab6e2b61931737e662dd293b40578ccornelius 115859d709d503bab6e2b61931737e662dd293b40578ccornelius Formattable::Type type = number.getType(); 115959d709d503bab6e2b61931737e662dd293b40578ccornelius if (type == Formattable::kDouble || type == Formattable::kLong) { 116059d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(number.getDouble(status), status); 116159d709d503bab6e2b61931737e662dd293b40578ccornelius } 116259d709d503bab6e2b61931737e662dd293b40578ccornelius 11631b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (type == Formattable::kInt64 && number.getInt64() <= MAX_INT64_IN_DOUBLE && 11641b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert number.getInt64() >= -MAX_INT64_IN_DOUBLE) { 11651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return getFixedDecimal(number.getDouble(status), status); 116659d709d503bab6e2b61931737e662dd293b40578ccornelius } 116759d709d503bab6e2b61931737e662dd293b40578ccornelius 116859d709d503bab6e2b61931737e662dd293b40578ccornelius // The only case left is type==int64_t, with a value with more digits than a double can represent. 116959d709d503bab6e2b61931737e662dd293b40578ccornelius // Any formattable originating as a big decimal will have had a pre-existing digit list. 117059d709d503bab6e2b61931737e662dd293b40578ccornelius // Any originating as a double or int32 will have been handled as a double. 117159d709d503bab6e2b61931737e662dd293b40578ccornelius 117259d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(type == Formattable::kInt64); 117359d709d503bab6e2b61931737e662dd293b40578ccornelius DigitList digits; 117459d709d503bab6e2b61931737e662dd293b40578ccornelius digits.set(number.getInt64()); 117559d709d503bab6e2b61931737e662dd293b40578ccornelius return getFixedDecimal(digits, status); 117659d709d503bab6e2b61931737e662dd293b40578ccornelius} 117759d709d503bab6e2b61931737e662dd293b40578ccornelius 117859d709d503bab6e2b61931737e662dd293b40578ccornelius 117959d709d503bab6e2b61931737e662dd293b40578ccornelius// Create a fixed decimal from a DigitList. 118059d709d503bab6e2b61931737e662dd293b40578ccornelius// The digit list may be modified. 118159d709d503bab6e2b61931737e662dd293b40578ccornelius// Internal function only. 118259d709d503bab6e2b61931737e662dd293b40578ccorneliusFixedDecimal 118359d709d503bab6e2b61931737e662dd293b40578ccorneliusDecimalFormat::getFixedDecimal(DigitList &number, UErrorCode &status) const { 118459d709d503bab6e2b61931737e662dd293b40578ccornelius // Round the number according to the requirements of this Format. 118559d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal result; 118659d709d503bab6e2b61931737e662dd293b40578ccornelius _round(number, number, result.isNegative, status); 118759d709d503bab6e2b61931737e662dd293b40578ccornelius 118859d709d503bab6e2b61931737e662dd293b40578ccornelius // The int64_t fields in FixedDecimal can easily overflow. 118959d709d503bab6e2b61931737e662dd293b40578ccornelius // In deciding what to discard in this event, consider that fixedDecimal 119059d709d503bab6e2b61931737e662dd293b40578ccornelius // is being used only with PluralRules, and those rules mostly look at least significant 119159d709d503bab6e2b61931737e662dd293b40578ccornelius // few digits of the integer part, and whether the fraction part is zero or not. 119259d709d503bab6e2b61931737e662dd293b40578ccornelius // 119359d709d503bab6e2b61931737e662dd293b40578ccornelius // So, in case of overflow when filling in the fields of the FixedDecimal object, 119459d709d503bab6e2b61931737e662dd293b40578ccornelius // for the integer part, discard the most significant digits. 119559d709d503bab6e2b61931737e662dd293b40578ccornelius // for the fraction part, discard the least significant digits, 119659d709d503bab6e2b61931737e662dd293b40578ccornelius // don't truncate the fraction value to zero. 119759d709d503bab6e2b61931737e662dd293b40578ccornelius // For simplicity, the int64_t fields are limited to 18 decimal digits, even 119859d709d503bab6e2b61931737e662dd293b40578ccornelius // though they could hold most (but not all) 19 digit values. 119959d709d503bab6e2b61931737e662dd293b40578ccornelius 120059d709d503bab6e2b61931737e662dd293b40578ccornelius // Integer Digits. 120159d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t di = number.getDecimalAt()-18; // Take at most 18 digits. 120259d709d503bab6e2b61931737e662dd293b40578ccornelius if (di < 0) { 120359d709d503bab6e2b61931737e662dd293b40578ccornelius di = 0; 120459d709d503bab6e2b61931737e662dd293b40578ccornelius } 120559d709d503bab6e2b61931737e662dd293b40578ccornelius result.intValue = 0; 120659d709d503bab6e2b61931737e662dd293b40578ccornelius for (; di<number.getDecimalAt(); di++) { 120759d709d503bab6e2b61931737e662dd293b40578ccornelius result.intValue = result.intValue * 10 + (number.getDigit(di) & 0x0f); 120859d709d503bab6e2b61931737e662dd293b40578ccornelius } 120959d709d503bab6e2b61931737e662dd293b40578ccornelius if (result.intValue == 0 && number.getDecimalAt()-18 > 0) { 121059d709d503bab6e2b61931737e662dd293b40578ccornelius // The number is something like 100000000000000000000000. 121159d709d503bab6e2b61931737e662dd293b40578ccornelius // More than 18 digits integer digits, but the least significant 18 are all zero. 121259d709d503bab6e2b61931737e662dd293b40578ccornelius // We don't want to return zero as the int part, but want to keep zeros 121359d709d503bab6e2b61931737e662dd293b40578ccornelius // for several of the least significant digits. 121459d709d503bab6e2b61931737e662dd293b40578ccornelius result.intValue = 100000000000000000LL; 121559d709d503bab6e2b61931737e662dd293b40578ccornelius } 121659d709d503bab6e2b61931737e662dd293b40578ccornelius 121759d709d503bab6e2b61931737e662dd293b40578ccornelius // Fraction digits. 121859d709d503bab6e2b61931737e662dd293b40578ccornelius result.decimalDigits = result.decimalDigitsWithoutTrailingZeros = result.visibleDecimalDigitCount = 0; 121959d709d503bab6e2b61931737e662dd293b40578ccornelius for (di = number.getDecimalAt(); di < number.getCount(); di++) { 122059d709d503bab6e2b61931737e662dd293b40578ccornelius result.visibleDecimalDigitCount++; 122159d709d503bab6e2b61931737e662dd293b40578ccornelius if (result.decimalDigits < 100000000000000000LL) { 122259d709d503bab6e2b61931737e662dd293b40578ccornelius // 9223372036854775807 Largest 64 bit signed integer 122359d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t digitVal = number.getDigit(di) & 0x0f; // getDigit() returns a char, '0'-'9'. 122459d709d503bab6e2b61931737e662dd293b40578ccornelius result.decimalDigits = result.decimalDigits * 10 + digitVal; 122559d709d503bab6e2b61931737e662dd293b40578ccornelius if (digitVal > 0) { 122659d709d503bab6e2b61931737e662dd293b40578ccornelius result.decimalDigitsWithoutTrailingZeros = result.decimalDigits; 122759d709d503bab6e2b61931737e662dd293b40578ccornelius } 122859d709d503bab6e2b61931737e662dd293b40578ccornelius } 122959d709d503bab6e2b61931737e662dd293b40578ccornelius } 123059d709d503bab6e2b61931737e662dd293b40578ccornelius 123159d709d503bab6e2b61931737e662dd293b40578ccornelius result.hasIntegerValue = (result.decimalDigits == 0); 123259d709d503bab6e2b61931737e662dd293b40578ccornelius 123359d709d503bab6e2b61931737e662dd293b40578ccornelius // Trailing fraction zeros. The format specification may require more trailing 123459d709d503bab6e2b61931737e662dd293b40578ccornelius // zeros than the numeric value. Add any such on now. 123559d709d503bab6e2b61931737e662dd293b40578ccornelius 123659d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t minFractionDigits; 123759d709d503bab6e2b61931737e662dd293b40578ccornelius if (areSignificantDigitsUsed()) { 123859d709d503bab6e2b61931737e662dd293b40578ccornelius minFractionDigits = getMinimumSignificantDigits() - number.getDecimalAt(); 123959d709d503bab6e2b61931737e662dd293b40578ccornelius if (minFractionDigits < 0) { 124059d709d503bab6e2b61931737e662dd293b40578ccornelius minFractionDigits = 0; 124159d709d503bab6e2b61931737e662dd293b40578ccornelius } 124259d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 124359d709d503bab6e2b61931737e662dd293b40578ccornelius minFractionDigits = getMinimumFractionDigits(); 124459d709d503bab6e2b61931737e662dd293b40578ccornelius } 124559d709d503bab6e2b61931737e662dd293b40578ccornelius result.adjustForMinFractionDigits(minFractionDigits); 124659d709d503bab6e2b61931737e662dd293b40578ccornelius 124759d709d503bab6e2b61931737e662dd293b40578ccornelius return result; 124859d709d503bab6e2b61931737e662dd293b40578ccornelius} 124959d709d503bab6e2b61931737e662dd293b40578ccornelius 125059d709d503bab6e2b61931737e662dd293b40578ccornelius 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 125250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::format(int32_t number, 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& appendTo, 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& fieldPosition) const 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return format((int64_t)number, appendTo, fieldPosition); 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 126150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 126250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(int32_t number, 126350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 126454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPosition& fieldPosition, 126554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 126654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 126754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return format((int64_t)number, appendTo, fieldPosition, status); 126854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 126954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 127054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUnicodeString& 127154dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat::format(int32_t number, 127254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString& appendTo, 127350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator* posIter, 127450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) const 127550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 127650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return format((int64_t)number, appendTo, posIter, status); 127750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 127850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1279103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1280103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 1281103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid DecimalFormat::handleChanged() { 1282103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DecimalFormatInternal &data = internalData(fReserved); 1283103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 128454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(data.fFastFormatStatus == kFastpathUNKNOWN || data.fFastParseStatus == kFastpathUNKNOWN) { 1285103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; // still constructing. Wait. 1286103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1287103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 128854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus = data.fFastFormatStatus = kFastpathNO; 1289103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 129054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 129154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(fParseAllInput == UNUM_NO) { 129254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: fParseAllInput==UNUM_NO"); 129354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else 129454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 129554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (fFormatWidth!=0) { 129654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: fFormatWidth"); 129754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fPositivePrefix.length()>0) { 129854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: positive prefix"); 129954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fPositiveSuffix.length()>0) { 130054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: positive suffix"); 130154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fNegativePrefix.length()>1 130254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius || ((fNegativePrefix.length()==1) && (fNegativePrefix.charAt(0)!=0x002D))) { 130354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: negative prefix that isn't '-'"); 130454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fNegativeSuffix.length()>0) { 130554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No Parse fastpath: negative suffix"); 130654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 130754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastParseStatus = kFastpathYES; 130854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("parse fastpath: YES"); 130954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 131054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1311f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(fUseExponentialNotation) { 131254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fUseExponentialNotation"); 1313103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fFormatWidth!=0) { 131454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fFormatWidth!=0"); 1315103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fMinSignificantDigits!=1) { 131654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fMinSignificantDigits!=1"); 1317103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fMultiplier!=NULL) { 131854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fMultiplier!=NULL"); 13198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else if(fScale!=0) { 13208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius debug("No format fastpath: fScale!=0"); 1321103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(0x0030 != getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0)) { 132254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: 0x0030 != getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0)"); 1323103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(fDecimalSeparatorAlwaysShown) { 132454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fDecimalSeparatorAlwaysShown"); 1325103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(getMinimumFractionDigits()>0) { 132654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fMinFractionDigits>0"); 132759d709d503bab6e2b61931737e662dd293b40578ccornelius } else if(fCurrencySignCount != fgCurrencySignCountZero) { 132859d709d503bab6e2b61931737e662dd293b40578ccornelius debug("No format fastpath: fCurrencySignCount != fgCurrencySignCountZero"); 132954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(fRoundingIncrement!=0) { 133054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("No format fastpath: fRoundingIncrement!=0"); 1331f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } else if (fGroupingSize!=0 && isGroupingUsed()) { 1332f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius debug("Maybe format fastpath: fGroupingSize!=0 and grouping is used"); 1333f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#ifdef FMT_DEBUG 1334f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius printf("groupingsize=%d\n", fGroupingSize); 1335f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius#endif 1336f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1337f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (getMinimumIntegerDigits() <= fGroupingSize) { 1338f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius data.fFastFormatStatus = kFastpathMAYBE; 1339f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1340f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } else if(fGroupingSize2!=0 && isGroupingUsed()) { 1341f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius debug("No format fastpath: fGroupingSize2!=0"); 1342103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 134354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius data.fFastFormatStatus = kFastpathYES; 134454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius debug("format:kFastpathYES!"); 1345103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 134654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 134754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 1348103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 1349103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 135150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::format(int64_t number, 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& appendTo, 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& fieldPosition) const 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 135754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode status = U_ZERO_ERROR; /* ignored */ 135854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionOnlyHandler handler(fieldPosition); 135954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 136054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 136154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 136254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUnicodeString& 136354dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat::format(int64_t number, 136454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString& appendTo, 136554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPosition& fieldPosition, 136654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 136754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 136854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionOnlyHandler handler(fieldPosition); 136954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 137050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 137250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 137350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(int64_t number, 137450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 137550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator* posIter, 137650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) const 137750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 137850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 137954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 138050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 138350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::_format(int64_t number, 138450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 138554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionHandler& handler, 138654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status) const 138750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 1388103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Bottleneck function for formatting int64_t 138954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_FAILURE(status)) { 139054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return appendTo; 139154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 1392103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1393103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 1394103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // const UnicodeString *posPrefix = fPosPrefixPattern; 1395103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // const UnicodeString *posSuffix = fPosSuffixPattern; 1396103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // const UnicodeString *negSuffix = fNegSuffixPattern; 1397103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1398103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const DecimalFormatInternal &data = internalData(fReserved); 1399103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1400103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 1401103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius data.dump(); 1402103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("fastpath? [%d]\n", number); 1403103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1405f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if( data.fFastFormatStatus==kFastpathYES || 1406f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius data.fFastFormatStatus==kFastpathMAYBE) { 1407f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t noGroupingThreshold = 0; 1408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1409103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#define kZero 0x0030 1410103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const int32_t MAX_IDX = MAX_DIGITS+2; 1411103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar outputStr[MAX_IDX]; 1412103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t destIdx = MAX_IDX; 1413103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputStr[--destIdx] = 0; // term 1414103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1415f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (data.fFastFormatStatus==kFastpathMAYBE) { 1416f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius noGroupingThreshold = destIdx - fGroupingSize; 1417f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1418103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int64_t n = number; 1419103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (number < 1) { 1420103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Negative numbers are slightly larger than positive 1421103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // output the first digit (or the leading zero) 1422103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputStr[--destIdx] = (-(n % 10) + kZero); 1423103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n /= -10; 1424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // get any remaining digits 1426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while (n > 0) { 1427f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (destIdx == noGroupingThreshold) { 1428f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius goto slowPath; 1429f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 1430103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius outputStr[--destIdx] = (n % 10) + kZero; 1431103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius n /= 10; 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; 14371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert /*int32_t prefixLen = */ appendAffix(appendTo, static_cast<double>(number), handler, number<0, TRUE); 143895bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep 143995bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep // This will be at least 0 even if it was set to a negative number. 1440103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t maxIntDig = getMaximumIntegerDigits(); 144154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t destlength = length<=maxIntDig?length:maxIntDig; // dest length pinned to max int digits 144254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 144354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(length>maxIntDig && fBoolFlags.contains(UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)) { 144454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ILLEGAL_ARGUMENT_ERROR; 144554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 144654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 144795bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep int32_t minDigits = getMinimumIntegerDigits(); 144895bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep 144995bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep // We always want at least one digit, even if it is just a 0. 145095bba3074fbe8ba9d29e736334ae3bad704102aaTravis Keep int32_t prependZero = (minDigits < 1 ? 1 : minDigits) - destlength; 1451103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1452103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 145354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("prependZero=%d, length=%d, minintdig=%d maxintdig=%d destlength=%d skip=%d\n", prependZero, length, getMinimumIntegerDigits(), maxIntDig, destlength, length-destlength); 1454103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1455103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t intBegin = appendTo.length(); 1456103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1457103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while((prependZero--)>0) { 145854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius appendTo.append((UChar)0x0030); // '0' 1459103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1460103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 146154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius appendTo.append(outputStr+destIdx+ 146254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (length-destlength), // skip any leading digits 146354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius destlength); 1464103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handler.addAttribute(kIntegerField, intBegin, appendTo.length()); 1465103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 14661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert /*int32_t suffixLen =*/ appendAffix(appendTo, static_cast<double>(number), handler, number<0, FALSE); 1467103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1468103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius //outputStr[length]=0; 1469103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1470103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 1471103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("Writing [%s] length [%d] max %d for [%d]\n", outputStr+destIdx, length, MAX_IDX, number); 1472103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1473103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1474103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#undef kZero 1475103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1476103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return appendTo; 1477103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } // end fastpath 1478103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1479f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius slowPath: 1480103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1481103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Else the slow way - via DigitList 148250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DigitList digits; 148350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.set(number); 148450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return _format(digits, appendTo, handler, status); 1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 148650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::format( double number, 1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& appendTo, 1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition& fieldPosition) const 1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 149454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode status = U_ZERO_ERROR; /* ignored */ 149554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionOnlyHandler handler(fieldPosition); 149654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 149754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 149854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 149954dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUnicodeString& 150054dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat::format( double number, 150154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UnicodeString& appendTo, 150254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPosition& fieldPosition, 150354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 150454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius{ 150550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionOnlyHandler handler(fieldPosition); 150654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 150750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 150950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 151050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format( double number, 151150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 151250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator* posIter, 151350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode& status) const 151450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 151550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 151654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return _format(number, appendTo, handler, status); 151750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 151850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 151950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 152050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::_format( double number, 152150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 152254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius FieldPositionHandler& handler, 152354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status) const 152450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 152554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (U_FAILURE(status)) { 152654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return appendTo; 152754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Special case for NaN, sets the begin and end index to be the 1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the string length of localized name of NaN. 153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TODO: let NaNs go through DigitList. 1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (uprv_isNaN(number)) 1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 153350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int begin = appendTo.length(); 153450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho appendTo += getConstSymbol(DecimalFormatSymbols::kNaNSymbol); 153550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, begin, appendTo.length()); 153750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addPadding(appendTo, handler, 0, 0); 153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 154050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 154150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DigitList digits; 154350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.set(number); 154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(digits, appendTo, handler, status); 154550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // No way to return status from here. 154650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 154750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 154850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 155050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 155250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 155350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(const StringPiece &number, 155450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString &toAppendTo, 155550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator *posIter, 155650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &status) const 155750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 1558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 1559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // don't bother if the int64 path is not optimized 1560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t len = number.length(); 1561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(len>0&&len<10) { /* 10 or more digits may not be an int64 */ 1563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const char *data = number.data(); 1564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int64_t num = 0; 1565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool neg = FALSE; 1566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool ok = TRUE; 1567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t start = 0; 1569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(data[start]=='+') { 1571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius start++; 1572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(data[start]=='-') { 1573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius neg=TRUE; 1574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius start++; 1575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t place = 1; /* 1, 10, ... */ 1578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius for(int32_t i=len-1;i>=start;i--) { 1579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(data[i]>='0'&&data[i]<='9') { 1580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius num+=place*(int64_t)(data[i]-'0'); 1581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 1582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ok=FALSE; 1583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius break; 1584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius place *= 10; 1586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 1588103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(ok) { 1589103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(neg) { 1590103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius num = -num;// add minus bit 1591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // format as int64_t 1593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return format(num, toAppendTo, posIter, status); 1594103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1595103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // else fall through 1596103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 1597103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 1598103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 159950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho DigitList dnum; 160050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dnum.set(number, status); 160150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 160250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return toAppendTo; 160350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 160450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 160550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(dnum, toAppendTo, handler, status); 160650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return toAppendTo; 160750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 160850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 160950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 161050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 161150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(const DigitList &number, 161250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString &appendTo, 161350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIterator *posIter, 161450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &status) const { 161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionIteratorHandler handler(posIter, status); 161650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(number, appendTo, handler, status); 161750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 161850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 161950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 162050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 162150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 162250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUnicodeString& 162350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::format(const DigitList &number, 162450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString& appendTo, 162550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPosition& pos, 162650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode &status) const { 162750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionOnlyHandler handler(pos); 162850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _format(number, appendTo, handler, status); 162950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return appendTo; 163050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 163150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusDigitList& 16338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusDecimalFormat::_round(const DigitList &number, DigitList &adjustedNum, UBool& isNegative, UErrorCode &status) const { 16348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 163759d709d503bab6e2b61931737e662dd293b40578ccornelius 163859d709d503bab6e2b61931737e662dd293b40578ccornelius // note: number and adjustedNum may refer to the same DigitList, in cases where a copy 163959d709d503bab6e2b61931737e662dd293b40578ccornelius // is not needed by the caller. 164059d709d503bab6e2b61931737e662dd293b40578ccornelius 16418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius adjustedNum = number; 16428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius isNegative = false; 16438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (number.isNaN()) { 16448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1647c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // Do this BEFORE checking to see if value is infinite or negative! Sets the 1648c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // begin and end index to be length of the string composed of 1649c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // localized name of Infinite and the positive/negative localized 1650c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // signs. 1651c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 165250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.setRoundingMode(fRoundingMode); 165350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier != NULL) { 165450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.mult(*fMultiplier, status); 16558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 165850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1659c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 16608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale != 0) { 16618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius DigitList ten; 166259d709d503bab6e2b61931737e662dd293b40578ccornelius ten.set((int32_t)10); 16638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale > 0) { 16648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale ; i > 0 ; i--) { 16658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius adjustedNum.mult(ten, status); 16668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 16718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale ; i < 0 ; i++) { 16728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius adjustedNum.div(ten, status); 16738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16768393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 16798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 16808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /* 168150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Note: sign is important for zero as well as non-zero numbers. 168250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Proper detection of -0.0 is needed to deal with the 1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * issues raised by bugs 4106658, 4106667, and 4147706. Liu 7/6/98. 1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 16858393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius isNegative = !adjustedNum.isPositive(); 1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Apply rounding after multiplier 16888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 1689b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho adjustedNum.fContext.status &= ~DEC_Inexact; 1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fRoundingIncrement != NULL) { 169150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.div(*fRoundingIncrement, status); 169250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.toIntegralValue(); 169350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.mult(*fRoundingIncrement, status); 169450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho adjustedNum.trim(); 16958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 16968393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 16978393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1699b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fRoundingMode == kRoundUnnecessary && (adjustedNum.fContext.status & DEC_Inexact)) { 1700b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_FORMAT_INEXACT_ERROR; 17018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 1702b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 170450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (adjustedNum.isInfinite()) { 17058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 170827f654740f2a26ad62a5c155af9199af9e69b889claireho if (fUseExponentialNotation || areSignificantDigitsUsed()) { 170927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t sigDigits = precision(); 171027f654740f2a26ad62a5c155af9199af9e69b889claireho if (sigDigits > 0) { 171127f654740f2a26ad62a5c155af9199af9e69b889claireho adjustedNum.round(sigDigits); 1712fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // Travis Keep (21/2/2014): Calling round on a digitList does not necessarily 1713fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // preserve the sign of that digit list. Preserving the sign is especially 1714fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // important when formatting -0.0 for instance. Not preserving the sign seems 1715fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // like a bug because I cannot think of any case where the sign would actually 1716fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // have to change when rounding. For now, we preserve the sign by setting the 1717fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius // positive attribute directly. 1718fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius adjustedNum.setPositive(!isNegative); 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 172027f654740f2a26ad62a5c155af9199af9e69b889claireho } else { 172127f654740f2a26ad62a5c155af9199af9e69b889claireho // Fixed point format. Round to a set number of fraction digits. 172227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t numFractionDigits = precision(); 172327f654740f2a26ad62a5c155af9199af9e69b889claireho adjustedNum.roundFixedPoint(numFractionDigits); 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fRoundingMode == kRoundUnnecessary && (adjustedNum.fContext.status & DEC_Inexact)) { 1726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status = U_FORMAT_INEXACT_ERROR; 17278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 17288393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return adjustedNum; 17308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius} 17318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusUnicodeString& 17338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusDecimalFormat::_format(const DigitList &number, 17348393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UnicodeString& appendTo, 17358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius FieldPositionHandler& handler, 17368393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode &status) const 17378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{ 17388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 17398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return appendTo; 17408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // Special case for NaN, sets the begin and end index to be the 17438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // the string length of localized name of NaN. 17448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (number.isNaN()) 17458393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius { 17468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int begin = appendTo.length(); 17478393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius appendTo += getConstSymbol(DecimalFormatSymbols::kNaNSymbol); 17488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius handler.addAttribute(kIntegerField, begin, appendTo.length()); 17508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius addPadding(appendTo, handler, 0, 0); 17528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return appendTo; 17538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius DigitList adjustedNum; 17568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UBool isNegative; 17578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius _round(number, adjustedNum, isNegative, status); 17588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (U_FAILURE(status)) { 17598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return appendTo; 17608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 17618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // Special case for INFINITE, 17638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (adjustedNum.isInfinite()) { 17648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int32_t prefixLen = appendAffix(appendTo, adjustedNum.getDouble(), handler, isNegative, TRUE); 17658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int begin = appendTo.length(); 17678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius appendTo += getConstSymbol(DecimalFormatSymbols::kInfinitySymbol); 17688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius handler.addAttribute(kIntegerField, begin, appendTo.length()); 17708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius int32_t suffixLen = appendAffix(appendTo, adjustedNum.getDouble(), handler, isNegative, FALSE); 17728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 17738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius addPadding(appendTo, handler, prefixLen, suffixLen); 1774b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return appendTo; 1775b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 177654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return subformat(appendTo, handler, adjustedNum, FALSE, status); 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return true if a grouping separator belongs at the given 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * position, based on whether grouping is in use and the values of 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the primary and secondary grouping interval. 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos the number of integer digits to the right of 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the current position. Zero indicates the position after the 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * rightmost integer digit. 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return true if a grouping character belongs at the current 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * position. 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool DecimalFormat::isGroupingPosition(int32_t pos) const { 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result = FALSE; 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isGroupingUsed() && (pos > 0) && (fGroupingSize > 0)) { 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((fGroupingSize2 > 0) && (pos > fGroupingSize)) { 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = ((pos - fGroupingSize) % fGroupingSize2) == 0; 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = pos % fGroupingSize == 0; 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 180450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Complete the formatting of a finite number. On entry, the DigitList must 1805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * be filled in with the correct digits. 1806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 1808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::subformat(UnicodeString& appendTo, 180950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DigitList& digits, 181154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool isInteger, 181254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode& status) const 1813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 181427f654740f2a26ad62a5c155af9199af9e69b889claireho // char zero = '0'; 181527f654740f2a26ad62a5c155af9199af9e69b889claireho // DigitList returns digits as '0' thru '9', so we will need to 181627f654740f2a26ad62a5c155af9199af9e69b889claireho // always need to subtract the character 0 to get the numeric value to use for indexing. 181727f654740f2a26ad62a5c155af9199af9e69b889claireho 181827f654740f2a26ad62a5c155af9199af9e69b889claireho UChar32 localizedDigits[10]; 181927f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[0] = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); 182027f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[1] = getConstSymbol(DecimalFormatSymbols::kOneDigitSymbol).char32At(0); 182127f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[2] = getConstSymbol(DecimalFormatSymbols::kTwoDigitSymbol).char32At(0); 182227f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[3] = getConstSymbol(DecimalFormatSymbols::kThreeDigitSymbol).char32At(0); 182327f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[4] = getConstSymbol(DecimalFormatSymbols::kFourDigitSymbol).char32At(0); 182427f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[5] = getConstSymbol(DecimalFormatSymbols::kFiveDigitSymbol).char32At(0); 182527f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[6] = getConstSymbol(DecimalFormatSymbols::kSixDigitSymbol).char32At(0); 182627f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[7] = getConstSymbol(DecimalFormatSymbols::kSevenDigitSymbol).char32At(0); 182727f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[8] = getConstSymbol(DecimalFormatSymbols::kEightDigitSymbol).char32At(0); 182827f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[9] = getConstSymbol(DecimalFormatSymbols::kNineDigitSymbol).char32At(0); 182927f654740f2a26ad62a5c155af9199af9e69b889claireho 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *grouping ; 183159d709d503bab6e2b61931737e662dd293b40578ccornelius if(fCurrencySignCount == fgCurrencySignCountZero) { 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru grouping = &getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol); 183359d709d503bab6e2b61931737e662dd293b40578ccornelius }else{ 183459d709d503bab6e2b61931737e662dd293b40578ccornelius grouping = &getConstSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol); 1835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *decimal; 183759d709d503bab6e2b61931737e662dd293b40578ccornelius if(fCurrencySignCount == fgCurrencySignCountZero) { 1838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru decimal = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 183959d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 184059d709d503bab6e2b61931737e662dd293b40578ccornelius decimal = &getConstSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); 1841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool useSigDig = areSignificantDigitsUsed(); 1843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxIntDig = getMaximumIntegerDigits(); 1844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minIntDig = getMinimumIntegerDigits(); 1845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Appends the prefix. 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double doubleValue = digits.getDouble(); 184850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t prefixLen = appendAffix(appendTo, doubleValue, handler, !digits.isPositive(), TRUE); 1849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation) 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 185250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int currentLength = appendTo.length(); 185350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int intBegin = currentLength; 185450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int intEnd = -1; 185550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int fracBegin = -1; 1856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minFracDig = 0; 1858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 1859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxIntDig = minIntDig = 1; 1860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minFracDig = getMinimumSignificantDigits() - 1; 1861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minFracDig = getMinimumFractionDigits(); 1863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig > kMaxScientificIntegerDigits) { 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxIntDig = 1; 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig < minIntDig) { 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxIntDig = minIntDig; 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig > minIntDig) { 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minIntDig = 1; 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Minimum integer digits are handled in exponential format by 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // adjusting the exponent. For example, 0.01234 with 3 minimum 1876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // integer digits is "123.4E-4". 1877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Maximum integer digits are interpreted as indicating the 1879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // repeating range. This is useful for engineering notation, in 1880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // which the exponent is restricted to a multiple of 3. For 1881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // example, 0.01234 with 3 maximum integer digits is "12.34e-3". 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If maximum integer digits are defined and are larger than 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // minimum integer digits, then minimum integer digits are 1884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ignored. 188550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.reduce(); // Removes trailing zero digits. 188650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t exponent = digits.getDecimalAt(); 1887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxIntDig > 1 && maxIntDig != minIntDig) { 1888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A exponent increment is defined; adjust to it. 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent = (exponent > 0) ? (exponent - 1) / maxIntDig 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : (exponent / maxIntDig) - 1; 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent *= maxIntDig; 1892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // No exponent increment is defined; use minimum integer digits. 1894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If none is specified, as in "#E0", generate 1 integer digit. 1895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent -= (minIntDig > 0 || minFracDig > 0) 1896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? minIntDig : 1; 1897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We now output a minimum number of digits, and more if there 1900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // are more digits, up to the maximum number of digits. We 1901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // place the decimal point after the "integer" digits, which 1902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // are the first (decimalAt - exponent) digits. 1903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minimumDigits = minIntDig + minFracDig; 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The number of integer digits is handled specially if the number 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is zero, since then there may be no digits. 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t integerDigits = digits.isZero() ? minIntDig : 190750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.getDecimalAt() - exponent; 190850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t totalDigits = digits.getCount(); 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (minimumDigits > totalDigits) 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru totalDigits = minimumDigits; 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (integerDigits > totalDigits) 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru totalDigits = integerDigits; 1913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // totalDigits records total number of digits needs to be processed 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<totalDigits; ++i) 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i == integerDigits) 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 192050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho intEnd = appendTo.length(); 192150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, intBegin, intEnd); 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += *decimal; 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 192550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fracBegin = appendTo.length(); 192650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kDecimalSeparatorField, fracBegin - 1, fracBegin); 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Restores the digit character or pads the buffer with zeros. 192950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar32 c = (UChar32)((i < digits.getCount()) ? 193027f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[digits.getDigitValue(i)] : 193127f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[0]); 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 193650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (intEnd < 0) { 193850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, intBegin, currentLength); 1939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 194050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fracBegin > 0) { 194150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kFractionField, fracBegin, currentLength); 1942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The exponent is output using the pattern-specified minimum 1945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // exponent digits. There is no maximum limit to the exponent 1946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // digits, since truncating the exponent would appendTo in an 1947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // unacceptable inaccuracy. 1948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); 1949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentSymbolField, currentLength, appendTo.length()); 195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // For zero values, we force the exponent to zero. We 1954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // must do this here, and not earlier, because the value 1955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is used to determine integer digit count above. 1956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (digits.isZero()) 1957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exponent = 0; 1958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (exponent < 0) { 1960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentSignField, currentLength, appendTo.length()); 1962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (fExponentSignAlwaysShown) { 1963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 196450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentSignField, currentLength, appendTo.length()); 1965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DigitList expDigits; 1970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expDigits.set(exponent); 1971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int expDig = fMinExponentDigits; 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation && expDig < 1) { 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expDig = 1; 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i=expDigits.getDecimalAt(); i<expDig; ++i) 197727f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += (localizedDigits[0]); 1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 197950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i=0; i<expDigits.getDecimalAt(); ++i) 1980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 198150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar32 c = (UChar32)((i < expDigits.getCount()) ? 198227f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[expDigits.getDigitValue(i)] : 198327f654740f2a26ad62a5c155af9199af9e69b889claireho localizedDigits[0]); 1984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 1985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 198750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kExponentField, currentLength, appendTo.length()); 1988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else // Not using exponential notation 1990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 199150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int currentLength = appendTo.length(); 199250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int intBegin = currentLength; 1993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sigCount = 0; 1995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t minSigDig = getMinimumSignificantDigits(); 1996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxSigDig = getMaximumSignificantDigits(); 1997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!useSigDig) { 1998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minSigDig = 0; 1999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxSigDig = INT32_MAX; 2000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output the integer portion. Here 'count' is the total 2003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // number of integer digits we will display, including both 2004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // leading zeros required to satisfy getMinimumIntegerDigits, 2005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // and actual digits present in the number. 2006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t count = useSigDig ? 200750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho _max(1, digits.getDecimalAt()) : minIntDig; 200850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digits.getDecimalAt() > 0 && count < digits.getDecimalAt()) { 200950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho count = digits.getDecimalAt(); 2010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle the case where getMaximumIntegerDigits() is smaller 2013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // than the real number of integer digits. If this is so, we 2014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // output the least significant max integer digits. For example, 2015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the value 1997 printed with 2 max integer digits is just "97". 2016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digitIndex = 0; // Index into digitList.fDigits[] 2018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (count > maxIntDig && maxIntDig >= 0) { 2019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = maxIntDig; 202050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digitIndex = digits.getDecimalAt() - count; 202154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(fBoolFlags.contains(UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS)) { 202254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ILLEGAL_ARGUMENT_ERROR; 202354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sizeBeforeIntegerPart = appendTo.length(); 2027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 2029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=count-1; i>=0; --i) 2030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 203150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (i < digits.getDecimalAt() && digitIndex < digits.getCount() && 2032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sigCount < maxSigDig) { 2033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a real digit 203427f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += (UChar32)localizedDigits[digits.getDigitValue(digitIndex++)]; 2035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++sigCount; 2036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 2038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a zero (leading or trailing) 204027f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sigCount > 0) { 2042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++sigCount; 2043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output grouping separator if necessary. 2047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isGroupingPosition(i)) { 204850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 2049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(*grouping); 205050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kGroupingSeparatorField, currentLength, appendTo.length()); 2051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 205459d709d503bab6e2b61931737e662dd293b40578ccornelius // This handles the special case of formatting 0. For zero only, we count the 205559d709d503bab6e2b61931737e662dd293b40578ccornelius // zero to the left of the decimal point as one signficant digit. Ordinarily we 205659d709d503bab6e2b61931737e662dd293b40578ccornelius // do not count any leading 0's as significant. If the number we are formatting 205759d709d503bab6e2b61931737e662dd293b40578ccornelius // is not zero, then either sigCount or digits.getCount() will be non-zero. 205859d709d503bab6e2b61931737e662dd293b40578ccornelius if (sigCount == 0 && digits.getCount() == 0) { 205959d709d503bab6e2b61931737e662dd293b40578ccornelius sigCount = 1; 206059d709d503bab6e2b61931737e662dd293b40578ccornelius } 206159d709d503bab6e2b61931737e662dd293b40578ccornelius 206250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TODO(dlf): this looks like it was a bug, we marked the int field as ending 206350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // before the zero was generated. 2064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Record field information for caller. 206550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if (fieldPosition.getField() == NumberFormat::kIntegerField) 206650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // fieldPosition.setEndIndex(appendTo.length()); 2067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Determine whether or not there are any printable fractional 2069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // digits. If we've used up the digits we know there aren't. 207050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool fractionPresent = (!isInteger && digitIndex < digits.getCount()) || 2071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (useSigDig ? (sigCount < minSigDig) : (getMinimumFractionDigits() > 0)); 2072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If there is no fraction present, and we haven't printed any 2074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // integer digits, then print a zero. Otherwise we won't print 2075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // _any_ digits, and we won't be able to parse this string. 2076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!fractionPresent && appendTo.length() == sizeBeforeIntegerPart) 207727f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 207950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 208050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kIntegerField, intBegin, currentLength); 208150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output the decimal separator if we always do so. 208350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fDecimalSeparatorAlwaysShown || fractionPresent) { 2084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += *decimal; 208550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kDecimalSeparatorField, currentLength, appendTo.length()); 208650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho currentLength = appendTo.length(); 208750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 208950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int fracBegin = currentLength; 2090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = useSigDig ? INT32_MAX : getMaximumFractionDigits(); 2092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig && (sigCount == maxSigDig || 209350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (sigCount >= minSigDig && digitIndex == digits.getCount()))) { 2094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru count = 0; 2095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i < count; ++i) { 2098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Here is where we escape from the loop. We escape 2099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // if we've output the maximum fraction digits 2100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (specified in the for expression above). We also 2101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // stop when we've output the minimum digits and 2102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // either: we have an integer, so there is no 2103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // fractional stuff to display, or we're out of 2104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // significant digits. 2105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!useSigDig && i >= getMinimumFractionDigits() && 210650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (isInteger || digitIndex >= digits.getCount())) { 2107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output leading fractional zeros. These are zeros 2111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that come after the decimal but before any 2112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // significant digits. These are only output if 2113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // abs(number being formatted) < 1.0. 211450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (-1-i > (digits.getDecimalAt()-1)) { 211527f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 2117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Output a digit, if we have any precision left, or a 2120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // zero if we don't. We don't want to output noise digits. 212150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!isInteger && digitIndex < digits.getCount()) { 212227f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += (UChar32)localizedDigits[digits.getDigitValue(digitIndex++)]; 2123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 212427f654740f2a26ad62a5c155af9199af9e69b889claireho appendTo += localizedDigits[0]; 2125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we reach the maximum number of significant 2128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // digits, or if we output all the real digits and 2129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // reach the minimum, then we are done. 2130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++sigCount; 2131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig && 2132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (sigCount == maxSigDig || 213350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (digitIndex == digits.getCount() && sigCount >= minSigDig))) { 2134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 213850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kFractionField, fracBegin, appendTo.length()); 2139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 214150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t suffixLen = appendAffix(appendTo, doubleValue, handler, !digits.isPositive(), FALSE); 2142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 214350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addPadding(appendTo, handler, prefixLen, suffixLen); 2144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return appendTo; 2145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Inserts the character fPad as needed to expand result to fFormatWidth. 2149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param result the string to be padded 2150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::addPadding(UnicodeString& appendTo, 215250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 2153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t prefixLen, 2154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t suffixLen) const 2155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 2156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0) { 2157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = fFormatWidth - appendTo.length(); 2158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (len > 0) { 2159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString padding; 2160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<len; ++i) { 2161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padding += fPad; 2162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (fPadPosition) { 2164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadAfterPrefix: 2165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.insert(prefixLen, padding); 2166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadBeforePrefix: 2168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.insert(0, padding); 2169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadBeforeSuffix: 2171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.insert(appendTo.length() - suffixLen, padding); 2172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPadAfterSuffix: 2174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += padding; 2175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 2176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 217750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fPadPosition == kPadBeforePrefix || fPadPosition == kPadAfterPrefix) { 217850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.shiftLast(len); 2179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 218550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 2187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::parse(const UnicodeString& text, 2188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable& result, 2189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition& parsePosition) const { 2190103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parse(text, result, parsePosition, NULL); 2191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2193103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusCurrencyAmount* DecimalFormat::parseCurrency(const UnicodeString& text, 2194103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ParsePosition& pos) const { 2195103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius Formattable parseResult; 2196103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t start = pos.getIndex(); 21978393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UChar curbuf[4] = {}; 2198103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parse(text, parseResult, pos, curbuf); 2199103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (pos.getIndex() != start) { 2200103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UErrorCode ec = U_ZERO_ERROR; 22011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert LocalPointer<CurrencyAmount> currAmt(new CurrencyAmount(parseResult, curbuf, ec), ec); 2202103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if (U_FAILURE(ec)) { 2203103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius pos.setIndex(start); // indicate failure 2204103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2205103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return currAmt.orphan(); 2206103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2208103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return NULL; 2209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2212103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Parses the given text as a number, optionally providing a currency amount. 2213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param text the string to parse 2214103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @param result output parameter for the numeric result. 2215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param parsePosition input-output position; on input, the 2216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * position within text to match; must have 0 <= pos.getIndex() < 2217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * text.length(); on output, the position after the last matched 2218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character. If the parse fails, the position in unchanged upon 2219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * output. 2220103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * @param currency if non-NULL, it should point to a 4-UChar buffer. 2221103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * In this case the text is parsed as a currency format, and the 2222103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * ISO 4217 code for the parsed currency is put into the buffer. 2223103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius * Otherwise the text is parsed as a non-currency format. 2224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::parse(const UnicodeString& text, 2226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Formattable& result, 2227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ParsePosition& parsePosition, 2228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar* currency) const { 2229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t startIdx, backup; 2230103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t i = startIdx = backup = parsePosition.getIndex(); 2231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 223250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // clear any old contents in the result. In particular, clears any DigitList 223350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // that it may be holding. 223450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result.setLong(0); 223559d709d503bab6e2b61931737e662dd293b40578ccornelius if (currency != NULL) { 223659d709d503bab6e2b61931737e662dd293b40578ccornelius for (int32_t ci=0; ci<4; ci++) { 223759d709d503bab6e2b61931737e662dd293b40578ccornelius currency[ci] = 0; 223859d709d503bab6e2b61931737e662dd293b40578ccornelius } 223959d709d503bab6e2b61931737e662dd293b40578ccornelius } 224050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle NaN as a special case: 224250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Skip padding characters, if around prefix 2244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && (fPadPosition == kPadBeforePrefix || 2245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition == kPadAfterPrefix)) { 2246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = skipPadding(text, i); 2247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (isLenient()) { 2250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // skip any leading whitespace 2251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho i = backup = skipUWhiteSpace(text, i); 2252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the text is composed of the representation of NaN, returns NaN.length 2255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *nan = &getConstSymbol(DecimalFormatSymbols::kNaNSymbol); 2256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t nanLen = (text.compare(i, nan->length(), *nan) 2257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? 0 : nan->length()); 2258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nanLen) { 2259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += nanLen; 2260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && (fPadPosition == kPadBeforeSuffix || 2261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition == kPadAfterSuffix)) { 2262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = skipPadding(text, i); 2263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setIndex(i); 2265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.setDouble(uprv_getNaN()); 2266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 2267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 226850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NaN parse failed; start over 2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = backup; 2271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsePosition.setIndex(i); 2272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // status is used to record whether a number is infinite. 2274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool status[fgStatusLength]; 2275103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2276103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DigitList *digits = result.getInternalDigitList(); // get one from the stack buffer 227750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digits == NULL) { 227850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; // no way to report error from here. 227950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 228159d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 228250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!parseForCurrency(text, parsePosition, *digits, 2283b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status, currency)) { 2284103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return; 2285b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2286b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 228750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!subparse(text, 2288b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegPrefixPattern, fNegSuffixPattern, 2289b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPosPrefixPattern, fPosSuffixPattern, 2290b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru FALSE, UCURR_SYMBOL_NAME, 229150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsePosition, *digits, status, currency)) { 2292103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("!subparse(...) - rewind"); 2293103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsePosition.setIndex(startIdx); 2294b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 2295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Handle infinity 2299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status[fgStatusInfinite]) { 2300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double inf = uprv_getInfinity(); 230150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result.setDouble(digits->isPositive() ? inf : -inf); 2302103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // TODO: set the dl to infinity, and let it fall into the code below. 2303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 2306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier != NULL) { 230850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode ec = U_ZERO_ERROR; 230950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits->div(*fMultiplier, ec); 2310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 231150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 23128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale != 0) { 23138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius DigitList ten; 231459d709d503bab6e2b61931737e662dd293b40578ccornelius ten.set((int32_t)10); 23158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if (fScale > 0) { 23168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale; i > 0; i--) { 23178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode ec = U_ZERO_ERROR; 23188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius digits->div(ten,ec); 23198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } else { 23218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius for (int32_t i = fScale; i < 0; i++) { 23228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UErrorCode ec = U_ZERO_ERROR; 23238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius digits->mult(ten,ec); 23248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 23278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 232850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Negative zero special case: 232950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if parsing integerOnly, change to +0, which goes into an int32 in a Formattable. 233050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if not parsing integerOnly, leave as -0, which a double can represent. 233150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digits->isZero() && !digits->isPositive() && isParseIntegerOnly()) { 233250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits->setPositive(TRUE); 2333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 233450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result.adoptDigitList(digits); 2335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruUBool 2341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::parseForCurrency(const UnicodeString& text, 2342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition& parsePosition, 2343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList& digits, 2344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool* status, 2345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar* currency) const { 2346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int origPos = parsePosition.getIndex(); 2347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int maxPosIndex = origPos; 2348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int maxErrorPos = -1; 2349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // First, parse against current pattern. 2350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Since current pattern could be set by applyPattern(), 2351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // it could be an arbitrary pattern, and it may not be the one 2352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // defined in current locale. 2353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool tmpStatus[fgStatusLength]; 2354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition tmpPos(origPos); 2355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList tmpDigitList; 2356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool found; 2357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 235850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho found = subparse(text, 2359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegPrefixPattern, fNegSuffixPattern, 2360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPosPrefixPattern, fPosSuffixPattern, 2361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TRUE, UCURR_LONG_NAME, 2362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos, tmpDigitList, tmpStatus, currency); 2363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 236450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho found = subparse(text, 2365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fNegPrefixPattern, fNegSuffixPattern, 2366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fPosPrefixPattern, fPosSuffixPattern, 2367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TRUE, UCURR_SYMBOL_NAME, 2368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos, tmpDigitList, tmpStatus, currency); 2369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (found) { 2371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tmpPos.getIndex() > maxPosIndex) { 2372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxPosIndex = tmpPos.getIndex(); 2373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < fgStatusLength; ++i) { 2374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status[i] = tmpStatus[i]; 2375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru digits = tmpDigitList; 2377b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxErrorPos = tmpPos.getErrorIndex(); 2380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Then, parse against affix patterns. 2382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Those are currency patterns and currency plural patterns. 23831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t pos = UHASH_FIRST; 2384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 2385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = fAffixPatternsForCurrency->nextElement(pos)) != NULL ) { 2386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 2387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixPatternsForCurrency* affixPtn = (AffixPatternsForCurrency*)valueTok.pointer; 2388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool tmpStatus[fgStatusLength]; 2389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition tmpPos(origPos); 2390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList tmpDigitList; 239159d709d503bab6e2b61931737e662dd293b40578ccornelius 239259d709d503bab6e2b61931737e662dd293b40578ccornelius#ifdef FMT_DEBUG 239359d709d503bab6e2b61931737e662dd293b40578ccornelius debug("trying affix for currency.."); 239459d709d503bab6e2b61931737e662dd293b40578ccornelius affixPtn->dump(); 239559d709d503bab6e2b61931737e662dd293b40578ccornelius#endif 239659d709d503bab6e2b61931737e662dd293b40578ccornelius 239750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result = subparse(text, 2398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &affixPtn->negPrefixPatternForCurrency, 239950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &affixPtn->negSuffixPatternForCurrency, 240050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &affixPtn->posPrefixPatternForCurrency, 2401b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &affixPtn->posSuffixPatternForCurrency, 2402b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TRUE, affixPtn->patternType, 2403b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos, tmpDigitList, tmpStatus, currency); 2404b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (result) { 2405b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru found = true; 2406b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tmpPos.getIndex() > maxPosIndex) { 2407b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxPosIndex = tmpPos.getIndex(); 2408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < fgStatusLength; ++i) { 2409b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status[i] = tmpStatus[i]; 2410b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2411b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru digits = tmpDigitList; 2412b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2414b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxErrorPos = (tmpPos.getErrorIndex() > maxErrorPos) ? 2415b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos.getErrorIndex() : maxErrorPos; 2416b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2418b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Finally, parse against simple affix to find the match. 2419b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // For example, in TestMonster suite, 2420b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // if the to-be-parsed text is "-\u00A40,00". 2421b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // complexAffixCompare will not find match, 2422b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // since there is no ISO code matches "\u00A4", 2423b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // and the parse stops at "\u00A4". 2424b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // We will just use simple affix comparison (look for exact match) 2425b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // to pass it. 242659d709d503bab6e2b61931737e662dd293b40578ccornelius // 242759d709d503bab6e2b61931737e662dd293b40578ccornelius // TODO: We should parse against simple affix first when 242859d709d503bab6e2b61931737e662dd293b40578ccornelius // output currency is not requested. After the complex currency 242959d709d503bab6e2b61931737e662dd293b40578ccornelius // parsing implementation was introduced, the default currency 243059d709d503bab6e2b61931737e662dd293b40578ccornelius // instance parsing slowed down because of the new code flow. 243159d709d503bab6e2b61931737e662dd293b40578ccornelius // I filed #10312 - Yoshito 2432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool tmpStatus_2[fgStatusLength]; 2433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition tmpPos_2(origPos); 2434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru DigitList tmpDigitList_2; 243559d709d503bab6e2b61931737e662dd293b40578ccornelius 243659d709d503bab6e2b61931737e662dd293b40578ccornelius // Disable complex currency parsing and try it again. 243750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result = subparse(text, 2438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &fNegativePrefix, &fNegativeSuffix, 2439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &fPositivePrefix, &fPositiveSuffix, 244059d709d503bab6e2b61931737e662dd293b40578ccornelius FALSE /* disable complex currency parsing */, UCURR_SYMBOL_NAME, 244150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho tmpPos_2, tmpDigitList_2, tmpStatus_2, 2442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru currency); 2443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (result) { 2444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (tmpPos_2.getIndex() > maxPosIndex) { 2445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxPosIndex = tmpPos_2.getIndex(); 2446b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (int32_t i = 0; i < fgStatusLength; ++i) { 2447b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status[i] = tmpStatus_2[i]; 2448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru digits = tmpDigitList_2; 2450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru found = true; 2452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru maxErrorPos = (tmpPos_2.getErrorIndex() > maxErrorPos) ? 2454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru tmpPos_2.getErrorIndex() : maxErrorPos; 2455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (!found) { 2458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru //parsePosition.setIndex(origPos); 2459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parsePosition.setErrorIndex(maxErrorPos); 2460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 2461b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parsePosition.setIndex(maxPosIndex); 2462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru parsePosition.setErrorIndex(-1); 2463b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 2464b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return found; 2465b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 2466b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2467b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 2468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 2469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Parse the given text into a number. The text is parsed beginning at 2470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * parsePosition, until an unparseable character is seen. 2471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param text the string to parse. 2472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param negPrefix negative prefix. 2473b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param negSuffix negative suffix. 2474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param posPrefix positive prefix. 2475b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param posSuffix positive suffix. 247659d709d503bab6e2b61931737e662dd293b40578ccornelius * @param complexCurrencyParsing whether it is complex currency parsing or not. 2477b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param type the currency type to parse against, LONG_NAME only or not. 2478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param parsePosition The position at which to being parsing. Upon 2479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * return, the first unparsed character. 2480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param digits the DigitList to set to the parsed value. 2481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param status output param containing boolean status flags indicating 2482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * whether the value was infinite and whether it was positive. 2483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param currency return value for parsed currency, for generic 2484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, or NULL for normal parsing. In generic 2485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, any currency is parsed, not just the 2486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency that this formatter is set to. 2487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 248850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUBool DecimalFormat::subparse(const UnicodeString& text, 2489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* negPrefix, 2490b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* negSuffix, 2491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* posPrefix, 2492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* posSuffix, 249359d709d503bab6e2b61931737e662dd293b40578ccornelius UBool complexCurrencyParsing, 2494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int8_t type, 2495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition& parsePosition, 2496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DigitList& digits, UBool* status, 2497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* currency) const 2498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 249950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // The parsing process builds up the number as char string, in the neutral format that 250050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // will be acceptable to the decNumber library, then at the end passes that string 250150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // off for conversion to a decNumber. 250250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode err = U_ZERO_ERROR; 250327f654740f2a26ad62a5c155af9199af9e69b889claireho CharString parsedNum; 250450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho digits.setToZero(); 250550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t position = parsePosition.getIndex(); 2507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t oldStart = position; 2508103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t textLength = text.length(); // One less pointer to follow 2509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool strictParse = !isLenient(); 2510103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 zero = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); 251159d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeString *groupingString = &getConstSymbol(fCurrencySignCount == fgCurrencySignCountZero ? 251259d709d503bab6e2b61931737e662dd293b40578ccornelius DecimalFormatSymbols::kGroupingSeparatorSymbol : DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol); 251354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar32 groupingChar = groupingString->char32At(0); 251454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t groupingStringLength = groupingString->length(); 251554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t groupingCharLength = U16_LENGTH(groupingChar); 251654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool groupingUsed = isGroupingUsed(); 2517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar dbgbuf[300]; 2519103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UnicodeString s(dbgbuf,0,300);; 2520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius s.append((UnicodeString)"PARSE \"").append(text.tempSubString(position)).append((UnicodeString)"\" " ); 252154dcd9b6a06071f647dac967e9e267abb9410720Craig 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 ")); } 2522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(negPrefix); 2523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(negSuffix); 2524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(posPrefix); 2525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius DBGAPPD(posSuffix); 2526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debugout(s); 252754dcd9b6a06071f647dac967e9e267abb9410720Craig 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); 2528103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UBool fastParseOk = false; /* TRUE iff fast parse is OK */ 25318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // UBool fastParseHadDecimal = FALSE; /* true if fast parse saw a decimal point. */ 253254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const DecimalFormatInternal &data = internalData(fReserved); 253354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if((data.fFastParseStatus==kFastpathYES) && 253459d709d503bab6e2b61931737e662dd293b40578ccornelius fCurrencySignCount == fgCurrencySignCountZero && 253554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (negPrefix!=NULL&&negPrefix->isEmpty()) || 253654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius text.length()>0 && 253754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius text.length()<32 && 253854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (posPrefix==NULL||posPrefix->isEmpty()) && 253954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (posSuffix==NULL||posSuffix->isEmpty()) && 254054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (negPrefix==NULL||negPrefix->isEmpty()) && 254154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (negSuffix==NULL||(negSuffix->isEmpty()) ) && 254254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius TRUE) { // optimized path 2543103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int j=position; 2544103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int l=text.length(); 2545103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int digitCount=0; 2546103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 ch = text.char32At(j); 2547103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius const UnicodeString *decimalString = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 2548103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 decimalChar = 0; 254954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool intOnly = FALSE; 255054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UChar32 lookForGroup = (groupingUsed&&intOnly&&strictParse)?groupingChar:0; 255154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 2552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t decimalCount = decimalString->countChar32(0,3); 2553103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(isParseIntegerOnly()) { 2554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius decimalChar = 0; // not allowed 255554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius intOnly = TRUE; // Don't look for decimals. 2556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(decimalCount==1) { 255754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius decimalChar = decimalString->char32At(0); // Look for this decimal 2558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(decimalCount==0) { 255954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius decimalChar=0; // NO decimal set 2560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 256154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius j=l+1;//Set counter to end of line, so that we break. Unknown decimal situation. 2562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 256454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#ifdef FMT_DEBUG 256554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("Preparing to do fastpath parse: decimalChar=U+%04X, groupingChar=U+%04X, first ch=U+%04X intOnly=%c strictParse=%c\n", 256654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius decimalChar, groupingChar, ch, 256754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (intOnly)?'y':'n', 256854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius (strictParse)?'y':'n'); 256954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 257054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(ch==0x002D) { // '-' 257154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius j=l+1;//=break - negative number. 2572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* 2574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append('-',err); 2575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius j+=U16_LENGTH(ch); 2576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(j<l) ch = text.char32At(j); 2577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius */ 2578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append('+',err); 2580103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2581103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius while(j<l) { 2582103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t digit = ch - zero; 2583103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(digit >=0 && digit <= 9) { 2584103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append((char)(digit + '0'), err); 2585103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if((digitCount>0) || digit!=0 || j==(l-1)) { 2586103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius digitCount++; 2587103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 258854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(ch == 0) { // break out 258954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digitCount=-1; 259054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 2591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if(ch == decimalChar) { 2592103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append((char)('.'), err); 2593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius decimalChar=0; // no more decimals. 25948393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius // fastParseHadDecimal=TRUE; 259554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(ch == lookForGroup) { 259654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // ignore grouping char. No decimals, so it has to be an ignorable grouping sep 259754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else if(intOnly && (lookForGroup!=0) && !u_isdigit(ch)) { 259854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // parsing integer only and can fall through 2599103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 260054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digitCount=-1; // fail - fall through to slow parse 2601103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius break; 2602103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2603103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius j+=U16_LENGTH(ch); 2604103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ch = text.char32At(j); // for next 2605103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 260654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if( 260754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ((j==l)||intOnly) // end OR only parsing integer 260854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius && (digitCount>0)) { // and have at least one digit 2609103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2610103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("PP -> %d, good = [%s] digitcount=%d, fGroupingSize=%d fGroupingSize2=%d!\n", j, parsedNum.data(), digitCount, fGroupingSize, fGroupingSize2); 2611103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2612103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fastParseOk=true; // Fast parse OK! 2613103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2614103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef SKIP_OPT 2615103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("SKIP_OPT"); 2616103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius /* for testing, try it the slow way. also */ 2617103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fastParseOk=false; 2618103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.clear(); 2619103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#else 2620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsePosition.setIndex(position=j); 2621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius status[fgStatusInfinite]=false; 2622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // was not OK. reset, retry 2625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("Fall through: j=%d, l=%d, digitCount=%d\n", j, l, digitCount); 2627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.clear(); 2629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 263054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 263154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#ifdef FMT_DEBUG 263254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("Could not fastpath parse. "); 263354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("fFormatWidth=%d ", fFormatWidth); 263454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("text.length()=%d ", text.length()); 263554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("posPrefix=%p posSuffix=%p ", posPrefix, posSuffix); 263654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 263754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius printf("\n"); 263854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 2639103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 2640103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2641103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(!fastParseOk 2642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 2643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius && fParseAllInput!=UNUM_YES 2644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius ) 2646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { 2647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before prefix 2648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadBeforePrefix) { 2649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 2650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match positive and negative prefixes; prefer longest match. 265359d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t posMatch = compareAffix(text, position, FALSE, TRUE, posPrefix, complexCurrencyParsing, type, currency); 265459d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t negMatch = compareAffix(text, position, TRUE, TRUE, negPrefix, complexCurrencyParsing, type, currency); 2655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posMatch >= 0 && negMatch >= 0) { 2656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posMatch > negMatch) { 2657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru negMatch = -1; 2658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (negMatch > posMatch) { 2659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru posMatch = -1; 266050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (posMatch >= 0) { 2663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += posMatch; 266450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append('+', err); 2665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (negMatch >= 0) { 2666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += negMatch; 266750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append('-', err); 2668b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (strictParse){ 2669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(position); 2670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 2671103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else { 2672103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius // Temporary set positive. This might be changed after checking suffix 2673103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsedNum.append('+', err); 2674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before prefix 2677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadAfterPrefix) { 2678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 2679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2681b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (! strictParse) { 2682b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position = skipUWhiteSpace(text, position); 2683b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2684b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // process digits or Inf, find decimal position 2686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *inf = &getConstSymbol(DecimalFormatSymbols::kInfinitySymbol); 2687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t infLen = (text.compare(position, inf->length(), *inf) 2688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? 0 : inf->length()); 2689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += infLen; // infLen is non-zero when it does equal to infinity 2690b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho status[fgStatusInfinite] = infLen != 0; 2691b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2692b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (infLen != 0) { 269350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append("Infinity", err); 269450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 2695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We now have a string of digits, possibly with grouping symbols, 2696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // and decimal points. We want to process these into a DigitList. 2697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We don't want to put a bunch of leading zeros into the DigitList 2698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // though, so we keep track of the location of the decimal point, 2699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // put only significant digits into the DigitList, and adjust the 2700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // exponent as needed. 2701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2703b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool strictFail = FALSE; // did we exit with a strict parse failure? 2704b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t lastGroup = -1; // where did we last see a grouping separator? 2705b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t digitStart = position; 2706b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t gs2 = fGroupingSize2 == 0 ? fGroupingSize : fGroupingSize2; 2707b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2708b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeString *decimalString; 270959d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 2710b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalString = &getConstSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol); 2711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 2712b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalString = &getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 2713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2714103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 decimalChar = decimalString->char32At(0); 2715103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t decimalStringLength = decimalString->length(); 2716103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius int32_t decimalCharLength = U16_LENGTH(decimalChar); 2717103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 2718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool sawDecimal = FALSE; 2719b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 sawDecimalChar = 0xFFFF; 2720b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool sawGrouping = FALSE; 2721b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 sawGroupingChar = 0xFFFF; 2722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool sawDigit = FALSE; 2723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t backup = -1; 2724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digit; 2725b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2726b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // equivalent grouping and decimal support 2727b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *decimalSet = NULL; 2728b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *groupingSet = NULL; 2729b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2730b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (decimalCharLength == decimalStringLength) { 2731b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalSet = DecimalFormatStaticSets::getSimilarDecimals(decimalChar, strictParse); 2732b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2733b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2734b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (groupingCharLength == groupingStringLength) { 2735b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse) { 273659d709d503bab6e2b61931737e662dd293b40578ccornelius groupingSet = fStaticSets->fStrictDefaultGroupingSeparators; 2737b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 273859d709d503bab6e2b61931737e662dd293b40578ccornelius groupingSet = fStaticSets->fDefaultGroupingSeparators; 2739b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2741b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2742b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We need to test groupingChar and decimalChar separately from groupingSet and decimalSet, if the sets are even initialized. 2743b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If sawDecimal is TRUE, only consider sawDecimalChar and NOT decimalSet 2744b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If a character matches decimalSet, don't consider it to be a member of the groupingSet. 2745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We have to track digitCount ourselves, because digits.fCount will 2747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pin when the maximum allowable digits is reached. 2748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t digitCount = 0; 2749b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t integerDigitCount = 0; 2750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (; position < textLength; ) 2752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = text.char32At(position); 2754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* We recognize all digit ranges, not only the Latin digit range 2756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * '0'..'9'. We do so by using the Character.digit() method, 2757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which converts a valid Unicode digit to the range 0..9. 2758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 2759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The character 'ch' may be a digit. If so, place its value 2760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * from 0 to 9 in 'digit'. First try using the locale digit, 2761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which may or MAY NOT be a standard Unicode digit range. If 2762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * this fails, try using the standard Unicode digit ranges by 276350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * calling Character.digit(). If this also fails, digit will 2764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * have a value outside the range 0..9. 2765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 2766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit = ch - zero; 2767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (digit < 0 || digit > 9) 2768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit = u_charDigitValue(ch); 2770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 277127f654740f2a26ad62a5c155af9199af9e69b889claireho 277227f654740f2a26ad62a5c155af9199af9e69b889claireho // As a last resort, look through the localized digits if the zero digit 277327f654740f2a26ad62a5c155af9199af9e69b889claireho // is not a "standard" Unicode digit. 277427f654740f2a26ad62a5c155af9199af9e69b889claireho if ( (digit < 0 || digit > 9) && u_charDigitValue(zero) != 0) { 277527f654740f2a26ad62a5c155af9199af9e69b889claireho digit = 0; 277627f654740f2a26ad62a5c155af9199af9e69b889claireho if ( getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)(DecimalFormatSymbols::kZeroDigitSymbol)).char32At(0) == ch ) { 277727f654740f2a26ad62a5c155af9199af9e69b889claireho break; 277827f654740f2a26ad62a5c155af9199af9e69b889claireho } 277927f654740f2a26ad62a5c155af9199af9e69b889claireho for (digit = 1 ; digit < 10 ; digit++ ) { 278027f654740f2a26ad62a5c155af9199af9e69b889claireho if ( getConstSymbol((DecimalFormatSymbols::ENumberFormatSymbol)(DecimalFormatSymbols::kOneDigitSymbol+digit-1)).char32At(0) == ch ) { 278127f654740f2a26ad62a5c155af9199af9e69b889claireho break; 278227f654740f2a26ad62a5c155af9199af9e69b889claireho } 278327f654740f2a26ad62a5c155af9199af9e69b889claireho } 278427f654740f2a26ad62a5c155af9199af9e69b889claireho } 2785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 278650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (digit >= 0 && digit <= 9) 2787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2788b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse && backup != -1) { 2789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // comma followed by digit, so group before comma is a 2790b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // secondary group. If there was a group separator 2791b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // before that, the group must == the secondary group 2792b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // length, else it can be <= the the secondary group 2793b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // length. 2794b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((lastGroup != -1 && backup - lastGroup - 1 != gs2) || 2795b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (lastGroup == -1 && position - digitStart - 1 > gs2)) { 2796b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2797b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2799b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2800b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho lastGroup = backup; 2801b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2802b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Cancel out backup setting (see grouping handler below) 2804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backup = -1; 2805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sawDigit = TRUE; 2806b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2807b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Note: this will append leading zeros 280827f654740f2a26ad62a5c155af9199af9e69b889claireho parsedNum.append((char)(digit + '0'), err); 2809b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2810b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // count any digit that's not a leading zero 2811b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (digit > 0 || digitCount > 0 || sawDecimal) { 2812b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho digitCount += 1; 2813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2814b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // count any integer digit that's not a leading zero 2815b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (! sawDecimal) { 2816b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho integerDigitCount += 1; 2817b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2818b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2819b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += U16_LENGTH(ch); 2821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2822b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho else if (groupingStringLength > 0 && 2823b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho matchGrouping(groupingChar, sawGrouping, sawGroupingChar, groupingSet, 2824b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho decimalChar, decimalSet, 282554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ch) && groupingUsed) 2826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2827b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (sawDecimal) { 2828b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2829b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2830b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2831b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse) { 2832b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ((!sawDigit || backup != -1)) { 2833b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // leading group, or two group separators in a row 2834b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2835b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2836b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2837b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2838b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Ignore grouping characters, if we are using them, but require 2840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // that they be followed by a digit. Otherwise we backup and 2841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // reprocess them. 2842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru backup = position; 2843b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position += groupingStringLength; 2844b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sawGrouping=TRUE; 2845b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Once we see a grouping character, we only accept that grouping character from then on. 2846b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sawGroupingChar=ch; 2847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2848b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho else if (matchDecimal(decimalChar,sawDecimal,sawDecimalChar, decimalSet, ch)) 2849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2850b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse) { 2851b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (backup != -1 || 2852b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (lastGroup != -1 && position - lastGroup != fGroupingSize + 1)) { 2853b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2854b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2855b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2856b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2857b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we're only parsing integers, or if we ALREADY saw the 2859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // decimal, then don't parse this one. 2860b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (isParseIntegerOnly() || sawDecimal) { 2861b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 2862b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 286450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsedNum.append('.', err); 2865b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position += decimalStringLength; 2866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sawDecimal = TRUE; 2867b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Once we see a decimal character, we only accept that decimal character from then on. 2868b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho sawDecimalChar=ch; 2869b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // decimalSet is considered to consist of (ch,ch) 2870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 2872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 287354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!fBoolFlags.contains(UNUM_PARSE_NO_EXPONENT) || // don't parse if this is set unless.. 287459d709d503bab6e2b61931737e662dd293b40578ccornelius isScientificNotation()) { // .. it's an exponent format - ignore setting and parse anyways 287554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius const UnicodeString *tmp; 287654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tmp = &getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); 287754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // TODO: CASE 287854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!text.caseCompare(position, tmp->length(), *tmp, U_FOLD_CASE_DEFAULT)) // error code is set below if !sawDigit 2879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 288054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // Parse sign, if present 288154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t pos = position + tmp->length(); 288254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius char exponentSign = '+'; 288354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 288454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (pos < textLength) 2885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 288654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tmp = &getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 2887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!text.compare(pos, tmp->length(), *tmp)) 2888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos += tmp->length(); 2890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 289154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius else { 289254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius tmp = &getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 289354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!text.compare(pos, tmp->length(), *tmp)) 289454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius { 289554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius exponentSign = '-'; 289654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius pos += tmp->length(); 289754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 289854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UBool sawExponentDigit = FALSE; 290254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius while (pos < textLength) { 290354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ch = text[(int32_t)pos]; 290454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digit = ch - zero; 2905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (digit < 0 || digit > 9) { 290754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digit = u_charDigitValue(ch); 290854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 290954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (0 <= digit && digit <= 9) { 291054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (!sawExponentDigit) { 291154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parsedNum.append('E', err); 291254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parsedNum.append(exponentSign, err); 291354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius sawExponentDigit = TRUE; 291454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 291554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ++pos; 291654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius parsedNum.append((char)(digit + '0'), err); 291754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 291854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 291950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 2920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if (sawExponentDigit) { 292354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius position = pos; // Advance past the exponent 292454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 292654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; // Whether we fail or succeed, we exit this loop 292754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 292854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 292954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 293054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { // not parsing exponent 2931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 293254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 2933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2936f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // if we didn't see a decimal and it is required, check to see if the pattern had one 2937f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(!sawDecimal && isDecimalPatternMatchRequired()) 2938f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { 2939f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(fFormatPattern.indexOf(DecimalFormatSymbols::kDecimalSeparatorSymbol) != 0) 2940f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { 2941f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius parsePosition.setIndex(oldStart); 2942f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius parsePosition.setErrorIndex(position); 2943f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius debug("decimal point match required fail!"); 2944f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return FALSE; 2945f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 2946f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 2947f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 2948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (backup != -1) 2949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 2950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = backup; 2951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2953b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse && !sawDecimal) { 2954b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (lastGroup != -1 && position - lastGroup != fGroupingSize + 1) { 2955b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho strictFail = TRUE; 2956b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2957b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2958b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2959b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictFail) { 2960b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // only set with strictParse and a grouping separator error 2961b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2962b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsePosition.setIndex(oldStart); 2963b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsePosition.setErrorIndex(position); 2964103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("strictFail!"); 2965b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 2966b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 2967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If there was no decimal point we have an integer 2969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If none of the text string was recognized. For example, parse 2971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // "x" with pattern "#0.00" (return index and error index both 0) 2972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // parse "$" with pattern "$#0.00". (return index 0 and error index 2973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1). 2974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!sawDigit && digitCount == 0) { 2975103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 2976103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("none of text rec"); 2977103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf("position=%d\n",position); 2978103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 2979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setIndex(oldStart); 2980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(oldStart); 2981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 2982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before suffix 2986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadBeforeSuffix) { 2987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 2988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2990b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t posSuffixMatch = -1, negSuffixMatch = -1; 2991b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match positive and negative suffixes; prefer longest match. 2993b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (posMatch >= 0 || (!strictParse && negMatch < 0)) { 299459d709d503bab6e2b61931737e662dd293b40578ccornelius posSuffixMatch = compareAffix(text, position, FALSE, FALSE, posSuffix, complexCurrencyParsing, type, currency); 2995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (negMatch >= 0) { 299759d709d503bab6e2b61931737e662dd293b40578ccornelius negSuffixMatch = compareAffix(text, position, TRUE, FALSE, negSuffix, complexCurrencyParsing, type, currency); 2998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 2999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (posSuffixMatch >= 0 && negSuffixMatch >= 0) { 3000b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (posSuffixMatch > negSuffixMatch) { 3001b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho negSuffixMatch = -1; 3002b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (negSuffixMatch > posSuffixMatch) { 3003b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho posSuffixMatch = -1; 300450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Fail if neither or both 3008b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (strictParse && ((posSuffixMatch >= 0) == (negSuffixMatch >= 0))) { 3009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(position); 3010103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius debug("neither or both"); 3011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 3012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3014b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho position += (posSuffixMatch >= 0 ? posSuffixMatch : (negSuffixMatch >= 0 ? negSuffixMatch : 0)); 3015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Match padding before suffix 3017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0 && fPadPosition == kPadAfterSuffix) { 3018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position = skipPadding(text, position); 3019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setIndex(position); 3022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3023b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho parsedNum.data()[0] = (posSuffixMatch >= 0 || (!strictParse && negMatch < 0 && negSuffixMatch < 0)) ? '+' : '-'; 3024103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3025103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusprintf("PP -> %d, SLOW = [%s]! pp=%d, os=%d, err=%s\n", position, parsedNum.data(), parsePosition.getIndex(),oldStart,u_errorName(err)); 3026103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3027103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } /* end SLOW parse */ 3028103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius if(parsePosition.getIndex() == oldStart) 3029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3030103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3031103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf(" PP didnt move, err\n"); 3032103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3033103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius parsePosition.setErrorIndex(position); 3034103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius return FALSE; 3035103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } 3036103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 3037103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius else if (fParseAllInput==UNUM_YES&&parsePosition.getIndex()!=textLength) 3038103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius { 3039103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3040103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf(" PP didnt consume all (UNUM_YES), err\n"); 3041103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru parsePosition.setErrorIndex(position); 3043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 3044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3045103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 304654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // uint32_t bits = (fastParseOk?kFastpathOk:0) | 304754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // (fastParseHadDecimal?0:kNoDecimal); 304854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius //printf("FPOK=%d, FPHD=%d, bits=%08X\n", fastParseOk, fastParseHadDecimal, bits); 304954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius digits.set(parsedNum.toStringPiece(), 305054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius err, 305154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 0//bits 305254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius ); 305350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 305450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(err)) { 3055103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#ifdef FMT_DEBUG 3056103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius printf(" err setting %s\n", u_errorName(err)); 3057103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 305850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho parsePosition.setErrorIndex(position); 305950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 306050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3061f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 3062f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // check if we missed a required decimal point 3063f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(fastParseOk && isDecimalPatternMatchRequired()) 3064f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { 3065f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(fFormatPattern.indexOf(DecimalFormatSymbols::kDecimalSeparatorSymbol) != 0) 3066f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius { 3067f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius parsePosition.setIndex(oldStart); 3068f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius parsePosition.setErrorIndex(position); 3069f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius debug("decimal point match required fail!"); 3070f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return FALSE; 3071f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 3072f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 3073f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 3074f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 3075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 3076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Starting at position, advance past a run of pad characters, if any. 3080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the index of the first character after position that is not a pad 3081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character. Result is >= position. 3082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::skipPadding(const UnicodeString& text, int32_t position) const { 3084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t padLen = U16_LENGTH(fPad); 3085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (position < text.length() && 3086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru text.char32At(position) == fPad) { 3087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru position += padLen; 3088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return position; 3090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the length matched by the given affix, or -1 if none. 3094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Runs of white space in the affix, match runs of white space in 3095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the input. Pattern white space and input white space are 3096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * determined differently; see code. 3097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param text input text 3098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos offset into input at which to begin matching 3099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isNegative 3100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isPrefix 3101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param affixPat affix pattern used for currency affix comparison. 310259d709d503bab6e2b61931737e662dd293b40578ccornelius * @param complexCurrencyParsing whether it is currency parsing or not 3103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param type the currency type to parse against, LONG_NAME only or not. 3104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param currency return value for parsed currency, for generic 3105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, or null for normal parsing. In generic 3106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, any currency is parsed, not just the 3107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency that this formatter is set to. 3108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length of input that matches, or -1 if match failure 3109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::compareAffix(const UnicodeString& text, 3111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos, 3112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isNegative, 3113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isPrefix, 3114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* affixPat, 311559d709d503bab6e2b61931737e662dd293b40578ccornelius UBool complexCurrencyParsing, 3116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int8_t type, 3117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* currency) const 3118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString *patternToCompare; 3120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencyChoice != NULL || currency != NULL || 312159d709d503bab6e2b61931737e662dd293b40578ccornelius (fCurrencySignCount != fgCurrencySignCountZero && complexCurrencyParsing)) { 312250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (affixPat != NULL) { 3124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return compareComplexAffix(*affixPat, text, pos, type, currency); 3125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 312750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isNegative) { 3129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isPrefix) { 3130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fNegativePrefix; 3131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fNegativeSuffix; 3134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isPrefix) { 3138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fPositivePrefix; 3139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternToCompare = &fPositiveSuffix; 3142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return compareSimpleAffix(*patternToCompare, text, pos, isLenient()); 3145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314759d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool DecimalFormat::equalWithSignCompatibility(UChar32 lhs, UChar32 rhs) const { 314859d709d503bab6e2b61931737e662dd293b40578ccornelius if (lhs == rhs) { 314959d709d503bab6e2b61931737e662dd293b40578ccornelius return TRUE; 315059d709d503bab6e2b61931737e662dd293b40578ccornelius } 315159d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(fStaticSets != NULL); // should already be loaded 315259d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeSet *minusSigns = fStaticSets->fMinusSigns; 315359d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeSet *plusSigns = fStaticSets->fPlusSigns; 315459d709d503bab6e2b61931737e662dd293b40578ccornelius return (minusSigns->contains(lhs) && minusSigns->contains(rhs)) || 315559d709d503bab6e2b61931737e662dd293b40578ccornelius (plusSigns->contains(lhs) && plusSigns->contains(rhs)); 315659d709d503bab6e2b61931737e662dd293b40578ccornelius} 315759d709d503bab6e2b61931737e662dd293b40578ccornelius 315859d709d503bab6e2b61931737e662dd293b40578ccornelius// check for LRM 0x200E, RLM 0x200F, ALM 0x061C 315959d709d503bab6e2b61931737e662dd293b40578ccornelius#define IS_BIDI_MARK(c) (c==0x200E || c==0x200F || c==0x061C) 316059d709d503bab6e2b61931737e662dd293b40578ccornelius 316159d709d503bab6e2b61931737e662dd293b40578ccornelius#define TRIM_BUFLEN 32 316259d709d503bab6e2b61931737e662dd293b40578ccorneliusUnicodeString& DecimalFormat::trimMarksFromAffix(const UnicodeString& affix, UnicodeString& trimmedAffix) { 316359d709d503bab6e2b61931737e662dd293b40578ccornelius UChar trimBuf[TRIM_BUFLEN]; 316459d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t affixLen = affix.length(); 316559d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t affixPos, trimLen = 0; 316659d709d503bab6e2b61931737e662dd293b40578ccornelius 316759d709d503bab6e2b61931737e662dd293b40578ccornelius for (affixPos = 0; affixPos < affixLen; affixPos++) { 316859d709d503bab6e2b61931737e662dd293b40578ccornelius UChar c = affix.charAt(affixPos); 316959d709d503bab6e2b61931737e662dd293b40578ccornelius if (!IS_BIDI_MARK(c)) { 3170fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (trimLen < TRIM_BUFLEN) { 3171fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius trimBuf[trimLen++] = c; 3172fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 3173fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius trimLen = 0; 3174fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 3175fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 317659d709d503bab6e2b61931737e662dd293b40578ccornelius } 317759d709d503bab6e2b61931737e662dd293b40578ccornelius } 317859d709d503bab6e2b61931737e662dd293b40578ccornelius return (trimLen > 0)? trimmedAffix.setTo(trimBuf, trimLen): trimmedAffix.setTo(affix); 317959d709d503bab6e2b61931737e662dd293b40578ccornelius} 318059d709d503bab6e2b61931737e662dd293b40578ccornelius 3181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the length matched by the given affix, or -1 if none. 3183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Runs of white space in the affix, match runs of white space in 3184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the input. Pattern white space and input white space are 3185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * determined differently; see code. 3186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affix pattern string, taken as a literal 3187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param input input text 3188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos offset into input at which to begin matching 3189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length of input that matches, or -1 if match failure 3190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::compareSimpleAffix(const UnicodeString& affix, 3192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& input, 3193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t pos, 319459d709d503bab6e2b61931737e662dd293b40578ccornelius UBool lenient) const { 3195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t start = pos; 319659d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString trimmedAffix; 319759d709d503bab6e2b61931737e662dd293b40578ccornelius // For more efficiency we should keep lazily-created trimmed affixes around in 319859d709d503bab6e2b61931737e662dd293b40578ccornelius // instance variables instead of trimming each time they are used (the next step) 319959d709d503bab6e2b61931737e662dd293b40578ccornelius trimMarksFromAffix(affix, trimmedAffix); 320059d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 affixChar = trimmedAffix.char32At(0); 320159d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t affixLength = trimmedAffix.length(); 3202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t inputLength = input.length(); 3203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t affixCharLength = U16_LENGTH(affixChar); 3204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeSet *affixSet; 320559d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode status = U_ZERO_ERROR; 320659d709d503bab6e2b61931737e662dd293b40578ccornelius 320759d709d503bab6e2b61931737e662dd293b40578ccornelius U_ASSERT(fStaticSets != NULL); // should already be loaded 3208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 320959d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 321059d709d503bab6e2b61931737e662dd293b40578ccornelius return -1; 321159d709d503bab6e2b61931737e662dd293b40578ccornelius } 3212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (!lenient) { 321359d709d503bab6e2b61931737e662dd293b40578ccornelius affixSet = fStaticSets->fStrictDashEquivalents; 321459d709d503bab6e2b61931737e662dd293b40578ccornelius 321559d709d503bab6e2b61931737e662dd293b40578ccornelius // If the trimmedAffix is exactly one character long and that character 3216b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // is in the dash set and the very next input character is also 3217b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // in the dash set, return a match. 3218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (affixCharLength == affixLength && affixSet->contains(affixChar)) { 321959d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 322059d709d503bab6e2b61931737e662dd293b40578ccornelius if (affixSet->contains(ic)) { 322159d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(ic); 322259d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipBidiMarks(input, pos); // skip any trailing bidi marks 322359d709d503bab6e2b61931737e662dd293b40578ccornelius return pos - start; 3224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int32_t i = 0; i < affixLength; ) { 322859d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 c = trimmedAffix.char32At(i); 3229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t len = U16_LENGTH(c); 3230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(c)) { 3231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // We may have a pattern like: \u200F \u0020 3232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // and input text like: \u200F \u0020 3233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Note that U+200F and U+0020 are Pattern_White_Space but only 3234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // U+0020 is UWhiteSpace. So we have to first do a direct 3235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // match of the run of Pattern_White_Space in the pattern, 3236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // then match any extra characters. 3237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool literalMatch = FALSE; 323859d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < inputLength) { 323959d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 324059d709d503bab6e2b61931737e662dd293b40578ccornelius if (ic == c) { 324159d709d503bab6e2b61931737e662dd293b40578ccornelius literalMatch = TRUE; 324259d709d503bab6e2b61931737e662dd293b40578ccornelius i += len; 324359d709d503bab6e2b61931737e662dd293b40578ccornelius pos += len; 324459d709d503bab6e2b61931737e662dd293b40578ccornelius if (i == affixLength) { 324559d709d503bab6e2b61931737e662dd293b40578ccornelius break; 324659d709d503bab6e2b61931737e662dd293b40578ccornelius } 324759d709d503bab6e2b61931737e662dd293b40578ccornelius c = trimmedAffix.char32At(i); 324859d709d503bab6e2b61931737e662dd293b40578ccornelius len = U16_LENGTH(c); 324959d709d503bab6e2b61931737e662dd293b40578ccornelius if (!PatternProps::isWhiteSpace(c)) { 325059d709d503bab6e2b61931737e662dd293b40578ccornelius break; 325159d709d503bab6e2b61931737e662dd293b40578ccornelius } 325259d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (IS_BIDI_MARK(ic)) { 325359d709d503bab6e2b61931737e662dd293b40578ccornelius pos ++; // just skip over this input text 325459d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 3255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 3256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Advance over run in pattern 326059d709d503bab6e2b61931737e662dd293b40578ccornelius i = skipPatternWhiteSpace(trimmedAffix, i); 3261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Advance over run in input text 3263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Must see at least one white space char in input, 3264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // unless we've already matched some characters literally. 3265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t s = pos; 3266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pos = skipUWhiteSpace(input, pos); 3267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pos == s && !literalMatch) { 3268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 3269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // If we skip UWhiteSpace in the input text, we need to skip it in the pattern. 3272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Otherwise, the previous lines may have skipped over text (such as U+00A0) that 327359d709d503bab6e2b61931737e662dd293b40578ccornelius // is also in the trimmedAffix. 327459d709d503bab6e2b61931737e662dd293b40578ccornelius i = skipUWhiteSpace(trimmedAffix, i); 3275b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 327659d709d503bab6e2b61931737e662dd293b40578ccornelius UBool match = FALSE; 327759d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < inputLength) { 327859d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 327959d709d503bab6e2b61931737e662dd293b40578ccornelius if (!match && ic == c) { 328059d709d503bab6e2b61931737e662dd293b40578ccornelius i += len; 328159d709d503bab6e2b61931737e662dd293b40578ccornelius pos += len; 328259d709d503bab6e2b61931737e662dd293b40578ccornelius match = TRUE; 328359d709d503bab6e2b61931737e662dd293b40578ccornelius } else if (IS_BIDI_MARK(ic)) { 328459d709d503bab6e2b61931737e662dd293b40578ccornelius pos++; // just skip over this input text 328559d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 328659d709d503bab6e2b61931737e662dd293b40578ccornelius break; 328759d709d503bab6e2b61931737e662dd293b40578ccornelius } 328859d709d503bab6e2b61931737e662dd293b40578ccornelius } 328959d709d503bab6e2b61931737e662dd293b40578ccornelius if (!match) { 3290b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 3291b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3294b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3295b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool match = FALSE; 329659d709d503bab6e2b61931737e662dd293b40578ccornelius 329759d709d503bab6e2b61931737e662dd293b40578ccornelius affixSet = fStaticSets->fDashEquivalents; 3298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (affixCharLength == affixLength && affixSet->contains(affixChar)) { 330059d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipUWhiteSpaceAndMarks(input, pos); 330159d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 330259d709d503bab6e2b61931737e662dd293b40578ccornelius 330359d709d503bab6e2b61931737e662dd293b40578ccornelius if (affixSet->contains(ic)) { 330459d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(ic); 330559d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipBidiMarks(input, pos); 330659d709d503bab6e2b61931737e662dd293b40578ccornelius return pos - start; 3307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 3310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (int32_t i = 0; i < affixLength; ) 3311b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 331259d709d503bab6e2b61931737e662dd293b40578ccornelius //i = skipRuleWhiteSpace(trimmedAffix, i); 331359d709d503bab6e2b61931737e662dd293b40578ccornelius i = skipUWhiteSpace(trimmedAffix, i); 331459d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipUWhiteSpaceAndMarks(input, pos); 3315b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3316b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (i >= affixLength || pos >= inputLength) { 3317b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho break; 3318b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3319b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 332059d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 c = trimmedAffix.char32At(i); 332159d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 ic = input.char32At(pos); 3322b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 332359d709d503bab6e2b61931737e662dd293b40578ccornelius if (!equalWithSignCompatibility(ic, c)) { 3324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 3325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho match = TRUE; 332859d709d503bab6e2b61931737e662dd293b40578ccornelius i += U16_LENGTH(c); 332959d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(ic); 333059d709d503bab6e2b61931737e662dd293b40578ccornelius pos = skipBidiMarks(input, pos); 3331b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3332b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3333b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (affixLength > 0 && ! match) { 3334b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 3335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos - start; 3338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3341b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Skip over a run of zero or more Pattern_White_Space characters at 3342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pos in text. 3343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t DecimalFormat::skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) { 3345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UChar* s = text.getBuffer(); 3346b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return (int32_t)(PatternProps::skipWhiteSpace(s + pos, text.length() - pos) - s); 3347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Skip over a run of zero or more isUWhiteSpace() characters at pos 3351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in text. 3352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::skipUWhiteSpace(const UnicodeString& text, int32_t pos) { 3354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (pos < text.length()) { 3355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = text.char32At(pos); 3356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!u_isUWhiteSpace(c)) { 3357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos += U16_LENGTH(c); 3360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos; 3362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 336559d709d503bab6e2b61931737e662dd293b40578ccornelius * Skip over a run of zero or more isUWhiteSpace() characters or bidi marks at pos 336659d709d503bab6e2b61931737e662dd293b40578ccornelius * in text. 336759d709d503bab6e2b61931737e662dd293b40578ccornelius */ 336859d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t DecimalFormat::skipUWhiteSpaceAndMarks(const UnicodeString& text, int32_t pos) { 336959d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < text.length()) { 337059d709d503bab6e2b61931737e662dd293b40578ccornelius UChar32 c = text.char32At(pos); 337159d709d503bab6e2b61931737e662dd293b40578ccornelius if (!u_isUWhiteSpace(c) && !IS_BIDI_MARK(c)) { // u_isUWhiteSpace doesn't include LRM,RLM,ALM 337259d709d503bab6e2b61931737e662dd293b40578ccornelius break; 337359d709d503bab6e2b61931737e662dd293b40578ccornelius } 337459d709d503bab6e2b61931737e662dd293b40578ccornelius pos += U16_LENGTH(c); 337559d709d503bab6e2b61931737e662dd293b40578ccornelius } 337659d709d503bab6e2b61931737e662dd293b40578ccornelius return pos; 337759d709d503bab6e2b61931737e662dd293b40578ccornelius} 337859d709d503bab6e2b61931737e662dd293b40578ccornelius 337959d709d503bab6e2b61931737e662dd293b40578ccornelius/** 338059d709d503bab6e2b61931737e662dd293b40578ccornelius * Skip over a run of zero or more bidi marks at pos in text. 338159d709d503bab6e2b61931737e662dd293b40578ccornelius */ 338259d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t DecimalFormat::skipBidiMarks(const UnicodeString& text, int32_t pos) { 338359d709d503bab6e2b61931737e662dd293b40578ccornelius while (pos < text.length()) { 338459d709d503bab6e2b61931737e662dd293b40578ccornelius UChar c = text.charAt(pos); 338559d709d503bab6e2b61931737e662dd293b40578ccornelius if (!IS_BIDI_MARK(c)) { 338659d709d503bab6e2b61931737e662dd293b40578ccornelius break; 338759d709d503bab6e2b61931737e662dd293b40578ccornelius } 338859d709d503bab6e2b61931737e662dd293b40578ccornelius pos++; 338959d709d503bab6e2b61931737e662dd293b40578ccornelius } 339059d709d503bab6e2b61931737e662dd293b40578ccornelius return pos; 339159d709d503bab6e2b61931737e662dd293b40578ccornelius} 339259d709d503bab6e2b61931737e662dd293b40578ccornelius 339359d709d503bab6e2b61931737e662dd293b40578ccornelius/** 3394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the length matched by the given affix, or -1 if none. 3395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affixPat pattern string 3396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param input input text 3397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pos offset into input at which to begin matching 3398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param type the currency type to parse against, LONG_NAME only or not. 3399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param currency return value for parsed currency, for generic 3400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, or null for normal parsing. In generic 3401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency parsing mode, any currency is parsed, not just the 3402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency that this formatter is set to. 3403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return length of input that matches, or -1 if match failure 3404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::compareComplexAffix(const UnicodeString& affixPat, 3406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& text, 3407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos, 3408b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int8_t type, 3409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* currency) const 3410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t start = pos; 3412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(currency != NULL || 3413b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru (fCurrencyChoice != NULL && *getCurrency() != 0) || 341459d709d503bab6e2b61931737e662dd293b40578ccornelius fCurrencySignCount != fgCurrencySignCountZero); 3415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 341650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (int32_t i=0; 3417b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i<affixPat.length() && pos >= 0; ) { 3418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = affixPat.char32At(i); 3419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 3420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == kQuote) { 3422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(i <= affixPat.length()); 3423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = affixPat.char32At(i); 3424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 3425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affix = NULL; 3427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 3429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kCurrencySign: { 3430b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // since the currency names in choice format is saved 343150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the same way as other currency names, 3432b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // do not need to do currency choice parsing here. 3433b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // the general currency parsing parse against all names, 3434b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // including names in choice format. 3435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool intl = i<affixPat.length() && 3436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPat.char32At(i) == kCurrencySign; 3437b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (intl) { 3438b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++i; 3439b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3440b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool plural = i<affixPat.length() && 3441b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affixPat.char32At(i) == kCurrencySign; 3442b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (plural) { 3443b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++i; 3444b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru intl = FALSE; 3445b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Parse generic currency -- anything for which we 3447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // have a display name, or any 3-letter ISO code. 3448b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Try to parse display name for our locale; first 3449b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // determine our locale. 3450b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char* loc = fCurrencyPluralInfo->getLocale().getName(); 3451b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ParsePosition ppos(pos); 3452b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar curr[4]; 3453b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3454b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Delegate parse of display name => ISO code to Currency 3455b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uprv_parseCurrency(loc, text, ppos, type, curr, ec); 3456b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3457b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // If parse succeeds, populate currency[0] 3458b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_SUCCESS(ec) && ppos.getIndex() != pos) { 3459b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (currency) { 3460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strcpy(currency, curr); 3461b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3462b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // The formatter is currency-style but the client has not requested 3463b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // the value of the parsed currency. In this case, if that value does 3464b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // not match the formatter's current value, then the parse fails. 3465b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar effectiveCurr[4]; 3466b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho getEffectiveCurrency(effectiveCurr, ec); 3467b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_FAILURE(ec) || u_strncmp(curr,effectiveCurr,4) != 0 ) { 3468fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pos = -1; 3469fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius continue; 3470b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3472b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = ppos.getIndex(); 3473b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if (!isLenient()){ 3474b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pos = -1; 3475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPercent: 3479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 3480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPerMill: 3482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 3483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPlus: 3485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 3486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternMinus: 3488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix = &getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 3489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 3491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // fall through to affix!=0 test, which will fail 3492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 3493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affix != NULL) { 3496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = match(text, pos, *affix); 3497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 3498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = match(text, pos, c); 3502b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(c)) { 3503b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho i = skipPatternWhiteSpace(affixPat, i); 3504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos - start; 3507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Match a single character at text[pos] and return the index of the 3511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * next character upon success. Return -1 on failure. If 3512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * ch is a Pattern_White_Space then match a run of white space in text. 3513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::match(const UnicodeString& text, int32_t pos, UChar32 ch) { 3515b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(ch)) { 3516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Advance over run of white space in input text 3517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Must see at least one white space char in input 3518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t s = pos; 3519b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pos = skipPatternWhiteSpace(text, pos); 3520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos == s) { 3521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return -1; 3522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos; 3524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (pos >= 0 && text.char32At(pos) == ch) ? 3526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (pos + U16_LENGTH(ch)) : -1; 3527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Match a string at text[pos] and return the index of the next 3531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * character upon success. Return -1 on failure. Match a run of 3532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * white space in str with a run of white space in text. 3533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::match(const UnicodeString& text, int32_t pos, const UnicodeString& str) { 3535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t i=0; i<str.length() && pos >= 0; ) { 3536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = str.char32At(i); 3537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(ch); 3538b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (PatternProps::isWhiteSpace(ch)) { 3539b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho i = skipPatternWhiteSpace(str, i); 3540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pos = match(text, pos, ch); 3542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return pos; 3544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3546b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool DecimalFormat::matchSymbol(const UnicodeString &text, int32_t position, int32_t length, const UnicodeString &symbol, 3547b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UnicodeSet *sset, UChar32 schar) 3548b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 3549b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (sset != NULL) { 3550b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return sset->contains(schar); 3551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3552b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3553b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return text.compare(position, length, symbol) == 0; 3554b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 3555b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3556b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool DecimalFormat::matchDecimal(UChar32 symbolChar, 3557b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool sawDecimal, UChar32 sawDecimalChar, 3558b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *sset, UChar32 schar) { 3559b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(sawDecimal) { 3560b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return schar==sawDecimalChar; 3561b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(schar==symbolChar) { 3562b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return TRUE; 3563b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(sset!=NULL) { 3564b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return sset->contains(schar); 3565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 3567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 3569b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3570b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool DecimalFormat::matchGrouping(UChar32 groupingChar, 3571b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UBool sawGrouping, UChar32 sawGroupingChar, 3572b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const UnicodeSet *sset, 3573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius UChar32 /*decimalChar*/, const UnicodeSet *decimalSet, 3574b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UChar32 schar) { 3575b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if(sawGrouping) { 3576b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return schar==sawGroupingChar; // previously found 3577b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(schar==groupingChar) { 3578b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return TRUE; // char from symbols 3579b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else if(sset!=NULL) { 3580b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return sset->contains(schar) && // in groupingSet but... 3581b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ((decimalSet==NULL) || !decimalSet->contains(schar)); // Exclude decimalSet from groupingSet 3582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } else { 3583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return FALSE; 3584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 3585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 3586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 3589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the pointer to the localized decimal format symbols 3591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst DecimalFormatSymbols* 3593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getDecimalFormatSymbols() const 3594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fSymbols; 3596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// De-owning the current localized symbols and adopt the new symbols. 3600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::adoptDecimalFormatSymbols(DecimalFormatSymbols* symbolsToAdopt) 3603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (symbolsToAdopt == NULL) { 3605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; // do not allow caller to set fSymbols to NULL 3606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool sameSymbols = FALSE; 3609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fSymbols != NULL) { 3610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sameSymbols = (UBool)(getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == 3611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbolsToAdopt->getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) && 3612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == 3613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru symbolsToAdopt->getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); 3614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fSymbols; 3615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols = symbolsToAdopt; 3618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!sameSymbols) { 3619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the currency symbols are the same, there is no need to recalculate. 3620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setCurrencyForSymbols(); 3621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixes(NULL); 3623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Setting the symbols is equlivalent to adopting a newly created localized 3629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// symbols. 3630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setDecimalFormatSymbols(const DecimalFormatSymbols& symbols) 3633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru adoptDecimalFormatSymbols(new DecimalFormatSymbols(symbols)); 3635103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3637103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 364050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 364150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoconst CurrencyPluralInfo* 3642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::getCurrencyPluralInfo(void) const 3643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 3644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return fCurrencyPluralInfo; 3645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 364850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 3649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::adoptCurrencyPluralInfo(CurrencyPluralInfo* toAdopt) 3650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 3651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (toAdopt != NULL) { 365250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete fCurrencyPluralInfo; 3653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = toAdopt; 3654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // re-set currency affix patterns and currency affixes. 365559d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 3656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 3657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fAffixPatternsForCurrency) { 3658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru deleteHashForAffixPattern(); 3659b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3660b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixPatterns(status); 3661b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount == fgCurrencySignCountInPluralFormat) { 3662b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // only setup the affixes of the plural pattern. 3663b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(fFormatPattern, FALSE, TRUE, status); 3664b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 3665b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 366650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3669103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3670b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3671b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 367250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid 3673b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::setCurrencyPluralInfo(const CurrencyPluralInfo& info) 3674b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 3675b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru adoptCurrencyPluralInfo(info.clone()); 3676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 3680b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 3682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Update the currency object to match the symbols. This method 3684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is used only when the caller has passed in a symbols object 3685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that may not be the default object for its locale. 3686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setCurrencyForSymbols() { 3689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*Bug 4212072 3690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru Update the affix strings accroding to symbols in order to keep 3691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru the affix strings up to date. 3692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru [Richard/GCL] 3693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // With the introduction of the Currency object, the currency 3696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // symbols in the DFS object are ignored. For backward 3697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // compatibility, we check any explicitly set DFS object. If it 3698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // is a default symbols object for its locale, we change the 3699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // currency object to one for that locale. If it is custom, 3700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we set the currency to null. 3701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 3702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* c = NULL; 3703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* loc = fSymbols->getLocale().getName(); 370450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar intlCurrencySymbol[4]; 3705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucurr_forLocale(loc, intlCurrencySymbol, 4, &ec); 3706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString currencySymbol; 3707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_getStaticCurrencyName(intlCurrencySymbol, loc, currencySymbol, ec); 3709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(ec) 3710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && getConstSymbol(DecimalFormatSymbols::kCurrencySymbol) == currencySymbol 3711b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho && getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol) == UnicodeString(intlCurrencySymbol)) 3712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 3713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Trap an error in mapping locale to currency. If we can't 3714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // map, then don't fail and set the currency to "". 3715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = intlCurrencySymbol; 3716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ec = U_ZERO_ERROR; // reset local error code! 3718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(c, ec); 3719103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3720103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3721103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the positive prefix of the number pattern. 372750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getPositivePrefix(UnicodeString& result) const 3730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fPositivePrefix; 3732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 373450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the positive prefix of the number pattern. 373750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setPositivePrefix(const UnicodeString& newValue) 3740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositivePrefix = newValue; 3742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosPrefixPattern; 3743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPosPrefixPattern = 0; 3744103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3745103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3746103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the negative prefix of the number pattern. 3751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getNegativePrefix(UnicodeString& result) const 3754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fNegativePrefix; 3756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the negative prefix of the number pattern. 3761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setNegativePrefix(const UnicodeString& newValue) 3764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix = newValue; 3766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegPrefixPattern; 3767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern = 0; 3768103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3769103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3770103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the positive suffix of the number pattern. 3775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getPositiveSuffix(UnicodeString& result) const 3778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fPositiveSuffix; 3780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the positive suffix of the number pattern. 3785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setPositiveSuffix(const UnicodeString& newValue) 3788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPositiveSuffix = newValue; 3790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPosSuffixPattern; 3791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPosSuffixPattern = 0; 3792103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3793103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3794103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the negative suffix of the number pattern. 3799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 3801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getNegativeSuffix(UnicodeString& result) const 3802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = fNegativeSuffix; 3804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 3805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the negative suffix of the number pattern. 3809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setNegativeSuffix(const UnicodeString& newValue) 3812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix = newValue; 3814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fNegSuffixPattern; 3815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegSuffixPattern = 0; 3816103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3817103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3818103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the multiplier of the number pattern. 382350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Multipliers are stored as decimal numbers (DigitLists) because that 382450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// is the most convenient for muliplying or dividing the numbers to be formatted. 382550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// A NULL multiplier implies one, and the scaling operations are skipped. 3826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 382750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t 382850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::getMultiplier() const 3829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 383050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier == NULL) { 383150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 1; 383250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 383350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return fMultiplier->getLong(); 383450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 3838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the multiplier of the number pattern. 3839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 3840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setMultiplier(int32_t newValue) 3841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 3842c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// if (newValue == 0) { 3843c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// throw new IllegalArgumentException("Bad multiplier: " + newValue); 3844c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// } 384550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (newValue == 0) { 384650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho newValue = 1; // one being the benign default value for a multiplier. 384750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 384850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (newValue == 1) { 384950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete fMultiplier; 385050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier = NULL; 385150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 385250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier == NULL) { 385350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier = new DigitList; 385450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 385550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fMultiplier != NULL) { 385650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fMultiplier->set(newValue); 385750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3859103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3860103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3861103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the rounding increment. 3866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return A positive rounding increment, or 0.0 if rounding 3867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is not in effect. 3868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingIncrement 3869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingMode 3870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingMode 3871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querudouble DecimalFormat::getRoundingIncrement() const { 387350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fRoundingIncrement == NULL) { 387450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0.0; 387550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 387650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return fRoundingIncrement->getDouble(); 387750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the rounding increment. This method also controls whether 3882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * rounding is enabled. 3883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param newValue A positive rounding increment, or 0.0 to disable rounding. 3884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Negative increments are equivalent to 0.0. 3885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingIncrement 3886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingMode 3887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingMode 3888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setRoundingIncrement(double newValue) { 3890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (newValue > 0.0) { 3891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fRoundingIncrement == NULL) { 3892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingIncrement = new DigitList(); 3893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (fRoundingIncrement != NULL) { 389550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fRoundingIncrement->set(newValue); 3896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 3897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 389850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 3899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // These statements are executed if newValue is less than 0.0 3900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // or fRoundingIncrement could not be created. 3901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru delete fRoundingIncrement; 3902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fRoundingIncrement = NULL; 3903103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3904103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3905103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the rounding mode. 3910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return A rounding mode 3911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingIncrement 3912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingIncrement 3913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingMode 3914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::ERoundingMode DecimalFormat::getRoundingMode() const { 3916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fRoundingMode; 3917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the rounding mode. This has no effect unless the rounding 3921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * increment is greater than zero. 3922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param roundingMode A rounding mode 3923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setRoundingIncrement 3924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingIncrement 3925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getRoundingMode 3926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setRoundingMode(ERoundingMode roundingMode) { 3928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fRoundingMode = roundingMode; 3929103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3930103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3931103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the width to which the output of <code>format()</code> is padded. 3936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the format width, or zero if no padding is in effect 3937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setFormatWidth 3938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadPosition 3941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadPosition 3942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::getFormatWidth() const { 3944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fFormatWidth; 3945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the width to which the output of <code>format()</code> is padded. 3949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This method also controls whether padding is enabled. 3950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param width the width to which to pad the result of 3951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>format()</code>, or zero to disable padding. A negative 3952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * width is equivalent to 0. 3953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getFormatWidth 3954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadPosition 3957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadPosition 3958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setFormatWidth(int32_t width) { 3960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fFormatWidth = (width > 0) ? width : 0; 3961103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3962103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3963103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString DecimalFormat::getPadCharacterString() const { 3967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return UnicodeString(fPad); 3968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setPadCharacter(const UnicodeString &padChar) { 3971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (padChar.length() > 0) { 3972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = padChar.char32At(0); 3973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 3975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPad = kDefaultPad; 3976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 3977103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 3978103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 3979103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 3980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 3981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 3983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the position at which padding will take place. This is the location 3984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * at which padding will be inserted if the result of <code>format()</code> 3985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is shorter than the format width. 3986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the pad position, one of <code>kPadBeforePrefix</code>, 3987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterPrefix</code>, <code>kPadBeforeSuffix</code>, or 3988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterSuffix</code>. 3989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setFormatWidth 3990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getFormatWidth 3991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 3992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 3993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadPosition 3994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforePrefix 3995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterPrefix 3996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforeSuffix 3997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterSuffix 3998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 3999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::EPadPosition DecimalFormat::getPadPosition() const { 4000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fPadPosition; 4001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <strong><font face=helvetica color=red>NEW</font></strong> 4005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the position at which padding will take place. This is the location 4006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * at which padding will be inserted if the result of <code>format()</code> 4007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * is shorter than the format width. This has no effect unless padding is 4008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * enabled. 4009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param padPos the pad position, one of <code>kPadBeforePrefix</code>, 4010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterPrefix</code>, <code>kPadBeforeSuffix</code>, or 4011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <code>kPadAfterSuffix</code>. 4012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setFormatWidth 4013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getFormatWidth 4014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setPadCharacter 4015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadCharacter 4016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getPadPosition 4017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforePrefix 4018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterPrefix 4019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadBeforeSuffix 4020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #kPadAfterSuffix 4021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setPadPosition(EPadPosition padPos) { 4023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPadPosition = padPos; 4024103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4025103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4026103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return whether or not scientific notation is used. 4031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return TRUE if this object formats and parses scientific notation 4032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 403859d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool DecimalFormat::isScientificNotation() const { 4039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fUseExponentialNotation; 4040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set whether or not scientific notation is used. 4044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param useScientific TRUE if this object formats and parses scientific 4045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * notation 4046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setScientificNotation(UBool useScientific) { 4053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseExponentialNotation = useScientific; 4054103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4055103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4056103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the minimum exponent digits that will be shown. 4061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the minimum exponent digits that will be shown 4062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint8_t DecimalFormat::getMinimumExponentDigits() const { 4069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fMinExponentDigits; 4070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the minimum exponent digits that will be shown. This has no 4074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * effect unless scientific notation is in use. 4075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param minExpDig a value >= 1 indicating the fewest exponent digits 4076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that will be shown. Values less than 1 will be treated as 1. 4077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumExponentDigits(int8_t minExpDig) { 4084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinExponentDigits = (int8_t)((minExpDig > 0) ? minExpDig : 1); 4085103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4086103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4087103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return whether the exponent sign is always shown. 4092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return TRUE if the exponent is always prefixed with either the 4093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * localized minus sign or the localized plus sign, false if only negative 4094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * exponents are prefixed with the localized minus sign. 4095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setExponentSignAlwaysShown 4100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 410159d709d503bab6e2b61931737e662dd293b40578ccorneliusUBool DecimalFormat::isExponentSignAlwaysShown() const { 4102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fExponentSignAlwaysShown; 4103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set whether the exponent sign is always shown. This has no effect 4107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * unless scientific notation is in use. 4108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expSignAlways TRUE if the exponent is always prefixed with either 4109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the localized minus sign or the localized plus sign, false if only 4110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * negative exponents are prefixed with the localized minus sign. 4111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setScientificNotation 4112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isScientificNotation 4113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #setMinimumExponentDigits 4114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #getMinimumExponentDigits 4115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see #isExponentSignAlwaysShown 4116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setExponentSignAlwaysShown(UBool expSignAlways) { 4118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fExponentSignAlwaysShown = expSignAlways; 4119103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4120103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4121103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the grouping size of the number pattern. For example, thousand or 10 4126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// thousand groupings. 412750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 4129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getGroupingSize() const 4130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4131f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return isGroupingUsed() ? fGroupingSize : 0; 4132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 413350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the grouping size of the number pattern. 413650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setGroupingSize(int32_t newValue) 4139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize = newValue; 4141103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4142103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4143103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 4149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::getSecondaryGroupingSize() const 4150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fGroupingSize2; 4152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setSecondaryGroupingSize(int32_t newValue) 4158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fGroupingSize2 = newValue; 4160103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4161103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4162103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Checks if to show the decimal separator. 4167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool 4169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::isDecimalSeparatorAlwaysShown() const 4170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fDecimalSeparatorAlwaysShown; 4172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets to always show the decimal separator. 4176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::setDecimalSeparatorAlwaysShown(UBool newValue) 4179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fDecimalSeparatorAlwaysShown = newValue; 4181103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 4182103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 4183103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 4184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4187f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// Checks if decimal point pattern match is required 4188f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusUBool 4189f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusDecimalFormat::isDecimalPatternMatchRequired(void) const 4190f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius{ 4191f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return fBoolFlags.contains(UNUM_PARSE_DECIMAL_MARK_REQUIRED); 4192f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 4193f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4194f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius//------------------------------------------------------------------------------ 4195f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius// Checks if decimal point pattern match is required 4196f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4197f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid 4198f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusDecimalFormat::setDecimalPatternMatchRequired(UBool newValue) 4199f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius{ 4200f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fBoolFlags.set(UNUM_PARSE_DECIMAL_MARK_REQUIRED, newValue); 4201f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 4202f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4203f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 4204f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius//------------------------------------------------------------------------------ 4205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Emits the pattern of this DecimalFormat instance. 4206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 4208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::toPattern(UnicodeString& result) const 4209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return toPattern(result, FALSE); 4211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Emits the localized pattern this DecimalFormat instance. 4215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 4217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::toLocalizedPattern(UnicodeString& result) const 4218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return toPattern(result, TRUE); 4220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Expand the affix pattern strings into the expanded affix strings. If any 4225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * affix pattern string is null, do not expand it. This method should be 4226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * called any time the symbols or the affix patterns change in order to keep 4227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the expanded affix strings up to date. 4228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * This method also will be called before formatting if format currency 422950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * plural names, since the plural name is not a static one, it is 4230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * based on the currency plural count, the affix will be known only 423150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * after the currency plural count is know. 4232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * In which case, the parameter 4233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * 'pluralCount' will be a non-null currency plural count. 4234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * In all other cases, the 'pluralCount' is null, which means it is not needed. 4235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4236b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid DecimalFormat::expandAffixes(const UnicodeString* pluralCount) { 423750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler none; 4238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPosPrefixPattern != 0) { 423950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fPosPrefixPattern, fPositivePrefix, 0, none, FALSE, pluralCount); 4240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPosSuffixPattern != 0) { 424250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fPosSuffixPattern, fPositiveSuffix, 0, none, FALSE, pluralCount); 4243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegPrefixPattern != 0) { 424550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fNegPrefixPattern, fNegativePrefix, 0, none, FALSE, pluralCount); 4246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegSuffixPattern != 0) { 424850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*fNegSuffixPattern, fNegativeSuffix, 0, none, FALSE, pluralCount); 4249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef FMT_DEBUG 4251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 4252103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius s.append(UnicodeString("[")) 4253103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append(DEREFSTR(fPosPrefixPattern)).append((UnicodeString)"|").append(DEREFSTR(fPosSuffixPattern)) 4254103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)";") .append(DEREFSTR(fNegPrefixPattern)).append((UnicodeString)"|").append(DEREFSTR(fNegSuffixPattern)) 4255103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)"]->[") 4256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append(fPositivePrefix).append((UnicodeString)"|").append(fPositiveSuffix) 4257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)";") .append(fNegativePrefix).append((UnicodeString)"|").append(fNegativeSuffix) 4258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius .append((UnicodeString)"]\n"); 4259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru debugout(s); 4260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 4261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Expand an affix pattern into an affix string. All characters in the 4265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pattern are literal unless prefixed by kQuote. The following characters 4266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * after kQuote are recognized: PATTERN_PERCENT, PATTERN_PER_MILLE, 4267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * PATTERN_MINUS, and kCurrencySign. If kCurrencySign is doubled (kQuote + 4268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * kCurrencySign + kCurrencySign), it is interpreted as an international 426950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * currency sign. If CURRENCY_SIGN is tripled, it is interpreted as 4270b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * currency plural long names, such as "US Dollars". 4271b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * Any other character after a kQuote represents itself. 4272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * kQuote must be followed by another character; kQuote may not occur by 4273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * itself at the end of the pattern. 4274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This method is used in two distinct ways. First, it is used to expand 4276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the stored affix patterns into actual affixes. For this usage, doFormat 4277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * must be false. Second, it is used to expand the stored affix patterns 4278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * given a specific number (doFormat == true), for those rare cases in 4279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which a currency format references a ChoiceFormat (e.g., en_IN display 4280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * name for INR). The number itself is taken from digitList. 4281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When used in the first way, this method has a side effect: It sets 4283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currencyChoice to a ChoiceFormat object, if the currency's display name 4284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in this locale is a ChoiceFormat pattern (very rare). It only does this 4285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if currencyChoice is null to start with. 4286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param pattern the non-null, fPossibly empty pattern 4288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affix string to receive the expanded equivalent of pattern. 4289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Previous contents are deleted. 4290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param doFormat if false, then the pattern will be expanded, and if a 4291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currency symbol is encountered that expands to a ChoiceFormat, the 4292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * currencyChoice member variable will be initialized if it is null. If 4293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * doFormat is true, then it is assumed that the currencyChoice has been 4294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * created, and it will be used to format the value in digitList. 4295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * @param pluralCount the plural count. It is only used for currency 4296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * plural format. In which case, it is the plural 4297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * count of the currency amount. For example, 4298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * in en_US, it is the singular "one", or the plural 4299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * "other". For all other cases, it is null, and 4300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * is not being used. 4301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::expandAffix(const UnicodeString& pattern, 4303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString& affix, 4304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double number, 430550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 4306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool doFormat, 4307b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* pluralCount) const { 4308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.remove(); 4309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int i=0; i<pattern.length(); ) { 4310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = pattern.char32At(i); 4311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 4312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == kQuote) { 4313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = pattern.char32At(i); 4314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i += U16_LENGTH(c); 431550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int beginIdx = affix.length(); 4316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 4317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kCurrencySign: { 4318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // As of ICU 2.2 we use the currency object, and 4319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ignore the currency symbols in the DFS, unless 4320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // we have a null currency object. This occurs if 4321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // resurrecting a pre-2.2 object or if the user 4322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // sets a custom DFS. 4323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool intl = i<pattern.length() && 4324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern.char32At(i) == kCurrencySign; 4325b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool plural = FALSE; 4326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (intl) { 4327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 4328b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru plural = i<pattern.length() && 4329b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru pattern.char32At(i) == kCurrencySign; 4330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (plural) { 4331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru intl = FALSE; 4332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ++i; 4333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* currencyUChars = getCurrency(); 4336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (currencyUChars[0] != 0) { 4337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 4338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (plural && pluralCount != NULL) { 4339b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // plural name is only needed when pluralCount != null, 4340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // which means when formatting currency plural names. 4341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // For other cases, pluralCount == null, 4342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // and plural names are not needed. 4343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t len; 4344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho CharString pluralCountChar; 4345b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pluralCountChar.appendInvariantChars(*pluralCount, ec); 4346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool isChoiceFormat; 4347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UChar* s = ucurr_getPluralName(currencyUChars, 4348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fSymbols != NULL ? fSymbols->getLocale().getName() : 4349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Locale::getDefault().getName(), &isChoiceFormat, 4350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho pluralCountChar.data(), &len, &ec); 4351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix += UnicodeString(s, len); 435250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4353b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else if(intl) { 4354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho affix.append(currencyUChars, -1); 435550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len; 4358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isChoiceFormat; 4359c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru // If fSymbols is NULL, use default locale 436050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar* s = ucurr_getName(currencyUChars, 436150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fSymbols != NULL ? fSymbols->getLocale().getName() : Locale::getDefault().getName(), 436250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UCURR_SYMBOL_NAME, &isChoiceFormat, &len, &ec); 4363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isChoiceFormat) { 4364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Two modes here: If doFormat is false, we set up 4365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // currencyChoice. If doFormat is true, we use the 4366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // previously created currencyChoice to format the 4367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // value in digitList. 4368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!doFormat) { 4369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the currency is handled by a ChoiceFormat, 4370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // then we're not going to use the expanded 4371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // patterns. Instantiate the ChoiceFormat and 4372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // return. 4373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fCurrencyChoice == NULL) { 4374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TODO Replace double-check with proper thread-safe code 4375b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ChoiceFormat* fmt = new ChoiceFormat(UnicodeString(s), ec); 4376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(ec)) { 4377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_lock(NULL); 4378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fCurrencyChoice == NULL) { 4379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Cast away const 4380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ((DecimalFormat*)this)->fCurrencyChoice = fmt; 4381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fmt = NULL; 4382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_unlock(NULL); 4384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fmt; 4385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We could almost return null or "" here, since the 4388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // expanded affixes are almost not used at all 4389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // in this situation. However, one method -- 4390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // toPattern() -- still does use the expanded 4391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // affixes, in order to set up a padding 4392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pattern. We use the CURRENCY_SIGN as a 4393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // placeholder. 4394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.append(kCurrencySign); 4395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fCurrencyChoice != NULL) { 4397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru FieldPosition pos(0); // ignored 4398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (number < 0) { 4399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru number = -number; 4400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fCurrencyChoice->format(number, affix, pos); 4402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We only arrive here if the currency choice 4404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // format in the locale data is INVALID. 4405b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho affix.append(currencyUChars, -1); 440650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += UnicodeString(s, len); 441250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(intl) { 4416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 4417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kCurrencySymbol); 4419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 442050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, beginIdx, affix.length()); 4421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPercent: 4425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 442650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPercentField, beginIdx, affix.length()); 4427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPerMill: 4429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 443050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPermillField, beginIdx, affix.length()); 4431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPlus: 4433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 443450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kSignField, beginIdx, affix.length()); 4435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternMinus: 4437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix += getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 443850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kSignField, beginIdx, affix.length()); 4439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 4441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.append(c); 4442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affix.append(c); 4447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Append an affix to the given StringBuffer. 4453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param buf buffer to append to 4454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isNegative 4455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param isPrefix 4456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::appendAffix(UnicodeString& buf, double number, 445850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FieldPositionHandler& handler, 4459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isNegative, UBool isPrefix) const { 4460b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // plural format precedes choice format 446150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fCurrencyChoice != 0 && 4462b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencySignCount != fgCurrencySignCountInPluralFormat) { 4463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affixPat; 4464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isPrefix) { 4465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPat = isNegative ? fNegPrefixPattern : fPosPrefixPattern; 4466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPat = isNegative ? fNegSuffixPattern : fPosSuffixPattern; 4468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affixPat) { 4470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString affixBuf; 447150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho expandAffix(*affixPat, affixBuf, number, handler, TRUE, NULL); 4472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.append(affixBuf); 4473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return affixBuf.length(); 4474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // else someone called a function that reset the pattern. 4476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 447750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affix; 4479b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fCurrencySignCount == fgCurrencySignCountInPluralFormat) { 448059d709d503bab6e2b61931737e662dd293b40578ccornelius // TODO: get an accurate count of visible fraction digits. 448159d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString pluralCount; 448259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t minFractionDigits = this->getMinimumFractionDigits(); 448359d709d503bab6e2b61931737e662dd293b40578ccornelius if (minFractionDigits > 0) { 448459d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal ni(number, this->getMinimumFractionDigits()); 448559d709d503bab6e2b61931737e662dd293b40578ccornelius pluralCount = fCurrencyPluralInfo->getPluralRules()->select(ni); 448659d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 448759d709d503bab6e2b61931737e662dd293b40578ccornelius pluralCount = fCurrencyPluralInfo->getPluralRules()->select(number); 448859d709d503bab6e2b61931737e662dd293b40578ccornelius } 4489b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* oneSet; 4490b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 4491b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru oneSet = (AffixesForCurrency*)fPluralAffixesForCurrency->get(pluralCount); 4492b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 4493b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru oneSet = (AffixesForCurrency*)fAffixesForCurrency->get(pluralCount); 4494b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4495b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (isPrefix) { 449650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix = isNegative ? &oneSet->negPrefixForCurrency : 4497b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &oneSet->posPrefixForCurrency; 4498b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 449950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho affix = isNegative ? &oneSet->negSuffixForCurrency : 4500b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru &oneSet->posSuffixForCurrency; 4501b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4503b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (isPrefix) { 4504b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix = isNegative ? &fNegativePrefix : &fPositivePrefix; 4505b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } else { 4506b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru affix = isNegative ? &fNegativeSuffix : &fPositiveSuffix; 4507b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 450950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 451050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t begin = (int) buf.length(); 451150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf.append(*affix); 451350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 451450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (handler.isRecording()) { 451550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kCurrencySymbol)); 451650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 451750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kCurrencySymbol); 451850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, begin + offset, begin + offset + aff.length()); 451950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 452050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 452150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol)); 452250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 452350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 452450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kCurrencyField, begin + offset, begin + offset + aff.length()); 452550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 452650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 452750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)); 452850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 452950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 453050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kSignField, begin + offset, begin + offset + aff.length()); 453150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 453250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 453350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kPercentSymbol)); 453450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 453550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 453650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPercentField, begin + offset, begin + offset + aff.length()); 453750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 453850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 453950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho offset = (int) (*affix).indexOf(getConstSymbol(DecimalFormatSymbols::kPerMillSymbol)); 454050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (offset > -1) { 454150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString aff = getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 454250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho handler.addAttribute(kPermillField, begin + offset, begin + offset + aff.length()); 454350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 454450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 4545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return affix->length(); 4546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Appends an affix pattern to the given StringBuffer, quoting special 4550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * characters as needed. Uses the internal affix pattern, if that exists, 4551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or the literal affix, if the internal affix pattern is null. The 4552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * appended string will generate the same affix pattern (or literal affix) 4553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * when passed to toPattern(). 4554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param appendTo the affix string is appended to this 4556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param affixPattern a pattern such as fPosPrefixPattern; may be null 4557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param expAffix a corresponding expanded affix, such as fPositivePrefix. 4558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Ignored unless affixPattern is null. If affixPattern is null, then 4559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * expAffix is appended as a literal affix. 4560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param localized true if the appended pattern should contain localized 4561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pattern characters; otherwise, non-localized pattern chars are appended 4562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::appendAffixPattern(UnicodeString& appendTo, 4564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString* affixPattern, 4565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& expAffix, 4566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool localized) const { 4567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affixPattern == 0) { 4568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(appendTo, expAffix, localized); 4569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 4571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int pos=0; pos<affixPattern->length(); pos=i) { 4572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i = affixPattern->indexOf(kQuote, pos); 4573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i < 0) { 4574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 4575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPattern->extractBetween(pos, affixPattern->length(), s); 4576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(appendTo, s, localized); 4577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i > pos) { 4580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString s; 4581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPattern->extractBetween(pos, i, s); 4582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(appendTo, s, localized); 4583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = affixPattern->char32At(++i); 4585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 4586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == kQuote) { 4587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c).append(c); 4588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Fall through and append another kQuote below 4589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (c == kCurrencySign && 4590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i<affixPattern->length() && 4591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru affixPattern->char32At(i) == kCurrencySign) { 4592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++i; 4593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c).append(c); 4594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (localized) { 4595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (c) { 4596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPercent: 4597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPercentSymbol); 4598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPerMill: 4600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPerMillSymbol); 4601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternPlus: 4603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 4604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case kPatternMinus: 4606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol); 4607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 4608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 4609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c); 4610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo.append(c); 4613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 4619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Append an affix to the given StringBuffer, using quotes if 4620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * there are special characters. Single quotes themselves must be 4621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * escaped in either case. 4622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 4623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::appendAffixPattern(UnicodeString& appendTo, 4625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString& affix, 4626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool localized) const { 4627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool needQuote; 4628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(localized) { 4629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru needQuote = affix.indexOf(getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol)) >= 0 4630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)) >= 0 4631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol)) >= 0 4632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPercentSymbol)) >= 0 4633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPerMillSymbol)) >= 0 4634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kDigitSymbol)) >= 0 4635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol)) >= 0 4636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol)) >= 0 4637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)) >= 0 4638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kCurrencySign) >= 0; 4639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru needQuote = affix.indexOf(kPatternZeroDigit) >= 0 4642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternGroupingSeparator) >= 0 4643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternDecimalSeparator) >= 0 4644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternPercent) >= 0 4645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternPerMill) >= 0 4646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternDigit) >= 0 4647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternSeparator) >= 0 4648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternExponent) >= 0 4649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternPlus) >= 0 4650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kPatternMinus) >= 0 4651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || affix.indexOf(kCurrencySign) >= 0; 4652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (needQuote) 4654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += (UChar)0x0027 /*'\''*/; 4655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (affix.indexOf((UChar)0x0027 /*'\''*/) < 0) 4656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += affix; 4657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t j = 0; j < affix.length(); ) { 4659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 c = affix.char32At(j); 4660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru j += U16_LENGTH(c); 4661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 4662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == 0x0027 /*'\''*/) 4663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += c; 4664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (needQuote) 4667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendTo += (UChar)0x0027 /*'\''*/; 4668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& 4673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::toPattern(UnicodeString& result, UBool localized) const 4674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4675b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fStyle == UNUM_CURRENCY_PLURAL) { 4676b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // the prefix or suffix pattern might not be defined yet, 4677b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // so they can not be synthesized, 4678b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // instead, get them directly. 4679b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // but it might not be the actual pattern used in formatting. 468050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the actual pattern used in formatting depends on the 4681b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // formatted number's plural count. 4682b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru result = fFormatPattern; 4683b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return result; 4684b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 4685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.remove(); 4686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 zero, sigDigit = kPatternSignificantDigit; 4687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString digit, group; 4688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 4689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t roundingDecimalPos = 0; // Pos of decimal in roundingDigits 4690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString roundingDigits; 4691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t padPos = (fFormatWidth > 0) ? fPadPosition : -1; 4692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString padSpec; 4693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool useSigDig = areSignificantDigitsUsed(); 4694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit.append(getConstSymbol(DecimalFormatSymbols::kDigitSymbol)); 4697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru group.append(getConstSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); 4698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zero = getConstSymbol(DecimalFormatSymbols::kZeroDigitSymbol).char32At(0); 4699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 4700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sigDigit = getConstSymbol(DecimalFormatSymbols::kSignificantDigitSymbol).char32At(0); 4701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru digit.append((UChar)kPatternDigit); 4705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru group.append((UChar)kPatternGroupingSeparator); 4706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru zero = (UChar32)kPatternZeroDigit; 4707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0) { 4709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padSpec.append(getConstSymbol(DecimalFormatSymbols::kPadEscapeSymbol)); 4711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padSpec.append((UChar)kPatternPadEscape); 4714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru padSpec.append(fPad); 4716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fRoundingIncrement != NULL) { 471850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i=0; i<fRoundingIncrement->getCount(); ++i) { 471927f654740f2a26ad62a5c155af9199af9e69b889claireho roundingDigits.append(zero+(fRoundingIncrement->getDigitValue(i))); // Convert to Unicode digit 4720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 472150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho roundingDecimalPos = fRoundingIncrement->getDecimalAt(); 4722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (int32_t part=0; part<2; ++part) { 4724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (padPos == kPadBeforePrefix) { 4725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(result, 4728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (part==0 ? fPosPrefixPattern : fNegPrefixPattern), 4729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (part==0 ? fPositivePrefix : fNegativePrefix), 4730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru localized); 4731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (padPos == kPadAfterPrefix && ! padSpec.isEmpty()) { 4732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sub0Start = result.length(); 4735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t g = isGroupingUsed() ? _max(0, fGroupingSize) : 0; 4736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (g > 0 && fGroupingSize2 > 0 && fGroupingSize2 != fGroupingSize) { 4737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru g += fGroupingSize2; 4738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t maxDig = 0, minDig = 0, maxSigDig = 0; 4740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 4741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minDig = getMinimumSignificantDigits(); 4742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = maxSigDig = getMaximumSignificantDigits(); 4743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru minDig = getMinimumIntegerDigits(); 4745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = getMaximumIntegerDigits(); 4746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation) { 4748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxDig > kMaxScientificIntegerDigits) { 4749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = 1; 4750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (useSigDig) { 4752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = _max(maxDig, g+1); 4753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru maxDig = _max(_max(g, getMinimumIntegerDigits()), 4755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru roundingDecimalPos) + 1; 4756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = maxDig; i > 0; --i) { 4758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!fUseExponentialNotation && i<maxDig && 4759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru isGroupingPosition(i)) { 4760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(group); 4761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (useSigDig) { 4763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // #@,@### (maxSigDig == 5, minSigDig == 2) 4764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 65 4321 (1-based pos, count from the right) 4765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use # if pos > maxSigDig or 1 <= pos <= (maxSigDig - minSigDig) 4766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Use @ if (maxSigDig - minSigDig) < pos <= maxSigDig 4767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (maxSigDig >= i && i > (maxSigDig - minDig)) { 4768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(sigDigit); 4769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(digit); 4771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! roundingDigits.isEmpty()) { 4774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos = roundingDecimalPos - i; 4775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos >= 0 && pos < roundingDigits.length()) { 4776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar) (roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); 4777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i<=minDig) { 4781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(digit); 4784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!useSigDig) { 4788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (getMaximumFractionDigits() > 0 || fDecimalSeparatorAlwaysShown) { 4789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kDecimalSeparatorSymbol); 4791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternDecimalSeparator); 4794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pos = roundingDecimalPos; 4797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 0; i < getMaximumFractionDigits(); ++i) { 4798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! roundingDigits.isEmpty() && pos < roundingDigits.length()) { 4799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pos < 0) { 4800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)(roundingDigits.char32At(pos) - kPatternZeroDigit + zero)); 4804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++pos; 4806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 4807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i<getMinimumFractionDigits()) { 4809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(digit); 4813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fUseExponentialNotation) { 4817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kExponentialSymbol); 4819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternExponent); 4822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fExponentSignAlwaysShown) { 4824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kPlusSignSymbol); 4826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternPlus); 4829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<fMinExponentDigits; ++i) { 4832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(zero); 4833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (! padSpec.isEmpty() && !fUseExponentialNotation) { 4836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t add = fFormatWidth - result.length() + sub0Start 4837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru - ((part == 0) 4838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ? fPositivePrefix.length() + fPositiveSuffix.length() 4839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : fNegativePrefix.length() + fNegativeSuffix.length()); 4840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while (add > 0) { 4841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.insert(sub0Start, digit); 4842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++maxDig; 4843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru --add; 4844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Only add a grouping separator if we have at least 4845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 2 additional characters to be added, so we don't 4846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // end up with ",###". 4847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (add>1 && isGroupingPosition(maxDig)) { 4848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.insert(sub0Start, group); 484950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho --add; 4850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPadPosition == kPadBeforeSuffix && ! padSpec.isEmpty()) { 4854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (part == 0) { 4857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(result, fPosSuffixPattern, fPositiveSuffix, localized); 4858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPadPosition == kPadAfterSuffix && ! padSpec.isEmpty()) { 4859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isDefault = FALSE; 4862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if ((fNegSuffixPattern == fPosSuffixPattern && // both null 4863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativeSuffix == fPositiveSuffix) 4864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru || (fNegSuffixPattern != 0 && fPosSuffixPattern != 0 && 4865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *fNegSuffixPattern == *fPosSuffixPattern)) 4866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fNegPrefixPattern != NULL && fPosPrefixPattern != NULL) 4868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = fPosPrefixPattern->length(); 4870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru isDefault = fNegPrefixPattern->length() == (length+2) && 4871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (*fNegPrefixPattern)[(int32_t)0] == kQuote && 4872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (*fNegPrefixPattern)[(int32_t)1] == kPatternMinus && 4873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern->compare(2, length, *fPosPrefixPattern, 0, length) == 0; 4874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!isDefault && 4876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegPrefixPattern == NULL && fPosPrefixPattern == NULL) 4877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t length = fPositivePrefix.length(); 4879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru isDefault = fNegativePrefix.length() == (length+1) && 4880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix.compare(getConstSymbol(DecimalFormatSymbols::kMinusSignSymbol)) == 0 && 4881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fNegativePrefix.compare(1, length, fPositivePrefix, 0, length) == 0; 4882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isDefault) { 4885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; // Don't output default negative subpattern 4886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result += getConstSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol); 4889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 4891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append((UChar)kPatternSeparator); 4892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendAffixPattern(result, fNegSuffixPattern, fNegativeSuffix, localized); 4896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPadPosition == kPadAfterSuffix && ! padSpec.isEmpty()) { 4897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result.append(padSpec); 4898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 4903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyPattern(const UnicodeString& pattern, UErrorCode& status) 4909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, FALSE, parseError, status); 4912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyPattern(const UnicodeString& pattern, 491850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UParseError& parseError, 4919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 4920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, FALSE, parseError, status); 4922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyLocalizedPattern(const UnicodeString& pattern, UErrorCode& status) 4927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError parseError; 4929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, TRUE,parseError,status); 4930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruDecimalFormat::applyLocalizedPattern(const UnicodeString& pattern, 4936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError& parseError, 4937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status) 4938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru applyPattern(pattern, TRUE,parseError,status); 4940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 4941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 4943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 4944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid 4945b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::applyPatternWithoutExpandAffix(const UnicodeString& pattern, 4946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool localized, 4947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError& parseError, 4948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) 4949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 4950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status)) 4951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 4952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 4953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4954fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius DecimalFormatPatternParser patternParser; 4955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (localized) { 4956fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius patternParser.useSymbols(*fSymbols); 4957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 4958fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatPattern = pattern; 4959fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius DecimalFormatPattern out; 4960fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius patternParser.applyPatternWithoutExpandAffix( 4961fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius pattern, 4962fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius out, 4963fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius parseError, 4964fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius status); 4965fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (U_FAILURE(status)) { 4966fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 4967fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4968fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 4969fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMinimumIntegerDigits(out.fMinimumIntegerDigits); 4970fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMaximumIntegerDigits(out.fMaximumIntegerDigits); 4971fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMinimumFractionDigits(out.fMinimumFractionDigits); 4972fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMaximumFractionDigits(out.fMaximumFractionDigits); 4973fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setSignificantDigitsUsed(out.fUseSignificantDigits); 4974fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fUseSignificantDigits) { 4975fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMinimumSignificantDigits(out.fMinimumSignificantDigits); 4976fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMaximumSignificantDigits(out.fMaximumSignificantDigits); 4977fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4978fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fUseExponentialNotation = out.fUseExponentialNotation; 4979fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fUseExponentialNotation) { 4980fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fMinExponentDigits = out.fMinExponentDigits; 4981fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4982fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fExponentSignAlwaysShown = out.fExponentSignAlwaysShown; 4983fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fCurrencySignCount = out.fCurrencySignCount; 4984fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setGroupingUsed(out.fGroupingUsed); 4985fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fGroupingUsed) { 4986fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fGroupingSize = out.fGroupingSize; 4987fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fGroupingSize2 = out.fGroupingSize2; 4988fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 4989fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius setMultiplier(out.fMultiplier); 4990fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fDecimalSeparatorAlwaysShown = out.fDecimalSeparatorAlwaysShown; 4991fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fFormatWidth = out.fFormatWidth; 4992fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (out.fRoundingIncrementUsed) { 4993fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fRoundingIncrement != NULL) { 4994fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *fRoundingIncrement = out.fRoundingIncrement; 4995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 4996fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fRoundingIncrement = new DigitList(out.fRoundingIncrement); 4997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 4998fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius if (fRoundingIncrement == NULL) { 4999fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius status = U_MEMORY_ALLOCATION_ERROR; 5000fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius return; 5001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5003fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } else { 5004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setRoundingIncrement(0.0); 5005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5006fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPad = out.fPad; 5007fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius switch (out.fPadPosition) { 5008fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadBeforePrefix: 5009fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadBeforePrefix; 5010fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 5011fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadAfterPrefix: 5012fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadAfterPrefix; 5013fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 5014fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadBeforeSuffix: 5015fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadBeforeSuffix; 5016fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 5017fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius case DecimalFormatPattern::kPadAfterSuffix: 5018fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius fPadPosition = kPadAfterSuffix; 5019fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius break; 5020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5021fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fNegPrefixPattern, out.fNegPatternsBogus, fNegPrefixPattern, status); 5022fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fNegSuffixPattern, out.fNegPatternsBogus, fNegSuffixPattern, status); 5023fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fPosPrefixPattern, out.fPosPatternsBogus, fPosPrefixPattern, status); 5024fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius copyString(out.fPosSuffixPattern, out.fPosPatternsBogus, fPosSuffixPattern, status); 5025b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5026b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 5029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::expandAffixAdjustWidth(const UnicodeString* pluralCount) { 5030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixes(pluralCount); 5031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fFormatWidth > 0) { 5032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Finish computing format width (see above) 503350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // TODO: how to handle fFormatWidth, 5034b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // need to save in f(Plural)AffixesForCurrecy? 5035b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fFormatWidth += fPositivePrefix.length() + fPositiveSuffix.length(); 5036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5039b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5040b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 5041b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::applyPattern(const UnicodeString& pattern, 5042b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool localized, 5043b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError& parseError, 5044b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) 504550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho{ 5046b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // do the following re-set first. since they change private data by 5047b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // apply pattern again. 5048b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (pattern.indexOf(kCurrencySign) != -1) { 504950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fCurrencyPluralInfo == NULL) { 505050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // initialize currencyPluralInfo if needed 5051b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fCurrencyPluralInfo = new CurrencyPluralInfo(fSymbols->getLocale(), status); 5052b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5053b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (fAffixPatternsForCurrency == NULL) { 5054b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixPatterns(status); 5055b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5056b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pattern.indexOf(fgTripleCurrencySign, 3, 0) != -1) { 5057b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // only setup the affixes of the current pattern. 5058b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(pattern, TRUE, FALSE, status); 5059b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5060b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5061b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(pattern, localized, parseError, status); 5062b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixAdjustWidth(NULL); 5063103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5064103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5065103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5066b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5067b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5068b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5069b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 507050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::applyPatternInternally(const UnicodeString& pluralCount, 5071b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString& pattern, 5072b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UBool localized, 5073b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError& parseError, 5074b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 5075b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPatternWithoutExpandAffix(pattern, localized, parseError, status); 5076b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixAdjustWidth(&pluralCount); 5077103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5078103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5079103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5080b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5081b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5082b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the maximum number of digits allowed in the integer portion of a 508559d709d503bab6e2b61931737e662dd293b40578ccornelius * number. 5086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMaximumIntegerDigits 5087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMaximumIntegerDigits(int32_t newValue) { 508959d709d503bab6e2b61931737e662dd293b40578ccornelius NumberFormat::setMaximumIntegerDigits(_min(newValue, gDefaultMaxIntegerDigits)); 5090103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5091103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5092103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the minimum number of digits allowed in the integer portion of a 5097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number. This override limits the integer digit count to 309. 5098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMinimumIntegerDigits 5099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumIntegerDigits(int32_t newValue) { 5101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setMinimumIntegerDigits(_min(newValue, kDoubleIntegerDigits)); 5102103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5103103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5104103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the maximum number of digits allowed in the fraction portion of a 5109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number. This override limits the fraction digit count to 340. 5110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMaximumFractionDigits 5111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMaximumFractionDigits(int32_t newValue) { 5113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setMaximumFractionDigits(_min(newValue, kDoubleFractionDigits)); 5114103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5115103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5116103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sets the minimum number of digits allowed in the fraction portion of a 5121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number. This override limits the fraction digit count to 340. 5122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @see NumberFormat#setMinimumFractionDigits 5123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumFractionDigits(int32_t newValue) { 5125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setMinimumFractionDigits(_min(newValue, kDoubleFractionDigits)); 5126103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5127103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5128103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::getMinimumSignificantDigits() const { 5132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fMinSignificantDigits; 5133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t DecimalFormat::getMaximumSignificantDigits() const { 5136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fMaxSignificantDigits; 5137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMinimumSignificantDigits(int32_t min) { 5140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (min < 1) { 514150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho min = 1; 5142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pin max sig dig to >= min 5144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t max = _max(fMaxSignificantDigits, min); 5145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinSignificantDigits = min; 5146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMaxSignificantDigits = max; 514759d709d503bab6e2b61931737e662dd293b40578ccornelius fUseSignificantDigits = TRUE; 5148103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5149103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setMaximumSignificantDigits(int32_t max) { 5154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (max < 1) { 5155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru max = 1; 5156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // pin min sig dig to 1..max 5158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_ASSERT(fMinSignificantDigits >= 1); 5159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t min = _min(fMinSignificantDigits, max); 5160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMinSignificantDigits = min; 5161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMaxSignificantDigits = max; 516259d709d503bab6e2b61931737e662dd293b40578ccornelius fUseSignificantDigits = TRUE; 5163103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5164103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5165103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool DecimalFormat::areSignificantDigitsUsed() const { 5169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return fUseSignificantDigits; 5170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setSignificantDigitsUsed(UBool useSignificantDigits) { 5173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fUseSignificantDigits = useSignificantDigits; 5174103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5175103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5176103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 517950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid DecimalFormat::setCurrencyInternally(const UChar* theCurrency, 5180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& ec) { 5181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we are a currency format, then modify our affixes to 5182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // encode the currency symbol for the given currency in our 5183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // locale, and adjust the decimal digits and rounding for the 5184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // given currency. 5185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Note: The code is ordered so that this object is *not changed* 5187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // until we are sure we are going to succeed. 518850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NULL or empty currency is *legal* and indicates no currency. 5190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool isCurr = (theCurrency && *theCurrency); 5191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru double rounding = 0.0; 5193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t frac = 0; 519459d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero && isCurr) { 5195f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius rounding = ucurr_getRoundingIncrementForUsage(theCurrency, fCurrencyUsage, &ec); 5196f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius frac = ucurr_getDefaultFractionDigitsForUsage(theCurrency, fCurrencyUsage, &ec); 5197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 519850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NumberFormat::setCurrency(theCurrency, ec); 5200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(ec)) return; 5201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 520259d709d503bab6e2b61931737e662dd293b40578ccornelius if (fCurrencySignCount != fgCurrencySignCountZero) { 5203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NULL or empty currency is *legal* and indicates no currency. 5204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isCurr) { 5205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setRoundingIncrement(rounding); 5206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setMinimumFractionDigits(frac); 5207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setMaximumFractionDigits(frac); 5208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expandAffixes(NULL); 5210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5211103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5212103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5213103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid DecimalFormat::setCurrency(const UChar* theCurrency, UErrorCode& ec) { 5217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // set the currency before compute affixes to get the right currency names 5218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru NumberFormat::setCurrency(theCurrency, ec); 5219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fFormatPattern.indexOf(fgTripleCurrencySign, 3, 0) != -1) { 5220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UnicodeString savedPtn = fFormatPattern; 5221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setupCurrencyAffixes(fFormatPattern, TRUE, TRUE, ec); 5222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UParseError parseErr; 5223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru applyPattern(savedPtn, FALSE, parseErr, ec); 5224b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5225b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // set the currency after apply pattern to get the correct rounding/fraction 5226b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru setCurrencyInternally(theCurrency, ec); 5227103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5228103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5229103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5232f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusvoid DecimalFormat::setCurrencyUsage(UCurrencyUsage newContext, UErrorCode* ec){ 5233f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius fCurrencyUsage = newContext; 5234f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 5235f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius const UChar* theCurrency = getCurrency(); 5236f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 5237f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // We set rounding/digit based on currency context 5238f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if(theCurrency){ 5239f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius double rounding = ucurr_getRoundingIncrementForUsage(theCurrency, fCurrencyUsage, ec); 5240f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t frac = ucurr_getDefaultFractionDigitsForUsage(theCurrency, fCurrencyUsage, ec); 5241f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 5242f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (U_SUCCESS(*ec)) { 5243f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius setRoundingIncrement(rounding); 5244f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius setMinimumFractionDigits(frac); 5245f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius setMaximumFractionDigits(frac); 5246f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 5247f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 5248f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 5249f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 5250f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusUCurrencyUsage DecimalFormat::getCurrencyUsage() const { 5251f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return fCurrencyUsage; 5252f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius} 5253f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 5254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Deprecated variant with no UErrorCode parameter 5255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid DecimalFormat::setCurrency(const UChar* theCurrency) { 5256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode ec = U_ZERO_ERROR; 5257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setCurrency(theCurrency, ec); 5258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5263c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid DecimalFormat::getEffectiveCurrency(UChar* result, UErrorCode& ec) const { 5264c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (fSymbols == NULL) { 5265c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ec = U_MEMORY_ALLOCATION_ERROR; 5266c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 5267c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 5268c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru ec = U_ZERO_ERROR; 5269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* c = getCurrency(); 5270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*c == 0) { 5271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UnicodeString &intl = 5272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fSymbols->getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol); 5273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = intl.getBuffer(); // ok for intl to go out of scope 5274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_strncpy(result, c, 3); 5276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result[3] = 0; 5277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 5280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Return the number of fraction digits to display, or the total 5281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * number of digits for significant digit formats and exponential 5282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * formats. 5283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 5284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t 528550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::precision() const { 5286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (areSignificantDigitsUsed()) { 5287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getMaximumSignificantDigits(); 5288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (fUseExponentialNotation) { 5289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return getMinimumIntegerDigits() + getMaximumFractionDigits(); 5290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 529150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return getMaximumFractionDigits(); 5292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 5293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 5294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5295b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5296b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// TODO: template algorithm 5297b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruHashtable* 5298b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::initHashForAffix(UErrorCode& status) { 5299b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5300b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5301b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5302b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* hTable; 5303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (hTable = new Hashtable(TRUE, status)) == NULL ) { 5304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 5305b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5306b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_FAILURE(status) ) { 5308b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete hTable; 5309b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 5310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 531150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho hTable->setValueComparator(decimfmtAffixValueComparator); 5312b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return hTable; 5313b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5314b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5315b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruHashtable* 5316b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::initHashForAffixPattern(UErrorCode& status) { 5317b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5318b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5319b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5320b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* hTable; 5321b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( (hTable = new Hashtable(TRUE, status)) == NULL ) { 5322b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 5323b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return NULL; 5324b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5325b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if ( U_FAILURE(status) ) { 5326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho delete hTable; 5327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 5328b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 532950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho hTable->setValueComparator(decimfmtAffixPatternValueComparator); 5330b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return hTable; 5331b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5332b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5333b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 533450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::deleteHashForAffix(Hashtable*& table) 5335b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 5336b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( table == NULL ) { 5337b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5338b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 53391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t pos = UHASH_FIRST; 5340b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5341b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = table->nextElement(pos)) != NULL ) { 5342b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5343b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixesForCurrency* value = (AffixesForCurrency*)valueTok.pointer; 5344b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete value; 5345b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5346b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete table; 5347b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru table = NULL; 5348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5349b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5350b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5351b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5352b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 535350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDecimalFormat::deleteHashForAffixPattern() 5354b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru{ 5355b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( fAffixPatternsForCurrency == NULL ) { 5356b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5357b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 53581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t pos = UHASH_FIRST; 5359b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5360b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = fAffixPatternsForCurrency->nextElement(pos)) != NULL ) { 5361b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5362b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixPatternsForCurrency* value = (AffixPatternsForCurrency*)valueTok.pointer; 5363b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete value; 5364b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5365b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru delete fAffixPatternsForCurrency; 5366b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru fAffixPatternsForCurrency = NULL; 5367b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5368b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5369b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5370b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 5371b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::copyHashForAffixPattern(const Hashtable* source, 5372b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* target, 5373b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 5374b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5375b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5376b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 53771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t pos = UHASH_FIRST; 5378b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5379b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( source ) { 5380b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = source->nextElement(pos)) != NULL ) { 5381b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok keyTok = element->key; 5382b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* key = (UnicodeString*)keyTok.pointer; 5383b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5384b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixPatternsForCurrency* value = (AffixPatternsForCurrency*)valueTok.pointer; 5385b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixPatternsForCurrency* copy = new AffixPatternsForCurrency( 5386b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negPrefixPatternForCurrency, 5387b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negSuffixPatternForCurrency, 5388b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posPrefixPatternForCurrency, 5389b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posSuffixPatternForCurrency, 5390b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->patternType); 5391b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru target->put(UnicodeString(*key), copy, status); 5392b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5393b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5394b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5395b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5396b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5397b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5398b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5399fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// this is only overridden to call handleChanged() for fastpath purposes. 5400fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid 5401fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDecimalFormat::setGroupingUsed(UBool newValue) { 5402fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::setGroupingUsed(newValue); 5403fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius handleChanged(); 5404fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 5405fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 5406fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// this is only overridden to call handleChanged() for fastpath purposes. 5407fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid 5408fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDecimalFormat::setParseIntegerOnly(UBool newValue) { 5409fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::setParseIntegerOnly(newValue); 5410fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius handleChanged(); 5411fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 5412fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 5413fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// this is only overridden to call handleChanged() for fastpath purposes. 5414fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// setContext doesn't affect the fastPath right now, but this is called for completeness 5415fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid 5416fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusDecimalFormat::setContext(UDisplayContext value, UErrorCode& status) { 5417fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius NumberFormat::setContext(value, status); 5418fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius handleChanged(); 5419fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius} 5420fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 5421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius 542254dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusDecimalFormat& DecimalFormat::setAttribute( UNumberFormatAttribute attr, 542354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius int32_t newValue, 542454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status) { 542554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) return *this; 542654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 542754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius switch(attr) { 542854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_LENIENT_PARSE: 542954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setLenient(newValue!=0); 543054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 543154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 543254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_INT_ONLY: 543354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setParseIntegerOnly(newValue!=0); 543454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 543554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 543654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_USED: 543754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setGroupingUsed(newValue!=0); 543854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 543954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 544054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_DECIMAL_ALWAYS_SHOWN: 544154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setDecimalSeparatorAlwaysShown(newValue!=0); 544254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 544354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 544454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_INTEGER_DIGITS: 544554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumIntegerDigits(newValue); 544654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 544754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 544854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_INTEGER_DIGITS: 544954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumIntegerDigits(newValue); 545054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 545154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 545254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_INTEGER_DIGITS: 545354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumIntegerDigits(newValue); 545454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumIntegerDigits(newValue); 545554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 545654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 545754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_FRACTION_DIGITS: 545854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumFractionDigits(newValue); 545954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 546054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 546154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_FRACTION_DIGITS: 546254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumFractionDigits(newValue); 546354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 546454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 546554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FRACTION_DIGITS: 546654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumFractionDigits(newValue); 546754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumFractionDigits(newValue); 546854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 546954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 547054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SIGNIFICANT_DIGITS_USED: 547154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setSignificantDigitsUsed(newValue!=0); 547254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 547354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 547454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_SIGNIFICANT_DIGITS: 547554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMaximumSignificantDigits(newValue); 547654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 547754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 547854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_SIGNIFICANT_DIGITS: 547954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMinimumSignificantDigits(newValue); 548054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 548154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 548254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MULTIPLIER: 548354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setMultiplier(newValue); 548454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 548554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 548654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_SIZE: 548754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setGroupingSize(newValue); 548854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 548954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 549054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_ROUNDING_MODE: 549154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setRoundingMode((DecimalFormat::ERoundingMode)newValue); 549254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 549354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 549454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_WIDTH: 549554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setFormatWidth(newValue); 549654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 549754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 549854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PADDING_POSITION: 549954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /** The position at which padding will take place. */ 550054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setPadPosition((DecimalFormat::EPadPosition)newValue); 550154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 550254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 550354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SECONDARY_GROUPING_SIZE: 550454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setSecondaryGroupingSize(newValue); 550554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 550654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 550754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 550854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_ALL_INPUT: 550954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius setParseAllInput((UNumberFormatAttributeValue)newValue); 551054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 551154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#endif 551254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 551354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* These are stored in fBoolFlags */ 551454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_NO_EXPONENT: 551554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS: 5516f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius case UNUM_PARSE_DECIMAL_MARK_REQUIRED: 551754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(!fBoolFlags.isValidValue(newValue)) { 551854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_ILLEGAL_ARGUMENT_ERROR; 551954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } else { 552054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius fBoolFlags.set(attr, newValue); 552154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 552254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 552354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 55248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius case UNUM_SCALE: 55258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius fScale = newValue; 55268393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius break; 55278393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 5528f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius case UNUM_CURRENCY_USAGE: 5529f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius setCurrencyUsage((UCurrencyUsage)newValue, &status); 5530f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 553154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius default: 553254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_UNSUPPORTED_ERROR; 553354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 553454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 553554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return *this; 553654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 553754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 553854dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusint32_t DecimalFormat::getAttribute( UNumberFormatAttribute attr, 553954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius UErrorCode &status ) const { 554054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius if(U_FAILURE(status)) return -1; 554154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius switch(attr) { 554254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_LENIENT_PARSE: 554354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isLenient(); 554454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 554554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_INT_ONLY: 554654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isParseIntegerOnly(); 554754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 554854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_USED: 554954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isGroupingUsed(); 555054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 555154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_DECIMAL_ALWAYS_SHOWN: 555254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return isDecimalSeparatorAlwaysShown(); 555354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 555454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_INTEGER_DIGITS: 555554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMaximumIntegerDigits(); 555654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 555754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_INTEGER_DIGITS: 555854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumIntegerDigits(); 555954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 556054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_INTEGER_DIGITS: 556154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // TBD: what should this return? 556254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumIntegerDigits(); 556354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 556454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_FRACTION_DIGITS: 556554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMaximumFractionDigits(); 556654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 556754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_FRACTION_DIGITS: 556854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumFractionDigits(); 556954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 557054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FRACTION_DIGITS: 557154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius // TBD: what should this return? 557254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumFractionDigits(); 557354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 557454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SIGNIFICANT_DIGITS_USED: 557554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return areSignificantDigitsUsed(); 557654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 557754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MAX_SIGNIFICANT_DIGITS: 557854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMaximumSignificantDigits(); 557954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 558054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MIN_SIGNIFICANT_DIGITS: 558154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMinimumSignificantDigits(); 558254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 558354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_MULTIPLIER: 558454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getMultiplier(); 558554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 558654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_GROUPING_SIZE: 558754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getGroupingSize(); 558854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 558954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_ROUNDING_MODE: 559054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getRoundingMode(); 559154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 559254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_WIDTH: 559354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getFormatWidth(); 559454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 559554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PADDING_POSITION: 559654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getPadPosition(); 559754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 559854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_SECONDARY_GROUPING_SIZE: 559954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return getSecondaryGroupingSize(); 560054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 560154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius /* These are stored in fBoolFlags */ 560254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_PARSE_NO_EXPONENT: 560354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius case UNUM_FORMAT_FAIL_IF_MORE_THAN_MAX_DIGITS: 5604f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius case UNUM_PARSE_DECIMAL_MARK_REQUIRED: 560554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return fBoolFlags.get(attr); 560654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 56078393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius case UNUM_SCALE: 56088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius return fScale; 56098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 5610f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius case UNUM_CURRENCY_USAGE: 5611f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius return fCurrencyUsage; 5612f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 561354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius default: 561454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius status = U_UNSUPPORTED_ERROR; 561554dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius break; 561654dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius } 561754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 561854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius return -1; /* undefined */ 561954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius} 562054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius 5621103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_HAVE_PARSEALLINPUT 5622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusvoid DecimalFormat::setParseAllInput(UNumberFormatAttributeValue value) { 5623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius fParseAllInput = value; 5624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if UCONFIG_FORMAT_FASTPATHS_49 5625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius handleChanged(); 5626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius} 5628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#endif 5629b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5630b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruvoid 5631b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruDecimalFormat::copyHashForAffix(const Hashtable* source, 5632b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru Hashtable* target, 5633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode& status) { 5634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5636b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 56371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t pos = UHASH_FIRST; 5638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashElement* element = NULL; 5639b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( source ) { 5640b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru while ( (element = source->nextElement(pos)) != NULL ) { 5641b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok keyTok = element->key; 5642b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UnicodeString* key = (UnicodeString*)keyTok.pointer; 5643b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5644b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const UHashTok valueTok = element->value; 5645b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const AffixesForCurrency* value = (AffixesForCurrency*)valueTok.pointer; 5646b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru AffixesForCurrency* copy = new AffixesForCurrency( 5647b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negPrefixForCurrency, 5648b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->negSuffixForCurrency, 5649b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posPrefixForCurrency, 5650b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru value->posSuffixForCurrency); 5651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru target->put(UnicodeString(*key), copy, status); 5652b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if ( U_FAILURE(status) ) { 5653b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return; 5654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5655b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5656b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 5657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 5658b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 5659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END 5660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */ 5662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof 5664