number_currencysymbols.cpp [plain text]
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#define UNISTR_FROM_STRING_EXPLICIT
#include "numparse_types.h"
#include "number_currencysymbols.h"
using namespace icu;
using namespace icu::number;
using namespace icu::number::impl;
CurrencySymbols::CurrencySymbols(CurrencyUnit currency, const Locale& locale, UErrorCode& status)
: fCurrency(currency), fLocaleName(locale.getName(), status) {
fCurrencySymbol.setToBogus();
fIntlCurrencySymbol.setToBogus();
}
CurrencySymbols::CurrencySymbols(CurrencyUnit currency, const Locale& locale,
const DecimalFormatSymbols& symbols, UErrorCode& status)
: CurrencySymbols(currency, locale, status) {
if (symbols.isCustomCurrencySymbol()) {
fCurrencySymbol = symbols.getConstSymbol(DecimalFormatSymbols::kCurrencySymbol);
}
if (symbols.isCustomIntlCurrencySymbol()) {
fIntlCurrencySymbol = symbols.getConstSymbol(DecimalFormatSymbols::kIntlCurrencySymbol);
}
}
const char16_t* CurrencySymbols::getIsoCode() const {
return fCurrency.getISOCurrency();
}
UnicodeString CurrencySymbols::getNarrowCurrencySymbol(UErrorCode& status) const {
return loadSymbol(UCURR_NARROW_SYMBOL_NAME, status);
}
UnicodeString CurrencySymbols::getCurrencySymbol(UErrorCode& status) const {
if (!fCurrencySymbol.isBogus()) {
return fCurrencySymbol;
}
return loadSymbol(UCURR_SYMBOL_NAME, status);
}
UnicodeString CurrencySymbols::loadSymbol(UCurrNameStyle selector, UErrorCode& status) const {
const char16_t* isoCode = fCurrency.getISOCurrency();
UBool ignoredIsChoiceFormatFillIn = FALSE;
int32_t symbolLen = 0;
const char16_t* symbol = ucurr_getName(
isoCode,
fLocaleName.data(),
selector,
&ignoredIsChoiceFormatFillIn,
&symbolLen,
&status);
if (symbol == isoCode) {
return UnicodeString(isoCode, 3);
} else {
return UnicodeString(TRUE, symbol, symbolLen);
}
}
UnicodeString CurrencySymbols::getIntlCurrencySymbol(UErrorCode&) const {
if (!fIntlCurrencySymbol.isBogus()) {
return fIntlCurrencySymbol;
}
return UnicodeString(fCurrency.getISOCurrency(), 3);
}
UnicodeString CurrencySymbols::getPluralName(StandardPlural::Form plural, UErrorCode& status) const {
const char16_t* isoCode = fCurrency.getISOCurrency();
UBool isChoiceFormat = FALSE;
int32_t symbolLen = 0;
const char16_t* symbol = ucurr_getPluralName(
isoCode,
fLocaleName.data(),
&isChoiceFormat,
StandardPlural::getKeyword(plural),
&symbolLen,
&status);
if (symbol == isoCode) {
return UnicodeString(isoCode, 3);
} else {
return UnicodeString(TRUE, symbol, symbolLen);
}
}
CurrencyUnit
icu::number::impl::resolveCurrency(const DecimalFormatProperties& properties, const Locale& locale,
UErrorCode& status) {
if (!properties.currency.isNull()) {
return properties.currency.getNoError();
} else {
UErrorCode localStatus = U_ZERO_ERROR;
char16_t buf[4] = {};
ucurr_forLocale(locale.getName(), buf, 4, &localStatus);
if (U_SUCCESS(localStatus)) {
return CurrencyUnit(buf, status);
} else {
return CurrencyUnit();
}
}
}
#endif