| Index: source/i18n/numfmt.cpp
|
| diff --git a/source/i18n/numfmt.cpp b/source/i18n/numfmt.cpp
|
| index ed4239650cca738437dceda48389fb47ca6e41fa..771b12a5c0739ea9e24fc90fe9038f7ce9589750 100644
|
| --- a/source/i18n/numfmt.cpp
|
| +++ b/source/i18n/numfmt.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| *******************************************************************************
|
| -* Copyright (C) 1997-2014, International Business Machines Corporation and
|
| +* Copyright (C) 1997-2015, International Business Machines Corporation and
|
| * others. All Rights Reserved.
|
| *******************************************************************************
|
| *
|
| @@ -120,6 +120,9 @@ static const UChar * const gLastResortNumberPatterns[UNUM_FORMAT_STYLE_COUNT] =
|
| gLastResortPluralCurrencyPat, // UNUM_CURRENCY_PLURAL
|
| gLastResortAccountingCurrencyPat, // UNUM_CURRENCY_ACCOUNTING
|
| gLastResortCurrencyPat, // UNUM_CASH_CURRENCY
|
| + NULL, // UNUM_DECIMAL_COMPACT_SHORT
|
| + NULL, // UNUM_DECIMAL_COMPACT_LONG
|
| + gLastResortCurrencyPat, // UNUM_CURRENCY_STANDARD
|
| };
|
|
|
| // Keys used for accessing resource bundles
|
| @@ -145,7 +148,10 @@ static const char *gFormatKeys[UNUM_FORMAT_STYLE_COUNT] = {
|
| "currencyFormat", // UNUM_CURRENCY_ISO
|
| "currencyFormat", // UNUM_CURRENCY_PLURAL
|
| "accountingFormat", // UNUM_CURRENCY_ACCOUNTING
|
| - "currencyFormat" // UNUM_CASH_CURRENCY
|
| + "currencyFormat", // UNUM_CASH_CURRENCY
|
| + NULL, // UNUM_DECIMAL_COMPACT_SHORT
|
| + NULL, // UNUM_DECIMAL_COMPACT_LONG
|
| + "currencyFormat", // UNUM_CURRENCY_STANDARD
|
| };
|
|
|
| // Static hashtable cache of NumberingSystem objects used by NumberFormat
|
| @@ -731,7 +737,7 @@ CurrencyAmount* NumberFormat::parseCurrency(const UnicodeString& text,
|
| UErrorCode ec = U_ZERO_ERROR;
|
| getEffectiveCurrency(curr, ec);
|
| if (U_SUCCESS(ec)) {
|
| - LocalPointer<CurrencyAmount> currAmt(new CurrencyAmount(parseResult, curr, ec));
|
| + LocalPointer<CurrencyAmount> currAmt(new CurrencyAmount(parseResult, curr, ec), ec);
|
| if (U_FAILURE(ec)) {
|
| pos.setIndex(start); // indicate failure
|
| } else {
|
| @@ -1020,8 +1026,18 @@ NumberFormat::getAvailableLocales(void)
|
| #endif /* UCONFIG_NO_SERVICE */
|
| // -------------------------------------
|
|
|
| +enum { kKeyValueLenMax = 32 };
|
| +
|
| NumberFormat*
|
| NumberFormat::internalCreateInstance(const Locale& loc, UNumberFormatStyle kind, UErrorCode& status) {
|
| + if (kind == UNUM_CURRENCY) {
|
| + char cfKeyValue[kKeyValueLenMax] = {0};
|
| + UErrorCode kvStatus = U_ZERO_ERROR;
|
| + int32_t kLen = loc.getKeywordValue("cf", cfKeyValue, kKeyValueLenMax, kvStatus);
|
| + if (U_SUCCESS(kvStatus) && kLen > 0 && uprv_strcmp(cfKeyValue,"account")==0) {
|
| + kind = UNUM_CURRENCY_ACCOUNTING;
|
| + }
|
| + }
|
| #if !UCONFIG_NO_SERVICE
|
| if (haveService()) {
|
| return (NumberFormat*)gService->get(loc, kind, status);
|
| @@ -1322,6 +1338,7 @@ NumberFormat::makeInstance(const Locale& desiredLocale,
|
| case UNUM_CURRENCY_PLURAL:
|
| case UNUM_CURRENCY_ACCOUNTING:
|
| case UNUM_CASH_CURRENCY:
|
| + case UNUM_CURRENCY_STANDARD:
|
| f = new Win32NumberFormat(desiredLocale, curr, status);
|
|
|
| if (U_SUCCESS(status)) {
|
| @@ -1375,9 +1392,8 @@ NumberFormat::makeInstance(const Locale& desiredLocale,
|
| }
|
| else {
|
| // Loads the decimal symbols of the desired locale.
|
| - symbolsToAdopt.adoptInstead(new DecimalFormatSymbols(desiredLocale, status));
|
| - if (symbolsToAdopt.isNull()) {
|
| - status = U_MEMORY_ALLOCATION_ERROR;
|
| + symbolsToAdopt.adoptInsteadAndCheckErrorCode(new DecimalFormatSymbols(desiredLocale, status), status);
|
| + if (U_FAILURE(status)) {
|
| return NULL;
|
| }
|
|
|
| @@ -1407,7 +1423,7 @@ NumberFormat::makeInstance(const Locale& desiredLocale,
|
| return NULL;
|
| }
|
| if(style==UNUM_CURRENCY || style == UNUM_CURRENCY_ISO || style == UNUM_CURRENCY_ACCOUNTING
|
| - || style == UNUM_CASH_CURRENCY){
|
| + || style == UNUM_CASH_CURRENCY || style == UNUM_CURRENCY_STANDARD){
|
| const UChar* currPattern = symbolsToAdopt->getCurrencyPattern();
|
| if(currPattern!=NULL){
|
| pattern.setTo(currPattern, u_strlen(currPattern));
|
|
|