From: Hokwon Song Date: Thu, 22 Aug 2013 05:29:59 +0000 (+0900) Subject: Refactory NumberFormatter. X-Git-Tag: submit/tizen/20131210.080830^2^2~157 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3f8b53a3811ad734999f91c3dc8258cac8f65dac;p=platform%2Fframework%2Fnative%2Fappfw.git Refactory NumberFormatter. Change-Id: I9a04a2ae46d190ac901e50d2a3da1ac2770dd787 Signed-off-by: Hokwon Song --- diff --git a/src/locales/FLclNumberFormatter.cpp b/src/locales/FLclNumberFormatter.cpp index 5f198ec..41090ef 100644 --- a/src/locales/FLclNumberFormatter.cpp +++ b/src/locales/FLclNumberFormatter.cpp @@ -186,7 +186,7 @@ result NumberFormatter::ApplyPattern(const Tizen::Base::String& pattern, bool localized) { SysTryReturnResult(NID_LCL, pattern.GetLength() > 0, E_INVALID_ARG, "Invalid argument is used. Length of the pattern is 0"); - return __pNumberFormatterImpl->ApplyPattern(pattern, localized); // Try to set pattern to ICU number formatter + return __pNumberFormatterImpl->ApplyPattern(pattern, localized); } diff --git a/src/locales/FLcl_DateTimeFormatterImpl.cpp b/src/locales/FLcl_DateTimeFormatterImpl.cpp index e3da25c..87ae03e 100644 --- a/src/locales/FLcl_DateTimeFormatterImpl.cpp +++ b/src/locales/FLcl_DateTimeFormatterImpl.cpp @@ -165,9 +165,7 @@ _DateTimeFormatterImpl::Format(const Calendar& calendar, String& strBuf) const SysTryReturnResult(NID_LCL, pIcuCal, E_SYSTEM, "It is failed to get icu calendar."); IcuFieldPosition icuFp; - IcuUnicodeString icuStr; - - _LocaleData::GetIcuString(strBuf,icuStr); + IcuUnicodeString icuStr = _LocaleData::GetIcuString(strBuf); icuStr = __pIcuDateFormatter->format(*pIcuCal, icuStr, icuFp); strBuf = _LocaleData::GetOspString(icuStr); delete pIcuCal; @@ -179,8 +177,7 @@ result _DateTimeFormatterImpl::ApplyPattern(const String& pattern) { SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); - U_ICU_NAMESPACE::UnicodeString icuStr; - _LocaleData::GetIcuString(pattern, icuStr); + U_ICU_NAMESPACE::UnicodeString icuStr = _LocaleData::GetIcuString(pattern); __pIcuDateFormatter->applyPattern(icuStr); return E_SUCCESS; } diff --git a/src/locales/FLcl_LocaleData.cpp b/src/locales/FLcl_LocaleData.cpp index 809d3a1..2017e89 100644 --- a/src/locales/FLcl_LocaleData.cpp +++ b/src/locales/FLcl_LocaleData.cpp @@ -21,21 +21,12 @@ // Includes #include -#include -#include #include -#include -#include #include #include -#include -#include -#include +#include #include "FBase_StringConverter.h" -#include "FLcl_CalendarImpl.h" -#include "FLcl_IcuCalendarImpl.h" #include "FLcl_LocaleData.h" -#include "FLcl_LocaleImpl.h" // Other defines @@ -49,10 +40,6 @@ using namespace Tizen::Base::Utility; namespace Tizen { namespace Locales { -///////////////////////////////////////////////////////////////////////////////////////////////////// -// Public Method - -// this function is to convert ICU FieldPosition from OSP _FieldPosition IcuFieldPosition _LocaleData::GetIcuFieldPosition(_FieldPosition pos) { @@ -62,6 +49,7 @@ _LocaleData::GetIcuFieldPosition(_FieldPosition pos) return icuPos; } + U_ICU_NAMESPACE::UnicodeString _LocaleData::GetIcuString(const String& ospStr) { @@ -82,7 +70,7 @@ _LocaleData::GetIcuString(const String& ospStr) return icuStr; } -// This function convert ICU string to OSP string + String _LocaleData::GetOspString(const IcuUnicodeString& icuStr) { @@ -103,26 +91,7 @@ _LocaleData::GetOspString(const IcuUnicodeString& icuStr) return String(""); } -// This convert OSP string to ICU strings -void -_LocaleData::GetIcuString(const String& ospStr, IcuUnicodeString& icuStr) -{ - if (!ospStr.IsEmpty()) // if ospStr is not empty - { - ByteBuffer* pBuff = null; - pBuff = StringUtil::StringToUtf8N(ospStr); // Convert unicode value to UTF8 - if (pBuff) - { - icuStr = IcuUnicodeString((const char*) pBuff->GetPointer()); // Create ICU string using UTF8 array - icuStr.setCharAt(0, icuStr.charAt(0)); // This is to handle ICU copy on write design - delete pBuff; // delete temporary buffer - } - } - -// return icuStr; -} -// This function return OSP array list of OSP string from ICU string list ArrayList* _LocaleData::ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrList, int count) { @@ -172,7 +141,7 @@ _LocaleData::ConvertOspArrayToIcuStringArrayN(const Tizen::Base::Collection::ILi pObj = static_cast< String* >(pEnum->GetCurrent()); if (pObj) { - GetIcuString(*pObj, pIcuStrArray[i]); + pIcuStrArray[i] = GetIcuString(*pObj); i++; } } @@ -212,487 +181,6 @@ _LocaleData::GetIcuLocale(const Locale& ospLocale) } -const IcuLocale& -_LocaleData::GetIcuLocale(void) -{ - return __icuLocale; -} - -bool -_LocaleData::IsLocaleSupported(void) -{ - return !__icuLocale.isBogus(); -} - -result -_LocaleData::SetLocale(const Locale& ospLocale) -{ - if (_LocaleImpl::IsSupported(ospLocale)) - { - __icuLocale = GetIcuLocale(ospLocale); - return E_SUCCESS; - } - - __icuLocale.setToBogus(); - return (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) ? E_UNSUPPORTED_OPERATION : E_INVALID_ARG; -} - - -result -_LocaleData::SetNumberFormatter(const Locale& locale, NumberFormatterStyle style) -{ - if (__pIcuNumberFormatter) - { - delete __pIcuNumberFormatter; - __pIcuNumberFormatter = null; - } - - IcuNumberFormat* pNumFmt = null; - UErrorCode ec = U_ZERO_ERROR; - result r = SetLocale(locale); - - if (!IsFailed(r)) - { - switch (style) - { - case NUM_FORMATTER_STYLE_NUMBER: - { - pNumFmt = IcuNumberFormat::createInstance(__icuLocale, ec); - break; - } - - case NUM_FORMATTER_STYLE_CURRENCY: - { - pNumFmt = IcuNumberFormat::createCurrencyInstance(__icuLocale, ec); - break; - } - - case NUM_FORMATTER_STYLE_PERCENT: - { - pNumFmt = IcuNumberFormat::createPercentInstance(__icuLocale, ec); - break; - } - - default: - { - r = E_UNSUPPORTED_OPERATION; - break; - } - } - - if (IsFailed(r)) - { - return r; - } - - if (U_SUCCESS(ec)) - { - if (pNumFmt && (pNumFmt->getDynamicClassID() == IcuDecimalFormat::getStaticClassID())) - { - __pIcuNumberFormatter = dynamic_cast< IcuDecimalFormat* >(pNumFmt); - if (__pIcuNumberFormatter) - { - return E_SUCCESS; - } - } - } - } - - return E_UNSUPPORTED_OPERATION; -} - -result -_LocaleData::FormatNumber(long number, _FieldPosition& pos, Tizen::Base::String& str) -{ - str = ""; - - if (__pIcuNumberFormatter) - { - IcuUnicodeString icuStr; - IcuFieldPosition icuPos = GetIcuFieldPosition(pos); - icuStr = __pIcuNumberFormatter->format(static_cast< int32_t >(number), icuStr, icuPos); - - str = _LocaleData::GetOspString(icuStr); - return E_SUCCESS; - } - - return E_SYSTEM; -} - -result -_LocaleData::FormatNumber(double number, _FieldPosition& pos, Tizen::Base::String& str) -{ - str = ""; - - if (__pIcuNumberFormatter) - { - IcuUnicodeString icuStr; - IcuFieldPosition icuPos = GetIcuFieldPosition(pos); - icuStr = __pIcuNumberFormatter->format(number, icuStr, icuPos); - - str = _LocaleData::GetOspString(icuStr); - return E_SUCCESS; - } - - return E_SYSTEM; -} - -result -_LocaleData::ApplyNumberPattern(const Tizen::Base::String& pattern, bool localized) -{ - if (__pIcuNumberFormatter) - { - IcuUnicodeString icuPattern; - icuPattern = __pIcuNumberFormatter->toPattern(icuPattern); - - UErrorCode ec = U_ZERO_ERROR; - IcuUParseError parseError = {0,}; - IcuUnicodeString icuNewPatter; - GetIcuString(pattern, icuNewPatter); - - if (localized) - { - __pIcuNumberFormatter->applyLocalizedPattern(icuNewPatter, parseError, ec); - } - else - { - __pIcuNumberFormatter->applyPattern(icuNewPatter, parseError, ec); - } - - if (U_SUCCESS(ec)) - { - return E_SUCCESS; - } - else - { - SysLog(NID_LCL, "Error [%d -> %s] in setting pattern to %ls at %d:%d", - ec, u_errorName(ec), pattern.GetPointer(), parseError.line, parseError.offset); - - __pIcuNumberFormatter->applyPattern(icuPattern, ec); - } - } - - return E_INVALID_ARG; -} - -String -_LocaleData::GetNumberFormatterStringAttributes(NumberFormatterAttributes attrName) -{ - IcuUnicodeString icuRetValue; - - if (__pIcuNumberFormatter) - { - switch (attrName) - { - case NUM_FORMATTER_FIELD_CURRENCY: - { - icuRetValue = __pIcuNumberFormatter->getCurrency(); - break; - } - - case NUM_FORMATTER_FIELD_POSITIVE_PREFIX: - { - icuRetValue = __pIcuNumberFormatter->getPositivePrefix(icuRetValue); - break; - } - - case NUM_FORMATTER_FIELD_NEGATIVE_PREFIX: - { - icuRetValue = __pIcuNumberFormatter->getNegativePrefix(icuRetValue); - break; - } - - case NUM_FORMATTER_FIELD_POSITIVE_SUFFIX: - { - icuRetValue = __pIcuNumberFormatter->getPositiveSuffix(icuRetValue); - break; - } - - case NUM_FORMATTER_FIELD_NEGATIVE_SUFFIX: - { - icuRetValue = __pIcuNumberFormatter->getNegativeSuffix(icuRetValue); - break; - } - - case NUM_FORMATTER_FIELD_PATTERN: - { - icuRetValue = __pIcuNumberFormatter->toPattern(icuRetValue); - break; - } - - case NUM_FORMATTER_FIELD_LOCALIZED_PATTERN: - { - icuRetValue = __pIcuNumberFormatter->toLocalizedPattern(icuRetValue); - break; - } - - default: - { - break; - } - } - - return _LocaleData::GetOspString(icuRetValue); - } - - return Tizen::Base::String(""); -} - -void -_LocaleData::SetNumberFormatterAttributes(const String& newValue, NumberFormatterAttributes attrName) -{ - if (__pIcuNumberFormatter) - { - IcuUnicodeString icuNewValue; - GetIcuString(newValue, icuNewValue); - - switch (attrName) - { - case NUM_FORMATTER_FIELD_CURRENCY: - { - __pIcuNumberFormatter->setCurrency(icuNewValue.getTerminatedBuffer()); - break; - } - - case NUM_FORMATTER_FIELD_POSITIVE_PREFIX: - { - __pIcuNumberFormatter->setPositivePrefix(icuNewValue); - break; - } - - case NUM_FORMATTER_FIELD_NEGATIVE_PREFIX: - { - __pIcuNumberFormatter->setNegativePrefix(icuNewValue); - break; - } - - case NUM_FORMATTER_FIELD_POSITIVE_SUFFIX: - { - __pIcuNumberFormatter->setPositiveSuffix(icuNewValue); - break; - } - - case NUM_FORMATTER_FIELD_NEGATIVE_SUFFIX: - { - __pIcuNumberFormatter->setNegativeSuffix(icuNewValue); - break; - } - - default: - { - break; - } - } - } -} - -int -_LocaleData::GetNumberFormatterIntAttributes(NumberFormatterAttributes attrName) -{ - int res = 0; - if (__pIcuNumberFormatter) - { - switch (attrName) - { - case NUM_FORMATTER_FIELD_MAX_INTEGER_DIGITS: - { - res = __pIcuNumberFormatter->getMaximumIntegerDigits(); - break; - } - - case NUM_FORMATTER_FIELD_MIN_INTEGER_DIGITS: - { - res = __pIcuNumberFormatter->getMinimumIntegerDigits(); - break; - } - - case NUM_FORMATTER_FIELD_MAX_FRACTION_DIGITS: - { - res = __pIcuNumberFormatter->getMaximumFractionDigits(); - break; - } - - case NUM_FORMATTER_FIELD_MIN_FRACTION_DIGITS: - { - res = __pIcuNumberFormatter->getMinimumFractionDigits(); - break; - } - - case NUM_FORMATTER_FIELD_MIN_EXPONENT_DIGITS: - { - res = __pIcuNumberFormatter->getMinimumExponentDigits(); - break; - } - - case NUM_FORMATTER_FIELD_MULTIPLIER: - { - res = __pIcuNumberFormatter->getMultiplier(); - break; - } - - case NUM_FORMATTER_FIELD_GROUPING_SIZE: - { - res = __pIcuNumberFormatter->getGroupingSize(); - break; - } - - default: - { - res = 0; - break; - } - } - } - - return res; -} - -void -_LocaleData::SetNumberFormatterAttributes(const int newValue, NumberFormatterAttributes attrName) -{ - if (__pIcuNumberFormatter) - { - switch (attrName) - { - case NUM_FORMATTER_FIELD_MAX_INTEGER_DIGITS: - { - __pIcuNumberFormatter->setMaximumIntegerDigits(newValue); - break; - } - - case NUM_FORMATTER_FIELD_MIN_INTEGER_DIGITS: - { - __pIcuNumberFormatter->setMinimumIntegerDigits(newValue); - break; - } - - case NUM_FORMATTER_FIELD_MAX_FRACTION_DIGITS: - { - __pIcuNumberFormatter->setMaximumFractionDigits(newValue); - break; - } - - case NUM_FORMATTER_FIELD_MIN_FRACTION_DIGITS: - { - __pIcuNumberFormatter->setMinimumFractionDigits(newValue); - break; - } - - case NUM_FORMATTER_FIELD_MIN_EXPONENT_DIGITS: - { - __pIcuNumberFormatter->setMinimumExponentDigits(newValue); - break; - } - - case NUM_FORMATTER_FIELD_MULTIPLIER: - { - __pIcuNumberFormatter->setMultiplier(newValue); - break; - } - - case NUM_FORMATTER_FIELD_GROUPING_SIZE: - { - __pIcuNumberFormatter->setGroupingSize(newValue); - break; - } - - default: - { - break; - } - } - } -} - -bool -_LocaleData::GetNumberFormatterBoolAttributes(NumberFormatterAttributes attrName) -{ - bool res = false; - if (__pIcuNumberFormatter) - { - switch (attrName) - { - case NUM_FORMATTER_FIELD_IS_GROUPING_USED: - { - res = __pIcuNumberFormatter->isGroupingUsed(); - break; - } - - case NUM_FORMATTER_FIELD_IS_DECIMAL_SEPARATOR_ALWAYS_SHOWN: - { - res = __pIcuNumberFormatter->isDecimalSeparatorAlwaysShown(); - break; - } - - case NUM_FORMATTER_FIELD_IS_POSITIVE_SIGN_ALWAYS_SHOWN: - { - IcuUnicodeString ps("+"); - IcuUnicodeString pp; - pp = __pIcuNumberFormatter->getPositivePrefix(pp); - - res = (pp == ps); - break; - } - - default: - { - res = false; - break; - } - } - } - - return res; -} - -void -_LocaleData::SetNumberFormatterAttributes(const bool newValue, NumberFormatterAttributes attrName) -{ - if (__pIcuNumberFormatter) - { - switch (attrName) - { - case NUM_FORMATTER_FIELD_IS_GROUPING_USED: - { - __pIcuNumberFormatter->setGroupingUsed(newValue); - break; - } - - case NUM_FORMATTER_FIELD_IS_DECIMAL_SEPARATOR_ALWAYS_SHOWN: - { - __pIcuNumberFormatter->setDecimalSeparatorAlwaysShown(newValue); - break; - } - - case NUM_FORMATTER_FIELD_IS_POSITIVE_SIGN_ALWAYS_SHOWN: - { - IcuUnicodeString ps("+"); - IcuUnicodeString pp; - pp = __pIcuNumberFormatter->getPositivePrefix(pp); - - if (newValue) - { - __pIcuNumberFormatter->setPositivePrefix(ps); - } - else - { - if (pp == ps) - { - __pIcuNumberFormatter->setPositivePrefix(""); - } - } - break; - } - - default: - { - break; - } - } - } -} - - IcuUDate _LocaleData::GetIcuDate(DateTime date) { @@ -715,19 +203,12 @@ _LocaleData::GetIcuDate(DateTime date) } _LocaleData::_LocaleData(void) - : __icuLocale() - , __pIcuNumberFormatter(null) { } _LocaleData::~_LocaleData(void) { - if (__pIcuNumberFormatter) // Delete __pIcuNumberFormatter and set to null - { - delete __pIcuNumberFormatter; - __pIcuNumberFormatter = null; - } } diff --git a/src/locales/FLcl_LocaleData.h b/src/locales/FLcl_LocaleData.h index b885448..39012f2 100644 --- a/src/locales/FLcl_LocaleData.h +++ b/src/locales/FLcl_LocaleData.h @@ -65,66 +65,23 @@ namespace Tizen { namespace Locales class _LocaleData : public Tizen::Base::Object { - - -// Construct Operations -public: - /** - * Creates an @b uninitialized instance. - * - * @remarks After creating an instance of this class, you must explicitly call the @e Construct() method - * to initialize the instance. - * @see Construct - */ - _LocaleData(void); - - - /** - * Destroys this instance. - */ - virtual ~_LocaleData(void); - - -// Operations -private: - const IcuLocale& GetIcuLocale(void); - public: static Tizen::Base::String GetOspString(const IcuUnicodeString& icuStr); static U_ICU_NAMESPACE::UnicodeString GetIcuString(const Tizen::Base::String& ospString); - static void GetIcuString(const Tizen::Base::String& ospStr, IcuUnicodeString& icuStr); + static IcuUnicodeString* ConvertOspArrayToIcuStringArrayN(const Tizen::Base::Collection::IList* pIcuStrList, int& count); static Tizen::Base::Collection::ArrayList* ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrList, int count); static IcuUDate GetIcuDate(Tizen::Base::DateTime date); static IcuFieldPosition GetIcuFieldPosition(_FieldPosition pos); static IcuLocale GetIcuLocale(const Tizen::Locales::Locale& ospLocale); - // Methods to support Locale - bool IsLocaleSupported(); - result SetLocale(const Locale& ospLocale); - - // Methods to support NumberFormatter - result SetNumberFormatter(const Locale& locale, NumberFormatterStyle style); - result FormatNumber(long number, _FieldPosition& pos, Tizen::Base::String& str); - result FormatNumber(double number, _FieldPosition& pos, Tizen::Base::String& str); - result ApplyNumberPattern(const Tizen::Base::String& pattern, bool localized); - - Tizen::Base::String GetNumberFormatterStringAttributes(NumberFormatterAttributes attrName); - void SetNumberFormatterAttributes(const Tizen::Base::String& newValue, NumberFormatterAttributes attrName); - - int GetNumberFormatterIntAttributes(NumberFormatterAttributes attrName); - void SetNumberFormatterAttributes(const int newValue, NumberFormatterAttributes attrName); - - bool GetNumberFormatterBoolAttributes(NumberFormatterAttributes attrName); - void SetNumberFormatterAttributes(const bool newValue, NumberFormatterAttributes attrName); private: + _LocaleData(void); + virtual ~_LocaleData(void); _LocaleData(const _LocaleData& localeData); _LocaleData& operator =(const _LocaleData& localeData); -private: - IcuLocale __icuLocale; - IcuDecimalFormat* __pIcuNumberFormatter; }; // LocaleData }} // Tizen::Locales diff --git a/src/locales/FLcl_NumberFormatterImpl.cpp b/src/locales/FLcl_NumberFormatterImpl.cpp index ec564df..a8f606f 100644 --- a/src/locales/FLcl_NumberFormatterImpl.cpp +++ b/src/locales/FLcl_NumberFormatterImpl.cpp @@ -82,23 +82,18 @@ _NumberFormatterImpl::CreateNumberFormatterN(const Locale& locale, NumberFormatt UErrorCode ec = U_ZERO_ERROR; std::unique_ptr pIcuNumberFormatter(IcuNumberFormat::createInstance(icuLocale, icuStyle, ec)); - if (pIcuNumberFormatter) - { - IcuDecimalFormat* pDecimalFmt = dynamic_cast(pIcuNumberFormatter.get()); - if (pDecimalFmt) - { - pIcuNumberFormatter.release(); - pNumberFormatterImpl->__pIcuNumberFormatter = pDecimalFmt; - pNumberFormatterImpl->__currency.Construct(locale); - pNewFormatter->__pNumberFormatterImpl = pNumberFormatterImpl.release(); + SysTryReturn(NID_LCL, pIcuNumberFormatter, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed"); - SetLastResult(E_SUCCESS); - return pNewFormatter.release(); - } - } + IcuDecimalFormat* pDecimalFmt = dynamic_cast(pIcuNumberFormatter.get()); + SysTryReturn(NID_LCL, pDecimalFmt, null, E_SYSTEM, "It is failed to get fomatter."); + + pIcuNumberFormatter.release(); + pNumberFormatterImpl->__pIcuNumberFormatter = pDecimalFmt; + pNumberFormatterImpl->__currency.Construct(locale); + pNewFormatter->__pNumberFormatterImpl = pNumberFormatterImpl.release(); - SetLastResult(E_INVALID_ARG); - return null; + SetLastResult(E_SUCCESS); + return pNewFormatter.release(); } result