2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FLclNumberFormatterEx.cpp
20 * @brief This is the implementation file for the NumberFormatterEx class.
22 #include <unique_ptr.h>
23 #include <unicode/decimfmt.h>
26 #include <FBaseSysLog.h>
27 #include <FLclNumberFormatter.h>
29 #include "FLcl_LocaleData.h"
30 #include "FLcl_LocaleImpl.h"
31 #include "FLcl_LocaleManagerImpl.h"
32 #include "FLcl_NumberFormatterImpl.h"
35 using namespace Tizen::Base;
37 namespace Tizen { namespace Locales
40 _NumberFormatterImpl::_NumberFormatterImpl(void)
41 : __pIcuNumberFormatter(null)
45 _NumberFormatterImpl::~_NumberFormatterImpl(void)
47 delete __pIcuNumberFormatter;
51 _NumberFormatterImpl::CreateNumberFormatterN(NumberFormatterStyle style)
53 return CreateNumberFormatterN(_LocaleManagerImpl::GetSystemLocale(), style);
57 _NumberFormatterImpl::CreateNumberFormatterN(const Locale& locale, NumberFormatterStyle style)
59 IcuLocale icuLocale = _LocaleImpl::GetLocaleImpl(locale)->GetIcuLocale();
60 SysTryReturn(NID_LCL, !icuLocale.isBogus(), null, E_UNSUPPORTED_OPERATION,
61 "[%s] Given locale is not supported", GetErrorMessage(E_UNSUPPORTED_OPERATION));
63 std::unique_ptr<NumberFormatter> pNewFormatter(new (std::nothrow) NumberFormatter);
64 SysTryReturn(NID_LCL, pNewFormatter, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY));
66 std::unique_ptr<_NumberFormatterImpl> pNumberFormatterImpl(new (std::nothrow) _NumberFormatterImpl);
67 SysTryReturn(NID_LCL, pNumberFormatterImpl, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed");
69 UNumberFormatStyle icuStyle = UNUM_FORMAT_STYLE_COUNT;
72 case NUM_FORMATTER_STYLE_NUMBER:
73 icuStyle = UNUM_DECIMAL;
75 case NUM_FORMATTER_STYLE_CURRENCY:
76 icuStyle = UNUM_CURRENCY;
78 case NUM_FORMATTER_STYLE_PERCENT:
79 icuStyle = UNUM_PERCENT;
81 case NUM_FORMATTER_STYLE_INVALID:
85 UErrorCode ec = U_ZERO_ERROR;
86 std::unique_ptr<IcuNumberFormat> pIcuNumberFormatter(IcuNumberFormat::createInstance(icuLocale, icuStyle, ec));
87 if (pIcuNumberFormatter)
89 IcuDecimalFormat* pDecimalFmt = dynamic_cast<IcuDecimalFormat*>(pIcuNumberFormatter.get());
92 pIcuNumberFormatter.release();
93 pNumberFormatterImpl->__pIcuNumberFormatter = pDecimalFmt;
94 pNumberFormatterImpl->__currency.Construct(locale);
95 pNewFormatter->__pNumberFormatterImpl = pNumberFormatterImpl.release();
97 SetLastResult(E_SUCCESS);
98 return pNewFormatter.release();
102 SetLastResult(E_INVALID_ARG);
107 _NumberFormatterImpl::ApplyPattern(const String& pattern, bool localized)
109 UErrorCode ec = U_ZERO_ERROR;
112 __pIcuNumberFormatter->applyLocalizedPattern(_LocaleData::GetIcuString(pattern), ec);
116 __pIcuNumberFormatter->applyPattern(_LocaleData::GetIcuString(pattern), ec);
119 return U_SUCCESS(ec) ? E_SUCCESS : E_INVALID_ARG;
123 _NumberFormatterImpl::Format(long number, String& str, _FieldPosition pos) const
125 IcuUnicodeString icuStr;
126 IcuFieldPosition icuPos = _LocaleData::GetIcuFieldPosition(pos);
127 icuStr = __pIcuNumberFormatter->format((int64_t)number, icuStr, icuPos);
128 str = _LocaleData::GetOspString(icuStr);
133 _NumberFormatterImpl::Format(double number, String& str, _FieldPosition pos) const
135 setlocale(LC_ALL, "C");
136 IcuUnicodeString icuStr;
137 IcuFieldPosition icuPos = _LocaleData::GetIcuFieldPosition(pos);
138 icuStr = __pIcuNumberFormatter->format(number, icuStr, icuPos);
139 str = _LocaleData::GetOspString(icuStr);
144 _NumberFormatterImpl::GetCurrency(void)
150 _NumberFormatterImpl::SetCurrency(const Currency& newValue)
152 __currency.Construct(newValue.GetCurrencyCode());
153 __pIcuNumberFormatter->setCurrency(_LocaleData::GetIcuString(newValue.GetCurrencyCode()).getBuffer());
157 _NumberFormatterImpl::GetMaxIntegerDigits(void) const
159 return __pIcuNumberFormatter->getMaximumIntegerDigits();
163 _NumberFormatterImpl::SetMaxIntegerDigits(int newValue)
165 __pIcuNumberFormatter->setMaximumIntegerDigits(newValue);
169 _NumberFormatterImpl::GetMinIntegerDigits(void) const
171 return __pIcuNumberFormatter->getMinimumIntegerDigits();
175 _NumberFormatterImpl::SetMinIntegerDigits(int newValue)
177 __pIcuNumberFormatter->setMinimumIntegerDigits(newValue);
181 _NumberFormatterImpl::GetMaxFractionDigits(void) const
183 return __pIcuNumberFormatter->getMaximumFractionDigits();
187 _NumberFormatterImpl::SetMaxFractionDigits(int newValue)
189 __pIcuNumberFormatter->setMaximumFractionDigits(newValue);
193 _NumberFormatterImpl::GetMinFractionDigits(void) const
195 return __pIcuNumberFormatter->getMinimumFractionDigits();
199 _NumberFormatterImpl::SetMinFractionDigits(int newValue)
201 __pIcuNumberFormatter->setMinimumFractionDigits(newValue);
205 _NumberFormatterImpl::IsGroupingUsed(void) const
207 return __pIcuNumberFormatter->isGroupingUsed();
211 _NumberFormatterImpl::SetGroupingUsed(bool newValue)
213 __pIcuNumberFormatter->setGroupingUsed(newValue);
217 _NumberFormatterImpl::GetPositivePrefix(void) const
219 IcuUnicodeString icuStr;
220 return _LocaleData::GetOspString(__pIcuNumberFormatter->getPositivePrefix(icuStr));
224 _NumberFormatterImpl::SetPositivePrefix(const String& newValue)
226 __pIcuNumberFormatter->setPositivePrefix(_LocaleData::GetIcuString(newValue));
230 _NumberFormatterImpl::GetNegativePrefix(void) const
232 IcuUnicodeString icuStr;
233 return _LocaleData::GetOspString(__pIcuNumberFormatter->getNegativePrefix(icuStr));
237 _NumberFormatterImpl::SetNegativePrefix(const String& newValue)
239 __pIcuNumberFormatter->setNegativePrefix(_LocaleData::GetIcuString(newValue));
243 _NumberFormatterImpl::GetPositiveSuffix(void) const
245 IcuUnicodeString icuStr;
246 return _LocaleData::GetOspString(__pIcuNumberFormatter->getPositiveSuffix(icuStr));
250 _NumberFormatterImpl::SetPositiveSuffix(const String& newValue)
252 __pIcuNumberFormatter->setPositiveSuffix(_LocaleData::GetIcuString(newValue));
256 _NumberFormatterImpl::GetNegativeSuffix(void) const
258 IcuUnicodeString icuStr;
259 return _LocaleData::GetOspString(__pIcuNumberFormatter->getNegativeSuffix(icuStr));
263 _NumberFormatterImpl::SetNegativeSuffix(const String& newValue)
265 __pIcuNumberFormatter->setNegativeSuffix(_LocaleData::GetIcuString(newValue));
269 _NumberFormatterImpl::GetMultiplier(void) const
271 return __pIcuNumberFormatter->getMultiplier();
275 _NumberFormatterImpl::SetMultiplier(int newValue)
277 __pIcuNumberFormatter->setMultiplier(newValue);
282 _NumberFormatterImpl::GetGroupingSize(void) const
284 return __pIcuNumberFormatter->getGroupingSize();
288 _NumberFormatterImpl::SetGroupingSize(int newValue)
290 __pIcuNumberFormatter->setGroupingSize(newValue);
295 _NumberFormatterImpl::IsDecimalSeparatorAlwaysShown(void) const
297 return __pIcuNumberFormatter->isDecimalSeparatorAlwaysShown();
301 _NumberFormatterImpl::SetDecimalSeparatorAlwaysShown(bool newValue)
303 __pIcuNumberFormatter->setDecimalSeparatorAlwaysShown(newValue);
307 _NumberFormatterImpl::IsPositiveSignAlwaysShown(void) const
309 IcuUnicodeString ps("+");
311 pp = __pIcuNumberFormatter->getPositivePrefix(pp);
317 _NumberFormatterImpl::SetPositiveSignAlwaysShown(bool newValue)
319 IcuUnicodeString ps("+");
321 pp = __pIcuNumberFormatter->getPositivePrefix(pp);
325 __pIcuNumberFormatter->setPositivePrefix(ps);
331 __pIcuNumberFormatter->setPositivePrefix("");
336 } } // Tizen::Locales