Index: source/i18n/ucurr.cpp |
diff --git a/source/i18n/ucurr.cpp b/source/i18n/ucurr.cpp |
index d2b4b2fe70cf9673e6a83ef982537446c4754779..5ee8ceef8cd882704d9a39970d05c9074cbdb381 100644 |
--- a/source/i18n/ucurr.cpp |
+++ b/source/i18n/ucurr.cpp |
@@ -1,6 +1,6 @@ |
/* |
********************************************************************** |
-* Copyright (c) 2002-2013, International Business Machines |
+* Copyright (c) 2002-2014, International Business Machines |
* Corporation and others. All Rights Reserved. |
********************************************************************** |
*/ |
@@ -119,6 +119,8 @@ static icu::UInitOnce gIsoCodesInitOnce = U_INITONCE_INITIALIZER; |
static const icu::Hashtable* gCurrSymbolsEquiv = NULL; |
static icu::UInitOnce gCurrSymbolsEquivInitOnce = U_INITONCE_INITIALIZER; |
+U_NAMESPACE_BEGIN |
+ |
// EquivIterator iterates over all strings that are equivalent to a given |
// string, s. Note that EquivIterator will never yield s itself. |
class EquivIterator : icu::UMemory { |
@@ -154,6 +156,8 @@ EquivIterator::next() { |
return _next; |
} |
+U_NAMESPACE_END |
+ |
// makeEquivalent makes lhs and rhs equivalent by updating the equivalence |
// relations in hash accordingly. |
static void makeEquivalent( |
@@ -167,8 +171,8 @@ static void makeEquivalent( |
// already equivalent |
return; |
} |
- EquivIterator leftIter(*hash, lhs); |
- EquivIterator rightIter(*hash, rhs); |
+ icu::EquivIterator leftIter(*hash, lhs); |
+ icu::EquivIterator rightIter(*hash, rhs); |
const icu::UnicodeString *firstLeft = leftIter.next(); |
const icu::UnicodeString *firstRight = rightIter.next(); |
const icu::UnicodeString *nextLeft = firstLeft; |
@@ -220,7 +224,7 @@ static void makeEquivalent( |
// countEquivalent does not include s itself in the count. |
static int32_t countEquivalent(const icu::Hashtable &hash, const icu::UnicodeString &s) { |
int32_t result = 0; |
- EquivIterator iter(hash, s); |
+ icu::EquivIterator iter(hash, s); |
while (iter.next() != NULL) { |
++result; |
} |
@@ -1067,7 +1071,7 @@ collectCurrencyNames(const char* locale, |
(*currencySymbols)[(*total_currency_symbol_count)++].currencyNameLen = len; |
// Add equivalent symbols |
if (currencySymbolsEquiv != NULL) { |
- EquivIterator iter(*currencySymbolsEquiv, UnicodeString(TRUE, s, len)); |
+ icu::EquivIterator iter(*currencySymbolsEquiv, UnicodeString(TRUE, s, len)); |
const UnicodeString *symbol; |
while ((symbol = iter.next()) != NULL) { |
(*currencySymbols)[*total_currency_symbol_count].IsoCode = iso; |
@@ -1616,30 +1620,68 @@ uprv_getStaticCurrencyName(const UChar* iso, const char* loc, |
U_CAPI int32_t U_EXPORT2 |
ucurr_getDefaultFractionDigits(const UChar* currency, UErrorCode* ec) { |
- return (_findMetaData(currency, *ec))[0]; |
+ return ucurr_getDefaultFractionDigitsForUsage(currency,UCURR_USAGE_STANDARD,ec); |
+} |
+ |
+U_DRAFT int32_t U_EXPORT2 |
+ucurr_getDefaultFractionDigitsForUsage(const UChar* currency, const UCurrencyUsage usage, UErrorCode* ec) { |
+ int32_t fracDigits = 0; |
+ if (U_SUCCESS(*ec)) { |
+ switch (usage) { |
+ case UCURR_USAGE_STANDARD: |
+ fracDigits = (_findMetaData(currency, *ec))[0]; |
+ break; |
+ case UCURR_USAGE_CASH: |
+ fracDigits = (_findMetaData(currency, *ec))[2]; |
+ break; |
+ default: |
+ *ec = U_UNSUPPORTED_ERROR; |
+ } |
+ } |
+ return fracDigits; |
} |
U_CAPI double U_EXPORT2 |
ucurr_getRoundingIncrement(const UChar* currency, UErrorCode* ec) { |
+ return ucurr_getRoundingIncrementForUsage(currency, UCURR_USAGE_STANDARD, ec); |
+} |
+ |
+U_DRAFT double U_EXPORT2 |
+ucurr_getRoundingIncrementForUsage(const UChar* currency, const UCurrencyUsage usage, UErrorCode* ec) { |
+ double result = 0.0; |
+ |
const int32_t *data = _findMetaData(currency, *ec); |
+ if (U_SUCCESS(*ec)) { |
+ int32_t fracDigits; |
+ int32_t increment; |
+ switch (usage) { |
+ case UCURR_USAGE_STANDARD: |
+ fracDigits = data[0]; |
+ increment = data[1]; |
+ break; |
+ case UCURR_USAGE_CASH: |
+ fracDigits = data[2]; |
+ increment = data[3]; |
+ break; |
+ default: |
+ *ec = U_UNSUPPORTED_ERROR; |
+ return result; |
+ } |
- // If the meta data is invalid, return 0.0. |
- if (data[0] < 0 || data[0] > MAX_POW10) { |
- if (U_SUCCESS(*ec)) { |
+ // If the meta data is invalid, return 0.0 |
+ if (fracDigits < 0 || fracDigits > MAX_POW10) { |
*ec = U_INVALID_FORMAT_ERROR; |
+ } else { |
+ // A rounding value of 0 or 1 indicates no rounding. |
+ if (increment >= 2) { |
+ // Return (increment) / 10^(fracDigits). The only actual rounding data, |
+ // as of this writing, is CHF { 2, 5 }. |
+ result = double(increment) / POW10[fracDigits]; |
+ } |
} |
- return 0.0; |
- } |
- |
- // If there is no rounding, return 0.0 to indicate no rounding. A |
- // rounding value (data[1]) of 0 or 1 indicates no rounding. |
- if (data[1] < 2) { |
- return 0.0; |
} |
- // Return data[1] / 10^(data[0]). The only actual rounding data, |
- // as of this writing, is CHF { 2, 5 }. |
- return double(data[1]) / POW10[data[0]]; |
+ return result; |
} |
U_CDECL_BEGIN |
@@ -2491,7 +2533,7 @@ U_CAPI UEnumeration *U_EXPORT2 ucurr_getKeywordValuesForLocale(const char *key, |
char loc[ULOC_FULLNAME_CAPACITY] = ""; |
uloc_addLikelySubtags(locale, loc, sizeof(loc), status); |
- prefRegionLength = uloc_getCountry(loc, prefRegion, sizeof(prefRegion), status); |
+ /*prefRegionLength = */ uloc_getCountry(loc, prefRegion, sizeof(prefRegion), status); |
} |
// Read value from supplementalData |