williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: #ifndef _STLP_MONETARY_C williamr@2: #define _STLP_MONETARY_C williamr@2: williamr@2: # ifndef _STLP_INTERNAL_MONETARY_H williamr@2: # include williamr@2: # endif williamr@2: williamr@2: # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) williamr@2: williamr@2: #ifndef _STLP_INTERNAL_IOS_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_NUM_PUT_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_NUM_GET_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: # if ( _STLP_STATIC_TEMPLATE_DATA > 0 ) williamr@2: # if !defined(__LIBSTD_CPP_SYMBIAN32_WSD__) && !defined(_STLP_LIBSTD_CPP_NO_STATIC_VAR_) williamr@2: template williamr@2: locale::id money_get<_CharT, _InputIterator>::id; williamr@2: williamr@2: template williamr@2: locale::id money_put<_CharT, _OutputIterator>::id; williamr@2: #endif williamr@2: # else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */ williamr@2: williamr@2: typedef money_get money_get_char; williamr@2: typedef money_put money_put_char; williamr@2: typedef money_get > > money_get_char_2; williamr@2: typedef money_put > > money_put_char_2; williamr@2: williamr@2: #ifndef __SYMBIAN32__ williamr@2: __DECLARE_INSTANCE(locale::id, money_get_char::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, money_put_char::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, money_get_char_2::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, money_put_char_2::id, ); williamr@2: #endif williamr@2: williamr@2: # ifndef _STLP_NO_WCHAR_T williamr@2: williamr@2: typedef money_get money_get_wchar_t; williamr@2: typedef money_get > > money_get_wchar_t_2; williamr@2: typedef money_put money_put_wchar_t; williamr@2: typedef money_put > > money_put_wchar_t_2; williamr@2: williamr@2: #ifndef __SYMBIAN32__ williamr@2: __DECLARE_INSTANCE(locale::id, money_get_wchar_t::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, money_put_wchar_t::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, money_get_wchar_t_2::id, ); williamr@2: __DECLARE_INSTANCE(locale::id, money_put_wchar_t_2::id, ); williamr@2: #endif williamr@2: williamr@2: # endif williamr@2: # endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */ williamr@2: williamr@2: // money_get facets williamr@2: williamr@2: williamr@2: // helper functions for do_get williamr@2: template williamr@2: pair<_InIt1, bool> __get_string(_InIt1 __first, _InIt1 __last, williamr@2: _InIt2 __str_first, _InIt2 __str_last) { williamr@2: pair<_InIt1, _InIt2> __pr = mismatch(__first, __last, __str_first); williamr@2: return make_pair(__pr.first, __pr.second == __str_last); williamr@2: } williamr@2: williamr@2: template williamr@2: bool williamr@2: __get_monetary_value(_InIt& __first, _InIt __last, _OuIt __stl_out, williamr@2: const ctype<_CharT>& _c_type, williamr@2: _CharT __point, williamr@2: int __frac_digits, williamr@2: _CharT __sep, williamr@2: const string& __grouping, williamr@2: bool& __syntax_ok) williamr@2: { williamr@2: williamr@2: size_t __digits = 0; williamr@2: williamr@2: if (__first == __last || !_c_type.is(ctype_base::digit, *__first)) williamr@2: return false; williamr@2: williamr@2: char __group_sizes[128]; williamr@2: char* __group_sizes_end = __grouping.size() == 0 ? 0 : __group_sizes; williamr@2: char __current_group_size = 0; williamr@2: williamr@2: while (__first != __last) { williamr@2: if (_c_type.is(ctype_base::digit, *__first)) { williamr@2: ++__current_group_size; williamr@2: *__stl_out++ = *__first++; williamr@2: __digits++; williamr@2: } williamr@2: #ifdef __SYMBIAN32__ williamr@2: else if ( (__current_group_size)&&(__group_sizes_end) ){ williamr@2: #else williamr@2: else if (__group_sizes_end) { williamr@2: #endif williamr@2: if (*__first == __sep) { williamr@2: *__group_sizes_end++ = __current_group_size; williamr@2: __current_group_size = 0; williamr@2: ++__first; williamr@2: } williamr@2: else break; williamr@2: } williamr@2: else williamr@2: break; williamr@2: } williamr@2: williamr@2: if (__grouping.size() == 0) williamr@2: __syntax_ok = true; williamr@2: else { williamr@2: if (__group_sizes_end != __group_sizes) williamr@2: *__group_sizes_end++ = __current_group_size; williamr@2: williamr@2: __syntax_ok = __valid_grouping(__group_sizes, __group_sizes_end, williamr@2: __grouping.data(), __grouping.data()+ __grouping.size()); williamr@2: williamr@2: if (__first == __last || *__first != __point) { williamr@2: for (int __digits = 0; __digits != __frac_digits; ++__digits) williamr@2: *__stl_out++ = _CharT('0'); williamr@2: return true; // OK not to have decimal point williamr@2: } williamr@2: } williamr@2: //bug fix testcase_22427 - commented williamr@2: // ++__first; williamr@2: williamr@2: williamr@2: //bug fix testcase_22427 - added if williamr@2: williamr@2: if (__first != __last && *__first == __point && __frac_digits) williamr@2: { williamr@2: //bug fix testcase_22427 - commented williamr@2: ++__first; williamr@2: while (__first != __last && _c_type.is(ctype_base::digit, *__first)) { williamr@2: *__stl_out++ = *__first++; williamr@2: ++__digits; williamr@2: } williamr@2: } williamr@2: williamr@2: //bug fix testcase_22427 - condition changed williamr@2: // __syntax_ok = __syntax_ok && (__digits == __frac_digits); williamr@2: williamr@2: if(__digits == 0) williamr@2: __syntax_ok = false; williamr@2: williamr@2: return true; williamr@2: } williamr@2: williamr@2: # ifndef _STLP_NO_LONG_DOUBLE williamr@2: williamr@2: //===== methods ====== williamr@2: template williamr@2: _InputIter williamr@2: money_get<_CharT, _InputIter>::do_get(_InputIter __s, _InputIter __end, bool __intl, williamr@2: ios_base& __str, ios_base::iostate& __err, williamr@2: long double& __units) const { williamr@2: string_type __buf; williamr@2: __s = do_get(__s, __end, __intl, __str, __err, __buf); williamr@2: williamr@2: if (__err == ios_base::goodbit || __err == ios_base::eofbit) { williamr@2: __buf.push_back(0); williamr@2: typename string_type::iterator __b = __buf.begin(), __e = __buf.end(); williamr@2: // Can't use atold, since it might be wchar_t. Don't get confused by name below : williamr@2: // it's perfectly capable of reading long double. williamr@2: __get_decimal_integer(__b, __e, __units); williamr@2: } williamr@2: if (__s == __end) williamr@2: __err |= ios_base::eofbit; williamr@2: return __s; williamr@2: } williamr@2: # endif williamr@2: williamr@2: template williamr@2: _InputIter williamr@2: money_get<_CharT, _InputIter>::do_get(iter_type __s, williamr@2: iter_type __end, bool __intl, williamr@2: ios_base& __str, ios_base::iostate& __err, williamr@2: string_type& __digits) const { williamr@2: __err = 0; williamr@2: if (__s == __end) { williamr@2: __err |= ios_base::eofbit; williamr@2: return __s; williamr@2: } williamr@2: williamr@2: typedef moneypunct<_CharT, false> _Punct; williamr@2: typedef moneypunct<_CharT, true> _Punct_intl; williamr@2: typedef ctype<_CharT> _Ctype; williamr@2: #ifdef __SYMBIAN32__ williamr@2: bool __isSignSympresent = false; williamr@2: #endif williamr@2: williamr@2: bool __testvalid = true; williamr@2: locale __loc = __str.getloc(); williamr@2: const _Punct& __punct = use_facet<_Punct>(__loc) ; williamr@2: const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ; williamr@2: const _Ctype& __c_type = use_facet<_Ctype>(__loc) ; williamr@2: williamr@2: money_base::pattern __format = __intl ? __punct_intl.neg_format() williamr@2: : __punct.neg_format(); williamr@2: string_type __ns = __intl ? __punct_intl.negative_sign() williamr@2: : __punct.negative_sign(); williamr@2: string_type __ps = __intl ? __punct_intl.positive_sign() williamr@2: : __punct.positive_sign(); williamr@2: string_type __sign = __ps; williamr@2: int __i; williamr@2: bool __is_positive = true; williamr@2: bool __symbol_required = (__str.flags() & ios_base::showbase) !=0; williamr@2: string_type __buf; williamr@2: back_insert_iterator __stl_out(__buf); williamr@2: // pair __result; williamr@2: williamr@2: for (__i = 0; __i < 4; ++__i) { williamr@2: switch (__format.field[__i]) { williamr@2: case (char) money_base::none: williamr@2: #ifndef __SYMBIAN32__ williamr@2: case (char) money_base::space: williamr@2: #endif williamr@2: williamr@2: if (__i == 3) { williamr@2: //if (__c_type.is(ctype_base::space, *__s)) { //gnu buf fix, 22/12/06 williamr@2: if((__s != __end) && (!__c_type.is(ctype_base::space, *__s)) && (__ps.size()<=1) && (__ns.size()<=1) ){ williamr@2: __err = ios_base::failbit; williamr@2: return __s; williamr@2: } williamr@2: // break; //gnu bug fix 2/1/07 williamr@2: } williamr@2: while (__s != __end && __c_type.is(ctype_base::space, *__s)) williamr@2: ++__s; williamr@2: break; williamr@2: #ifdef __SYMBIAN32__ williamr@2: case (char) money_base::space: williamr@2: if (!__c_type.is(ctype_base::space, *__s)) { williamr@2: #ifdef __SYMBIAN32__ williamr@2: if(!__isSignSympresent) //if no sign symbol present, space is not mandatory. williamr@2: break; williamr@2: #endif williamr@2: __err = ios_base::failbit; williamr@2: return __s; williamr@2: } williamr@2: ++__s; williamr@2: while (__s != __end && __c_type.is(ctype_base::space, *__s)) williamr@2: ++__s; williamr@2: break; williamr@2: #endif williamr@2: case money_base::symbol: { williamr@2: string_type __curs = __intl ? __punct_intl.curr_symbol() williamr@2: : __punct.curr_symbol(); williamr@2: pair williamr@2: __result = __get_string(__s, __end, __curs.begin(), __curs.end()); williamr@2: if (!__result.second && __symbol_required) williamr@2: __err = ios_base::failbit; williamr@2: __s = __result.first; williamr@2: break; williamr@2: } williamr@2: case money_base::sign: { williamr@2: if (__s == __end) { williamr@2: if (__ps.size() == 0) williamr@2: break; williamr@2: if (__ns.size() == 0) { williamr@2: __is_positive = false; williamr@2: __sign = __ns; williamr@2: break; williamr@2: } williamr@2: __err = ios_base::failbit; williamr@2: return __s; williamr@2: } williamr@2: else { williamr@2: if (__ps.size() == 0) { williamr@2: if (__ns.size() == 0) williamr@2: break; williamr@2: if (*__s == __ns[0]) { williamr@2: ++__s; williamr@2: __is_positive = false; williamr@2: __sign = __ns; williamr@2: #ifdef __SYMBIAN32__ williamr@2: __isSignSympresent = true; williamr@2: #endif williamr@2: williamr@2: break; williamr@2: } williamr@2: // __err = ios_base::failbit; //if ps !=0 and ns!=0, and no negative sign mean it is positive, not fail. williamr@2: // return __s; williamr@2: break; williamr@2: } williamr@2: else { williamr@2: if (*__s == __ps[0]) { williamr@2: ++__s; williamr@2: #ifdef __SYMBIAN32__ williamr@2: __isSignSympresent = true; williamr@2: #endif williamr@2: williamr@2: break; williamr@2: } williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (__ns.size() == 0) //here positive have symbol,negative have no symbol williamr@2: { williamr@2: __is_positive = false; // in this case if symbol not present means it is negative williamr@2: __sign = __ns; williamr@2: break; williamr@2: } williamr@2: williamr@2: #else williamr@2: if (__ns.size() == 0) williamr@2: break; williamr@2: #endif williamr@2: if (*__s == __ns[0]) { williamr@2: ++__s; williamr@2: __is_positive = false; williamr@2: __sign = __ns; williamr@2: #ifdef __SYMBIAN32__ williamr@2: __isSignSympresent = true; williamr@2: #endif williamr@2: break; williamr@2: } williamr@2: __err = ios_base::failbit; williamr@2: // return __s; williamr@2: } williamr@2: } williamr@2: return __s; williamr@2: // break; williamr@2: } williamr@2: case money_base::value: { williamr@2: _CharT __point = __intl ? __punct_intl.decimal_point() williamr@2: : __punct.decimal_point(); williamr@2: int __frac_digits = __intl ? __punct_intl.frac_digits() williamr@2: : __punct.frac_digits(); williamr@2: string __grouping = __intl ? __punct_intl.grouping() williamr@2: : __punct.grouping(); williamr@2: bool __syntax_ok = true; williamr@2: williamr@2: bool __result; williamr@2: williamr@2: _CharT __sep = __grouping.size() == 0 ? _CharT() : williamr@2: __intl ? __punct_intl.thousands_sep() : __punct.thousands_sep(); williamr@2: williamr@2: __result = __get_monetary_value(__s, __end, __stl_out, __c_type, williamr@2: __point, __frac_digits, williamr@2: __sep, williamr@2: __grouping, __syntax_ok); williamr@2: williamr@2: if (!__syntax_ok) williamr@2: __err |= ios_base::failbit; williamr@2: if (!__result) { williamr@2: __err = ios_base::failbit; williamr@2: return __s; williamr@2: } williamr@2: break; williamr@2: williamr@2: } // Close money_base::value case williamr@2: williamr@2: williamr@2: } // Close switch statement williamr@2: } // Close for loop williamr@2: williamr@2: #ifndef __SYMBIAN32__ //find the given number pos or neg, required for cases where sign is present at string starting and ending williamr@2: do{ williamr@2: bool type = true; williamr@2: williamr@2: int si = __ps.size(); williamr@2: for (int i = 1;i<__ps.size();i++) williamr@2: { williamr@2: if(__s[i-1]!=__ps[i]) williamr@2: { williamr@2: type = false; williamr@2: break; williamr@2: } williamr@2: } williamr@2: williamr@2: if ((si!=0) && (type ==true)) williamr@2: { williamr@2: __sign = __ps; williamr@2: break; williamr@2: } williamr@2: if (__ns.size() == 0) williamr@2: break; williamr@2: type = true; williamr@2: for (int i =1;i<__ns.size();i++) williamr@2: { williamr@2: if(__s[i-1]!=__ns[i]) williamr@2: { williamr@2: type = false; williamr@2: break; williamr@2: } williamr@2: } williamr@2: if (type ==true) { williamr@2: __is_positive = false; williamr@2: __sign = __ns; williamr@2: break; williamr@2: } williamr@2: }while(0); williamr@2: williamr@2: #endif williamr@2: williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: // Need to get the rest of the sign characters, if they exist. williamr@2: if (__sign.size() > 1) williamr@2: { williamr@2: int __len = __sign.size(); williamr@2: int __i = 1; williamr@2: char_type __c = *__s; williamr@2: char_type __eol = '\0'; williamr@2: for (; __c != __eol && __i < __len; __i++) williamr@2: { williamr@2: if (__s != __end) williamr@2: __c = *(++__s); williamr@2: williamr@2: } williamr@2: //checking sign completely extracted successfully williamr@2: williamr@2: if (__i != __len) williamr@2: __testvalid = false; williamr@2: } williamr@2: williamr@2: #endif williamr@2: williamr@2: if (__is_positive) { williamr@2: if (__ps.size() > 1) { williamr@2: #ifndef __SYMBIAN32__ williamr@2: pair<_InputIter, bool> williamr@2: __result = __get_string(__s, __end, __ps.begin() + 1, __ps.end()); williamr@2: __s = __result.first; williamr@2: if (!__result.second) williamr@2: __err |= ios::failbit; williamr@2: #endif williamr@2: if(!__testvalid) williamr@2: __err |= ios::failbit; williamr@2: } williamr@2: if (!(__err & ios_base::failbit)) williamr@2: __digits = __buf; williamr@2: } williamr@2: else { williamr@2: if (__ns.size() > 1) { williamr@2: #ifndef __SYMBIAN32__ williamr@2: pair<_InputIter, bool> williamr@2: __result = __get_string(__s, __end, __ns.begin() + 1, __ns.end()); williamr@2: __s = __result.first; williamr@2: if (!__result.second) williamr@2: __err |= ios::failbit; williamr@2: #endif williamr@2: if(!__testvalid) williamr@2: __err |= ios::failbit; williamr@2: } williamr@2: if (!(__err & ios::failbit) && (__ns == __sign)) { williamr@2: __buf.insert(__buf.begin(),__c_type.widen('-')); williamr@2: } williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (!(__err & ios_base::failbit)) williamr@2: __digits = __buf; williamr@2: #else williamr@2: __digits = __buf; williamr@2: #endif williamr@2: } williamr@2: if (__s == __end) williamr@2: __err |= ios::eofbit; williamr@2: williamr@2: return __s; williamr@2: } williamr@2: williamr@2: // money_put facets williamr@2: williamr@2: template williamr@2: _OutputIter williamr@2: money_put<_CharT, _OutputIter> williamr@2: ::do_put(_OutputIter __s, bool __intl, ios_base& __str, williamr@2: char_type __fill, williamr@2: const string_type& __digits) const { williamr@2: typedef ctype<_CharT> _Ctype; williamr@2: typedef moneypunct<_CharT, false> _Punct; williamr@2: typedef moneypunct<_CharT, true> _Punct_intl; williamr@2: williamr@2: locale __loc = __str.getloc(); williamr@2: const _Ctype& __c_type = use_facet<_Ctype>(__loc) ; williamr@2: const _Punct& __punct = use_facet<_Punct>(__loc) ; williamr@2: const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ; williamr@2: williamr@2: // some special characters williamr@2: williamr@2: char_type __minus = __c_type.widen('-'); williamr@2: char_type __plus = __c_type.widen('+'); williamr@2: char_type __space = __c_type.widen(' '); williamr@2: char_type __zero = __c_type.widen('0'); williamr@2: char_type __point = __intl ? __c_type.widen(__punct_intl.decimal_point()) williamr@2: : __c_type.widen(__punct.decimal_point()); williamr@2: williamr@2: char_type __sep = __intl ? __punct_intl.thousands_sep() williamr@2: : __punct .thousands_sep(); williamr@2: williamr@2: string __grouping = __intl ? __punct_intl.grouping() williamr@2: : __punct .grouping(); williamr@2: williamr@2: int __frac_digits = __intl ? __punct_intl.frac_digits() williamr@2: : __punct.frac_digits(); williamr@2: williamr@2: string_type __curr_sym = __intl ? __punct_intl.curr_symbol() williamr@2: : __punct.curr_symbol(); williamr@2: williamr@2: // if there are no digits we are going to return __s. If there williamr@2: // are digits, but not enough to fill the frac_digits, we are williamr@2: // going to add zeros. I don't know whether this is right or williamr@2: // not. williamr@2: williamr@2: if (__digits.size() == 0) williamr@2: return __s; williamr@2: williamr@2: typename string_type::const_iterator __digits_first = __digits.begin(); williamr@2: typename string_type::const_iterator __digits_last = __digits.end(); williamr@2: williamr@2: bool __is_negative = *__digits_first == __minus; williamr@2: if (__is_negative) williamr@2: ++__digits_first; williamr@2: williamr@2: string_type __sign = __intl ? williamr@2: __is_negative ? __punct_intl.negative_sign() williamr@2: : __punct_intl.positive_sign() williamr@2: : williamr@2: __is_negative ? __punct.negative_sign() williamr@2: : __punct.positive_sign(); williamr@2: typename string_type::const_iterator __cp = __digits_first; williamr@2: while (__cp != __digits_last && __c_type.is(ctype_base::digit, *__cp)) williamr@2: ++__cp; williamr@2: if (__cp == __digits_first) williamr@2: return __s; williamr@2: __digits_last = __cp; williamr@2: williamr@2: // If grouping is required, we make a copy of __digits and williamr@2: // insert the grouping. williamr@2: williamr@2: // To handle the fractional digits, we augment the first group williamr@2: // by frac_digits. If there is only one group, we need first williamr@2: // to duplicate it. williamr@2: williamr@2: string_type __new_digits(__digits_first, __digits_last); williamr@2: #ifdef __SYMBIAN32__ williamr@2: int __numberofseperators = 0; williamr@2: if (__grouping.size()>0) williamr@2: __numberofseperators = (__new_digits.size()/__grouping[0])+1; williamr@2: else williamr@2: __numberofseperators = 0; williamr@2: __new_digits.resize(__new_digits.size()+__numberofseperators); williamr@2: #endif williamr@2: if (__grouping.size() != 0) { williamr@2: if (__grouping.size() == 1) williamr@2: __grouping.push_back(__grouping[0]); williamr@2: __grouping[0] += __frac_digits; williamr@2: _CharT* __data_ptr = __CONST_CAST(_CharT*,__new_digits.data()); williamr@2: _CharT* __data_end = __data_ptr + __new_digits.size(); williamr@2: williamr@2: williamr@2: ptrdiff_t __value_length = __insert_grouping(__data_ptr, williamr@2: #ifdef __SYMBIAN32__ williamr@2: __data_end-__numberofseperators, williamr@2: #else williamr@2: __data_end, williamr@2: #endif williamr@2: __grouping, williamr@2: __sep, williamr@2: __plus, __minus, 0); williamr@2: __digits_first = __new_digits.begin(); williamr@2: __digits_last = __digits_first + __value_length; williamr@2: } williamr@2: williamr@2: // Determine the amount of padding required, if any. williamr@2: #ifdef __SYMBIAN32__ williamr@2: int __width = __str.width(); //width returns signed value. williamr@2: #else williamr@2: size_t __width = __str.width(); williamr@2: #endif williamr@2: williamr@2: #if defined(_STLP_DEBUG) && (defined(__HP_aCC) || (__HP_aCC <= 1)) williamr@2: size_t __value_length = operator -(__digits_last, __digits_first); williamr@2: #else williamr@2: size_t __value_length = __digits_last - __digits_first; williamr@2: #endif williamr@2: williamr@2: size_t __length = __value_length; williamr@2: williamr@2: __length += __sign.size(); williamr@2: if (__frac_digits != 0) williamr@2: ++__length; williamr@2: williamr@2: bool __generate_curr = (__str.flags() & ios_base::showbase) !=0; williamr@2: if (__generate_curr) williamr@2: __length += __curr_sym.size(); williamr@2: money_base::pattern __format = williamr@2: __intl ? (__is_negative ? __punct_intl.neg_format() williamr@2: : __punct_intl.pos_format()) williamr@2: : (__is_negative ? __punct.neg_format() williamr@2: : __punct.pos_format()); williamr@2: { williamr@2: for (int __i = 0; __i < 4; ++__i) williamr@2: if (__format.field[__i] == (char) money_base::space) williamr@2: ++__length; williamr@2: } williamr@2: williamr@2: size_t __fill_amt = (int)__length < __width ? __width - __length : 0; williamr@2: williamr@2: ios_base::fmtflags __fill_pos = __str.flags() & ios_base::adjustfield; williamr@2: williamr@2: if (__fill_amt != 0 && williamr@2: !(__fill_pos & (ios_base::left | ios_base::internal))) williamr@2: __s = fill_n(__s, __fill_amt, __fill); williamr@2: williamr@2: for (int __i = 0; __i < 4; ++__i) { williamr@2: char __ffield = __format.field[__i]; williamr@2: if (__ffield == money_base::none) { williamr@2: if (__fill_amt != 0 && __fill_pos == ios_base::internal) williamr@2: __s = fill_n(__s, __fill_amt, __fill); williamr@2: } williamr@2: else if (__ffield == money_base::space) { williamr@2: #ifdef __SYMBIAN32__ williamr@2: if(__fill != __space) williamr@2: *__s++ = __fill; williamr@2: else williamr@2: #endif williamr@2: *__s++ = __space; williamr@2: if (__fill_amt != 0 && __fill_pos == ios_base::internal) williamr@2: __s = fill_n(__s, __fill_amt, __fill); williamr@2: } williamr@2: else if (__ffield == money_base::symbol) { williamr@2: if (__generate_curr) williamr@2: __s = copy(__curr_sym.begin(), __curr_sym.end(), __s); williamr@2: } williamr@2: else if (__ffield == money_base::sign) { williamr@2: if (__sign.size() != 0) williamr@2: *__s++ = __sign[0]; williamr@2: } williamr@2: else if (__ffield == money_base::value) { williamr@2: if (__frac_digits == 0) williamr@2: __s = copy(__digits_first, __digits_last, __s); williamr@2: else { williamr@2: if ((int)__value_length <= __frac_digits) { williamr@2: *__s++ = __point; williamr@2: __s = copy(__digits_first, __digits_last, __s); williamr@2: __s = fill_n(__s, __frac_digits - __value_length, __zero); williamr@2: } williamr@2: else { williamr@2: #ifdef __SYMBIAN32__ williamr@2: if (__frac_digits>0) williamr@2: { williamr@2: #endif williamr@2: __s = copy(__digits_first, __digits_last - __frac_digits, __s); williamr@2: if (__frac_digits != 0) { williamr@2: *__s++ = __point; williamr@2: __s = copy(__digits_last - __frac_digits, __digits_last, __s); williamr@2: #ifdef __SYMBIAN32__ williamr@2: } williamr@2: #endif williamr@2: } williamr@2: } williamr@2: } williamr@2: } williamr@2: } // Close for loop williamr@2: williamr@2: // Ouput rest of sign if necessary. williamr@2: williamr@2: if (__sign.size() > 1) williamr@2: __s = copy(__sign.begin() + 1, __sign.end(), __s); williamr@2: if (!(__fill_pos & (ios_base::right | ios_base::internal))) williamr@2: __s = fill_n(__s, __fill_amt, __fill); williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: __str.width(0); williamr@2: #endif williamr@2: return __s; williamr@2: } williamr@2: williamr@2: #ifdef __SYMBIAN32__ williamr@2: /* williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: moneypunct<_CharT, _International>::moneypunct(size_t __refs = 0):_BaseFacet(__refs) williamr@2: { williamr@2: williamr@2: williamr@2: }*/ williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: _CharT moneypunct<_CharT,_International>::do_decimal_point() const williamr@2: { williamr@2: return _CharT('.'); williamr@2: } williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: _CharT moneypunct<_CharT,_International>::do_thousands_sep() const williamr@2: { williamr@2: return _CharT(','); williamr@2: } williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: basic_string<_CharT> moneypunct<_CharT,_International>::do_curr_symbol() const williamr@2: { williamr@2: return _M_currSym; williamr@2: } williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: basic_string<_CharT> moneypunct<_CharT,_International>::do_positive_sign() const williamr@2: { williamr@2: return _M_psign; williamr@2: } williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: basic_string<_CharT> moneypunct<_CharT,_International>::do_negative_sign() const williamr@2: { williamr@2: return _M_nsign; williamr@2: } williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: string moneypunct<_CharT,_International>::do_grouping() const williamr@2: { williamr@2: return _M_group; williamr@2: } williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: money_base::pattern moneypunct<_CharT,_International>::do_pos_format() const williamr@2: { williamr@2: return _M_pos_format; williamr@2: } williamr@2: williamr@2: template//__DFL_NON_TYPE_PARAM(bool, _International, false)> williamr@2: money_base::pattern moneypunct<_CharT,_International>::do_neg_format() const williamr@2: { williamr@2: return _M_neg_format; williamr@2: } williamr@2: williamr@2: template williamr@2: int moneypunct<_CharT,_International>::do_frac_digits() const williamr@2: { williamr@2: return 0; williamr@2: } williamr@2: williamr@2: williamr@2: //monetary_byname williamr@2: williamr@2: template williamr@2: _CharT moneypunct_byname<_CharT, _International>::do_decimal_point() const williamr@2: {return _Locale_mon_decimal_pointE(_M_monetary);} williamr@2: williamr@2: template williamr@2: _CharT moneypunct_byname<_CharT, _International>::do_thousands_sep() const williamr@2: {return _Locale_mon_thousands_sepE(_M_monetary);} williamr@2: williamr@2: template williamr@2: string moneypunct_byname<_CharT, _International>::do_grouping() const williamr@2: {return moneypunct<_CharT,_International>::_M_group;} williamr@2: williamr@2: template williamr@2: basic_string<_CharT> moneypunct_byname<_CharT, _International>::do_curr_symbol() const williamr@2: {return moneypunct<_CharT,_International>::_M_currSym;} williamr@2: williamr@2: template williamr@2: basic_string<_CharT> moneypunct_byname<_CharT, _International>::do_positive_sign() const williamr@2: {return moneypunct<_CharT,_International>::_M_psign;} williamr@2: williamr@2: template williamr@2: basic_string<_CharT> moneypunct_byname<_CharT, _International>::do_negative_sign() const williamr@2: {return moneypunct<_CharT,_International>::_M_nsign;} williamr@2: williamr@2: template williamr@2: int moneypunct_byname<_CharT, _International>::do_frac_digits() const williamr@2: {return _Locale_int_frac_digitsE(_M_monetary);} williamr@2: williamr@2: template williamr@2: void moneypunct_byname<_CharT, _International>::Convert_string2_string_chart(basic_string<_CharT> &dst, string src) williamr@2: { williamr@2: int length = src.length(); williamr@2: const char* str = src.c_str(); williamr@2: for(int i = 0; i williamr@2: moneypunct_byname<_CharT, _International>::moneypunct_byname(const char * name, williamr@2: size_t refs): williamr@2: moneypunct<_CharT, _International>(refs), williamr@2: _M_monetary(__acquire_monetaryE(name)) williamr@2: { williamr@2: if (!_M_monetary) williamr@2: locale::_M_throw_runtime_error(); williamr@2: williamr@2: moneypunct<_CharT,_International>::_M_group = _Locale_mon_groupingE(_M_monetary); williamr@2: Convert_string2_string_chart(moneypunct<_CharT,_International>::_M_psign, _Locale_positive_signE(_M_monetary)); williamr@2: Convert_string2_string_chart(moneypunct<_CharT,_International>::_M_nsign, _Locale_negative_signE(_M_monetary)); williamr@2: Convert_string2_string_chart(moneypunct<_CharT,_International>::_M_currSym, _Locale_int_curr_symbolE(_M_monetary)); williamr@2: } williamr@2: williamr@2: template williamr@2: moneypunct_byname<_CharT, _International>::~moneypunct_byname() williamr@2: { williamr@2: __release_monetaryE(_M_monetary); williamr@2: } williamr@2: williamr@2: williamr@2: #endif williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # endif /* EXPOSE */ williamr@2: williamr@2: #endif /* _STLP_MONETARY_C */