diff --git a/icu4c/source/i18n/dcfmtsym.cpp b/icu4c/source/i18n/dcfmtsym.cpp index 260f8b17c9e..809e8a19074 100644 --- a/icu4c/source/i18n/dcfmtsym.cpp +++ b/icu4c/source/i18n/dcfmtsym.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* -* Copyright (C) 1997-2011, International Business Machines Corporation and * -* others. All Rights Reserved. * +* Copyright (C) 1997-2013, International Business Machines Corporation and +* others. All Rights Reserved. ******************************************************************************* * * File DCFMTSYM.CPP @@ -29,6 +29,7 @@ #include "unicode/unistr.h" #include "unicode/numsys.h" #include "unicode/unum.h" +#include "unicode/utf16.h" #include "ucurrimp.h" #include "cstring.h" #include "locbased.h" @@ -74,6 +75,24 @@ DecimalFormatSymbols::DecimalFormatSymbols(const Locale& loc, UErrorCode& status initialize(locale, status); } +DecimalFormatSymbols::DecimalFormatSymbols() + : UObject(), + locale(Locale::getRoot()), + currPattern(NULL) { + *validLocale = *actualLocale = 0; + initialize(); +} + +DecimalFormatSymbols* +DecimalFormatSymbols::createWithLastResortData(UErrorCode& status) { + if (U_FAILURE(status)) { return NULL; } + DecimalFormatSymbols* sym = new DecimalFormatSymbols(); + if (sym == NULL) { + status = U_MEMORY_ALLOCATION_ERROR; + } + return sym; +} + // ------------------------------------- DecimalFormatSymbols::~DecimalFormatSymbols() @@ -184,8 +203,9 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us return; const char* locStr = loc.getName(); - UResourceBundle *resource = ures_open((char *)0, locStr, &status); - UResourceBundle *numberElementsRes = ures_getByKeyWithFallback(resource, gNumberElements, NULL, &status); + LocalUResourceBundlePointer resource(ures_open(NULL, locStr, &status)); + LocalUResourceBundlePointer numberElementsRes( + ures_getByKeyWithFallback(resource.getAlias(), gNumberElements, NULL, &status)); if (U_FAILURE(status)) { if ( useLastResortData ) { @@ -193,185 +213,177 @@ DecimalFormatSymbols::initialize(const Locale& loc, UErrorCode& status, UBool us initialize(); } return; + } + + // First initialize all the symbols to the fallbacks for anything we can't find + initialize(); + + // + // Next get the numbering system for this locale and set zero digit + // and the digit string based on the numbering system for the locale + // + + LocalPointer<NumberingSystem> ns(NumberingSystem::createInstance(loc, status)); + if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { + nsName = ns->getName(); + UnicodeString digitString(ns->getDescription()); + int32_t digitIndex = 0; + UChar32 digit = digitString.char32At(0); + fSymbols[kZeroDigitSymbol].setTo(digit); + for (int32_t i = kOneDigitSymbol; i <= kNineDigitSymbol; ++i) { + digitIndex += U16_LENGTH(digit); + digit = digitString.char32At(digitIndex); + fSymbols[i].setTo(digit); + } } else { + nsName = gLatn; + } - // First initialize all the symbols to the fallbacks for anything we can't find - initialize(); + UBool isLatn = !uprv_strcmp(nsName,gLatn); - // - // Next get the numbering system for this locale and set zero digit - // and the digit string based on the numbering system for the locale - // + UErrorCode nlStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer nonLatnSymbols; + if ( !isLatn ) { + nonLatnSymbols.adoptInstead( + ures_getByKeyWithFallback(numberElementsRes.getAlias(), nsName, NULL, &nlStatus)); + ures_getByKeyWithFallback(nonLatnSymbols.getAlias(), gSymbols, nonLatnSymbols.getAlias(), &nlStatus); + } - NumberingSystem* ns = NumberingSystem::createInstance(loc,status); - if (U_SUCCESS(status) && ns->getRadix() == 10 && !ns->isAlgorithmic()) { - nsName = ns->getName(); - UnicodeString digitString(ns->getDescription()); - setSymbol(kZeroDigitSymbol, digitString.tempSubString(0, 1), FALSE); - setSymbol(kOneDigitSymbol, digitString.tempSubString(1, 1), FALSE); - setSymbol(kTwoDigitSymbol, digitString.tempSubString(2, 1), FALSE); - setSymbol(kThreeDigitSymbol, digitString.tempSubString(3, 1), FALSE); - setSymbol(kFourDigitSymbol, digitString.tempSubString(4, 1), FALSE); - setSymbol(kFiveDigitSymbol, digitString.tempSubString(5, 1), FALSE); - setSymbol(kSixDigitSymbol, digitString.tempSubString(6, 1), FALSE); - setSymbol(kSevenDigitSymbol, digitString.tempSubString(7, 1), FALSE); - setSymbol(kEightDigitSymbol, digitString.tempSubString(8, 1), FALSE); - setSymbol(kNineDigitSymbol, digitString.tempSubString(9, 1), FALSE); - } else { - nsName = gLatn; - } - - UBool isLatn = !uprv_strcmp(nsName,gLatn); + LocalUResourceBundlePointer latnSymbols( + ures_getByKeyWithFallback(numberElementsRes.getAlias(), gLatn, NULL, &status)); + ures_getByKeyWithFallback(latnSymbols.getAlias(), gSymbols, latnSymbols.getAlias(), &status); - UErrorCode nlStatus = U_ZERO_ERROR; - UResourceBundle *nonLatnSymbols = NULL; - if ( !isLatn ) { - nonLatnSymbols = ures_getByKeyWithFallback(numberElementsRes, nsName, NULL, &nlStatus); - nonLatnSymbols = ures_getByKeyWithFallback(nonLatnSymbols, gSymbols, nonLatnSymbols, &nlStatus); - } - - UResourceBundle *latnSymbols = ures_getByKeyWithFallback(numberElementsRes, gLatn, NULL, &status); - latnSymbols = ures_getByKeyWithFallback(latnSymbols, gSymbols, latnSymbols, &status); - - UBool kMonetaryDecimalSet = FALSE; - UBool kMonetaryGroupingSet = FALSE; - for(int32_t i = 0; i<kFormatSymbolCount; i++) { - if ( gNumberElementKeys[i] != NULL ) { - UErrorCode localStatus = U_ZERO_ERROR; - if ( !isLatn ) { - sym = ures_getStringByKeyWithFallback(nonLatnSymbols,gNumberElementKeys[i],&len,&localStatus); - // If we can't find the symbol in the numbering system specific resources, - // use the "latn" numbering system as the fallback. - if ( U_FAILURE(localStatus) ) { - localStatus = U_ZERO_ERROR; - sym = ures_getStringByKeyWithFallback(latnSymbols,gNumberElementKeys[i],&len,&localStatus); - } - } else { - sym = ures_getStringByKeyWithFallback(latnSymbols,gNumberElementKeys[i],&len,&localStatus); + UBool kMonetaryDecimalSet = FALSE; + UBool kMonetaryGroupingSet = FALSE; + for(int32_t i = 0; i<kFormatSymbolCount; i++) { + if ( gNumberElementKeys[i] != NULL ) { + UErrorCode localStatus = U_ZERO_ERROR; + if ( !isLatn ) { + sym = ures_getStringByKeyWithFallback(nonLatnSymbols.getAlias(), + gNumberElementKeys[i], &len, &localStatus); + // If we can't find the symbol in the numbering system specific resources, + // use the "latn" numbering system as the fallback. + if ( U_FAILURE(localStatus) ) { + localStatus = U_ZERO_ERROR; + sym = ures_getStringByKeyWithFallback(latnSymbols.getAlias(), + gNumberElementKeys[i], &len, &localStatus); } + } else { + sym = ures_getStringByKeyWithFallback(latnSymbols.getAlias(), + gNumberElementKeys[i], &len, &localStatus); + } - if ( U_SUCCESS(localStatus) ) { - setSymbol((ENumberFormatSymbol)i, UnicodeString(TRUE, sym, len)); - if ( i == kMonetarySeparatorSymbol ) { - kMonetaryDecimalSet = TRUE; - } else if ( i == kMonetaryGroupingSeparatorSymbol ) { - kMonetaryGroupingSet = TRUE; - } + if ( U_SUCCESS(localStatus) ) { + setSymbol((ENumberFormatSymbol)i, UnicodeString(TRUE, sym, len)); + if ( i == kMonetarySeparatorSymbol ) { + kMonetaryDecimalSet = TRUE; + } else if ( i == kMonetaryGroupingSeparatorSymbol ) { + kMonetaryGroupingSet = TRUE; } } } - - ures_close(latnSymbols); - if ( !isLatn ) { - ures_close(nonLatnSymbols); - } - - // If monetary decimal or grouping were not explicitly set, then set them to be the - // same as their non-monetary counterparts. - - if ( !kMonetaryDecimalSet ) { - setSymbol(kMonetarySeparatorSymbol,fSymbols[kDecimalSeparatorSymbol]); - } - if ( !kMonetaryGroupingSet ) { - setSymbol(kMonetaryGroupingSeparatorSymbol,fSymbols[kGroupingSeparatorSymbol]); - } - - if (ns) { - delete ns; - } - - // Obtain currency data from the currency API. This is strictly - // for backward compatibility; we don't use DecimalFormatSymbols - // for currency data anymore. - UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out - UChar curriso[4]; - UnicodeString tempStr; - ucurr_forLocale(locStr, curriso, 4, &internalStatus); - - // Reuse numberElements[0] as a temporary buffer - uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); - if (U_SUCCESS(internalStatus)) { - fSymbols[kIntlCurrencySymbol].setTo(curriso, -1); - fSymbols[kCurrencySymbol] = tempStr; - } - /* else use the default values. */ - - U_LOCALE_BASED(locBased, *this); - locBased.setLocaleIDs(ures_getLocaleByType(numberElementsRes, - ULOC_VALID_LOCALE, &status), - ures_getLocaleByType(numberElementsRes, - ULOC_ACTUAL_LOCALE, &status)); - - //load the currency data - UChar ucc[4]={0}; //Currency Codes are always 3 chars long - int32_t uccLen = 4; - const char* locName = loc.getName(); - UErrorCode localStatus = U_ZERO_ERROR; - uccLen = ucurr_forLocale(locName, ucc, uccLen, &localStatus); - - if(U_SUCCESS(localStatus) && uccLen > 0) { - char cc[4]={0}; - u_UCharsToChars(ucc, cc, uccLen); - /* An explicit currency was requested */ - UResourceBundle *currencyResource = ures_open(U_ICUDATA_CURR, locStr, &localStatus); - UResourceBundle *currency = ures_getByKeyWithFallback(currencyResource, "Currencies", NULL, &localStatus); - currency = ures_getByKeyWithFallback(currency, cc, currency, &localStatus); - if(U_SUCCESS(localStatus) && ures_getSize(currency)>2) { // the length is 3 if more data is present - currency = ures_getByIndex(currency, 2, currency, &localStatus); - int32_t currPatternLen = 0; - currPattern = ures_getStringByIndex(currency, (int32_t)0, &currPatternLen, &localStatus); - UnicodeString decimalSep = ures_getUnicodeStringByIndex(currency, (int32_t)1, &localStatus); - UnicodeString groupingSep = ures_getUnicodeStringByIndex(currency, (int32_t)2, &localStatus); - if(U_SUCCESS(localStatus)){ - fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep; - fSymbols[kMonetarySeparatorSymbol] = decimalSep; - //pattern.setTo(TRUE, currPattern, currPatternLen); - status = localStatus; - } - } - ures_close(currency); - ures_close(currencyResource); - /* else An explicit currency was requested and is unknown or locale data is malformed. */ - /* ucurr_* API will get the correct value later on. */ - } - // else ignore the error if no currency - - // Currency Spacing. - localStatus = U_ZERO_ERROR; - UResourceBundle *currencyResource = ures_open(U_ICUDATA_CURR, locStr, &localStatus); - UResourceBundle *currencySpcRes = ures_getByKeyWithFallback(currencyResource, - gCurrencySpacingTag, NULL, &localStatus); - - if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { - const char* keywords[UNUM_CURRENCY_SPACING_COUNT] = { - gCurrencyMatchTag, gCurrencySudMatchTag, gCurrencyInsertBtnTag - }; - localStatus = U_ZERO_ERROR; - UResourceBundle *dataRes = ures_getByKeyWithFallback(currencySpcRes, - gBeforeCurrencyTag, NULL, &localStatus); - if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { - localStatus = U_ZERO_ERROR; - for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { - currencySpcBeforeSym[i] = ures_getUnicodeStringByKey(dataRes, keywords[i], &localStatus); - } - ures_close(dataRes); - } - dataRes = ures_getByKeyWithFallback(currencySpcRes, - gAfterCurrencyTag, NULL, &localStatus); - if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { - localStatus = U_ZERO_ERROR; - for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { - currencySpcAfterSym[i] = ures_getUnicodeStringByKey(dataRes, keywords[i], &localStatus); - } - ures_close(dataRes); - } - ures_close(currencySpcRes); - ures_close(currencyResource); - } } - ures_close(resource); - ures_close(numberElementsRes); + // If monetary decimal or grouping were not explicitly set, then set them to be the + // same as their non-monetary counterparts. + + if ( !kMonetaryDecimalSet ) { + setSymbol(kMonetarySeparatorSymbol,fSymbols[kDecimalSeparatorSymbol]); + } + if ( !kMonetaryGroupingSet ) { + setSymbol(kMonetaryGroupingSeparatorSymbol,fSymbols[kGroupingSeparatorSymbol]); + } + + // Obtain currency data from the currency API. This is strictly + // for backward compatibility; we don't use DecimalFormatSymbols + // for currency data anymore. + UErrorCode internalStatus = U_ZERO_ERROR; // don't propagate failures out + UChar curriso[4]; + UnicodeString tempStr; + ucurr_forLocale(locStr, curriso, 4, &internalStatus); + + uprv_getStaticCurrencyName(curriso, locStr, tempStr, internalStatus); + if (U_SUCCESS(internalStatus)) { + fSymbols[kIntlCurrencySymbol].setTo(curriso, -1); + fSymbols[kCurrencySymbol] = tempStr; + } + /* else use the default values. */ + + U_LOCALE_BASED(locBased, *this); + locBased.setLocaleIDs(ures_getLocaleByType(numberElementsRes.getAlias(), + ULOC_VALID_LOCALE, &status), + ures_getLocaleByType(numberElementsRes.getAlias(), + ULOC_ACTUAL_LOCALE, &status)); + + //load the currency data + UChar ucc[4]={0}; //Currency Codes are always 3 chars long + int32_t uccLen = 4; + const char* locName = loc.getName(); + UErrorCode localStatus = U_ZERO_ERROR; + uccLen = ucurr_forLocale(locName, ucc, uccLen, &localStatus); + + if(U_SUCCESS(localStatus) && uccLen > 0) { + char cc[4]={0}; + u_UCharsToChars(ucc, cc, uccLen); + /* An explicit currency was requested */ + LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &localStatus)); + LocalUResourceBundlePointer currency( + ures_getByKeyWithFallback(currencyResource.getAlias(), "Currencies", NULL, &localStatus)); + ures_getByKeyWithFallback(currency.getAlias(), cc, currency.getAlias(), &localStatus); + if(U_SUCCESS(localStatus) && ures_getSize(currency.getAlias())>2) { // the length is 3 if more data is present + ures_getByIndex(currency.getAlias(), 2, currency.getAlias(), &localStatus); + int32_t currPatternLen = 0; + currPattern = + ures_getStringByIndex(currency.getAlias(), (int32_t)0, &currPatternLen, &localStatus); + UnicodeString decimalSep = + ures_getUnicodeStringByIndex(currency.getAlias(), (int32_t)1, &localStatus); + UnicodeString groupingSep = + ures_getUnicodeStringByIndex(currency.getAlias(), (int32_t)2, &localStatus); + if(U_SUCCESS(localStatus)){ + fSymbols[kMonetaryGroupingSeparatorSymbol] = groupingSep; + fSymbols[kMonetarySeparatorSymbol] = decimalSep; + //pattern.setTo(TRUE, currPattern, currPatternLen); + status = localStatus; + } + } + /* else An explicit currency was requested and is unknown or locale data is malformed. */ + /* ucurr_* API will get the correct value later on. */ + } + // else ignore the error if no currency + + // Currency Spacing. + localStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer currencyResource(ures_open(U_ICUDATA_CURR, locStr, &localStatus)); + LocalUResourceBundlePointer currencySpcRes( + ures_getByKeyWithFallback(currencyResource.getAlias(), + gCurrencySpacingTag, NULL, &localStatus)); + + if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { + const char* keywords[UNUM_CURRENCY_SPACING_COUNT] = { + gCurrencyMatchTag, gCurrencySudMatchTag, gCurrencyInsertBtnTag + }; + localStatus = U_ZERO_ERROR; + LocalUResourceBundlePointer dataRes( + ures_getByKeyWithFallback(currencySpcRes.getAlias(), + gBeforeCurrencyTag, NULL, &localStatus)); + if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { + localStatus = U_ZERO_ERROR; + for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { + currencySpcBeforeSym[i] = + ures_getUnicodeStringByKey(dataRes.getAlias(), keywords[i], &localStatus); + } + } + dataRes.adoptInstead( + ures_getByKeyWithFallback(currencySpcRes.getAlias(), + gAfterCurrencyTag, NULL, &localStatus)); + if (localStatus == U_USING_FALLBACK_WARNING || U_SUCCESS(localStatus)) { + localStatus = U_ZERO_ERROR; + for (int32_t i = 0; i < UNUM_CURRENCY_SPACING_COUNT; i++) { + currencySpcAfterSym[i] = + ures_getUnicodeStringByKey(dataRes.getAlias(), keywords[i], &localStatus); + } + } + } } void diff --git a/icu4c/source/i18n/unicode/dcfmtsym.h b/icu4c/source/i18n/unicode/dcfmtsym.h index da5c08d915d..bfb14500524 100644 --- a/icu4c/source/i18n/unicode/dcfmtsym.h +++ b/icu4c/source/i18n/unicode/dcfmtsym.h @@ -187,7 +187,24 @@ public: * failure code upon return. * @stable ICU 2.0 */ - DecimalFormatSymbols( UErrorCode& status); + DecimalFormatSymbols(UErrorCode& status); + + /** + * Creates a DecimalFormatSymbols object with last-resort data. + * Intended for callers who cache the symbols data and + * set all symbols on the resulting object. + * + * The last-resort symbols are similar to those for the root data, + * except that the grouping separators are empty, + * the NaN symbol is U+FFFD rather than "NaN", + * and the CurrencySpacing patterns are empty. + * + * @param status Input/output parameter, set to success or + * failure code upon return. + * @return last-resort symbols + * @draft ICU 52 + */ + static DecimalFormatSymbols* createWithLastResortData(UErrorCode& status); /** * Copy constructor. @@ -311,7 +328,7 @@ public: static UClassID U_EXPORT2 getStaticClassID(); private: - DecimalFormatSymbols(); // default constructor not implemented + DecimalFormatSymbols(); /** * Initializes the symbols from the LocaleElements resource bundle. diff --git a/icu4c/source/test/intltest/tsdcfmsy.cpp b/icu4c/source/test/intltest/tsdcfmsy.cpp index 7ddaf3aaee6..0703a4921b3 100644 --- a/icu4c/source/test/intltest/tsdcfmsy.cpp +++ b/icu4c/source/test/intltest/tsdcfmsy.cpp @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2010, International Business Machines Corporation and + * Copyright (c) 1997-2013, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -15,17 +15,13 @@ void IntlTestDecimalFormatSymbols::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) { - if (exec) logln("TestSuite DecimalFormatSymbols"); - switch (index) { - case 0: name = "DecimalFormatSymbols test"; - if (exec) { - logln("DecimalFormatSymbols test---"); logln(""); - testSymbols(/*par*/); - } - break; - - default: name = ""; break; + if (exec) { + logln("TestSuite DecimalFormatSymbols:"); } + TESTCASE_AUTO_BEGIN; + TESTCASE_AUTO(testSymbols); + TESTCASE_AUTO(testLastResortData); + TESTCASE_AUTO_END; } /** @@ -213,20 +209,57 @@ void IntlTestDecimalFormatSymbols::testSymbols(/* char *par */) } -void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern, DecimalFormatSymbols sym, const UnicodeString& expected){ +void IntlTestDecimalFormatSymbols::testLastResortData() { + IcuTestErrorCode errorCode(*this, "testLastResortData"); + LocalPointer<DecimalFormatSymbols> lastResort( + DecimalFormatSymbols::createWithLastResortData(errorCode)); + if(errorCode.logIfFailureAndReset("DecimalFormatSymbols::createWithLastResortData() failed")) { + return; + } + DecimalFormatSymbols root(Locale::getRoot(), errorCode); + if(errorCode.logIfFailureAndReset("DecimalFormatSymbols(root) failed")) { + return; + } + // Note: It is not necessary that the last resort data matches the root locale, + // but it seems weird if most symbols did not match. + // Also, one purpose for calling operator==() is to find uninitialized memory in a debug build. + if(*lastResort == root) { + errln("DecimalFormatSymbols last resort data unexpectedly matches root"); + } + // Here we adjust for expected differences. + assertEquals("last-resort grouping separator", + "", lastResort->getSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol)); + lastResort->setSymbol(DecimalFormatSymbols::kGroupingSeparatorSymbol, ","); + assertEquals("last-resort monetary grouping separator", + "", lastResort->getSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol)); + lastResort->setSymbol(DecimalFormatSymbols::kMonetaryGroupingSeparatorSymbol, ","); + assertEquals("last-resort NaN", + UnicodeString((UChar)0xfffd), lastResort->getSymbol(DecimalFormatSymbols::kNaNSymbol)); + lastResort->setSymbol(DecimalFormatSymbols::kNaNSymbol, "NaN"); + // Check that now all of the symbols match root. + for(int32_t i = 0; i < DecimalFormatSymbols::kFormatSymbolCount; ++i) { + DecimalFormatSymbols::ENumberFormatSymbol e = (DecimalFormatSymbols::ENumberFormatSymbol)i; + assertEquals("last-resort symbol vs. root", root.getSymbol(e), lastResort->getSymbol(e)); + } + // Also, the CurrencySpacing patterns are empty in the last resort instance, + // but not in root. + Verify(1234567.25, "#,##0.##", *lastResort, "1,234,567.25"); +} + +void IntlTestDecimalFormatSymbols::Verify(double value, const UnicodeString& pattern, + const DecimalFormatSymbols &sym, const UnicodeString& expected){ UErrorCode status = U_ZERO_ERROR; - DecimalFormat *df = new DecimalFormat(pattern, sym, status); + DecimalFormat df(pattern, sym, status); if(U_FAILURE(status)){ - errln("ERROR: construction of decimal format failed"); + errln("ERROR: construction of decimal format failed - %s", u_errorName(status)); } UnicodeString buffer; FieldPosition pos(FieldPosition::DONT_CARE); - buffer = df->format(value, buffer, pos); + buffer = df.format(value, buffer, pos); if(buffer != expected){ - errln((UnicodeString)"ERROR: format failed after setSymbols()\n Expected " + + errln((UnicodeString)"ERROR: format() returns wrong result\n Expected " + expected + ", Got " + buffer); } - delete df; } #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/test/intltest/tsdcfmsy.h b/icu4c/source/test/intltest/tsdcfmsy.h index 828d0f434ad..63e0fd1df8d 100644 --- a/icu4c/source/test/intltest/tsdcfmsy.h +++ b/icu4c/source/test/intltest/tsdcfmsy.h @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2001, International Business Machines Corporation and + * Copyright (c) 1997-2013, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ @@ -25,9 +25,11 @@ private: * Test the API of DecimalFormatSymbols; primarily a simple get/set set. */ void testSymbols(/*char *par*/); + void testLastResortData(); /** helper functions**/ - void Verify(double value, const UnicodeString& pattern, DecimalFormatSymbols sym, const UnicodeString& expected); + void Verify(double value, const UnicodeString& pattern, + const DecimalFormatSymbols &sym, const UnicodeString& expected); }; #endif /* #if !UCONFIG_NO_FORMATTING */