Refactory NumberFormatter.
authorHokwon Song <hokwon.song@samsung.com>
Thu, 22 Aug 2013 05:29:59 +0000 (14:29 +0900)
committerHokwon Song <hokwon.song@samsung.com>
Thu, 22 Aug 2013 05:32:02 +0000 (14:32 +0900)
Change-Id: I9a04a2ae46d190ac901e50d2a3da1ac2770dd787
Signed-off-by: Hokwon Song <hokwon.song@samsung.com>
src/locales/FLclNumberFormatter.cpp
src/locales/FLcl_DateTimeFormatterImpl.cpp
src/locales/FLcl_LocaleData.cpp
src/locales/FLcl_LocaleData.h
src/locales/FLcl_NumberFormatterImpl.cpp

index 5f198ec..41090ef 100644 (file)
@@ -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);
 }
 
 
index e3da25c..87ae03e 100644 (file)
@@ -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;
 }
index 809d3a1..2017e89 100644 (file)
 
 // Includes
 #include <locale.h>
-#include <memory>
-#include <stdlib.h>
 #include <unistd.h>
-#include <limits.h>
-#include <runtime_info.h>
 #include <unique_ptr.h>
 #include <FBaseSysLog.h>
-#include <FSysSettingInfo.h>
-#include <FLclNumberSymbols.h>
-#include <FApp_AppInfo.h>
+#include <FBaseUtilStringUtil.h>
 #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;
-       }
 }
 
 
index b885448..39012f2 100644 (file)
@@ -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
index ec564df..a8f606f 100644 (file)
@@ -82,23 +82,18 @@ _NumberFormatterImpl::CreateNumberFormatterN(const Locale& locale, NumberFormatt
 
        UErrorCode ec = U_ZERO_ERROR;
        std::unique_ptr<IcuNumberFormat> pIcuNumberFormatter(IcuNumberFormat::createInstance(icuLocale, icuStyle, ec));
-       if (pIcuNumberFormatter)
-       {
-               IcuDecimalFormat* pDecimalFmt = dynamic_cast<IcuDecimalFormat*>(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<IcuDecimalFormat*>(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