_monetary.c
来自「stl的源码」· C语言 代码 · 共 528 行 · 第 1/2 页
C
528 行
/* * Copyright (c) 1999 * Silicon Graphics Computer Systems, Inc. * * Copyright (c) 1999 * Boris Fomitchev * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */#ifndef _STLP_MONETARY_C#define _STLP_MONETARY_C# ifndef _STLP_INTERNAL_MONETARY_H# include <stl/_monetary.h># endif#ifndef _STLP_INTERNAL_IOS_H# include <stl/_ios.h>#endif#ifndef _STLP_INTERNAL_NUM_PUT_H# include <stl/_num_put.h>#endif#ifndef _STLP_INTERNAL_NUM_GET_H# include <stl/_num_get.h>#endif_STLP_BEGIN_NAMESPACEtemplate <class _CharT, class _InputIterator>locale::id money_get<_CharT, _InputIterator>::id;template <class _CharT, class _OutputIterator>locale::id money_put<_CharT, _OutputIterator>::id;// money_get facets_STLP_MOVE_TO_PRIV_NAMESPACE// helper functions for do_gettemplate <class _InIt1, class _InIt2>pair<_InIt1, bool> __get_string( _InIt1 __first, _InIt1 __last, _InIt2 __str_first, _InIt2 __str_last) { while ( __first != __last && __str_first != __str_last && *__first == *__str_first ) { ++__first; ++__str_first; } return make_pair(__first, __str_first == __str_last);}template <class _InIt, class _OuIt, class _CharT>bool__get_monetary_value(_InIt& __first, _InIt __last, _OuIt __out_ite, const ctype<_CharT>& _c_type, _CharT __point, int __frac_digits, _CharT __sep, const string& __grouping, bool &__syntax_ok) { if (__first == __last || !_c_type.is(ctype_base::digit, *__first)) return false; char __group_sizes[128]; char* __group_sizes_end = __grouping.empty()? 0 : __group_sizes; char __current_group_size = 0; while (__first != __last) { if (_c_type.is(ctype_base::digit, *__first)) { ++__current_group_size; *__out_ite++ = *__first++; } else if (__group_sizes_end) { if (*__first == __sep) { *__group_sizes_end++ = __current_group_size; __current_group_size = 0; ++__first; } else break; } else break; } if (__grouping.empty()) __syntax_ok = true; else { if (__group_sizes_end != __group_sizes) *__group_sizes_end++ = __current_group_size; __syntax_ok = __valid_grouping(__group_sizes, __group_sizes_end, __grouping.data(), __grouping.data()+ __grouping.size()); if (__first == __last || *__first != __point) { for (int __digits = 0; __digits != __frac_digits; ++__digits) *__out_ite++ = _CharT('0'); return true; // OK not to have decimal point } } ++__first; int __digits = 0; while (__first != __last && _c_type.is(ctype_base::digit, *__first)) { *__out_ite++ = *__first++; ++__digits; } __syntax_ok = __syntax_ok && (__digits == __frac_digits); return true;}template <class _CharT, class _InputIter, class _StrType>_InputIter __money_do_get(_InputIter __s, _InputIter __end, bool __intl, ios_base& __str, ios_base::iostate& __err, _StrType& __digits, bool &__is_positive, _CharT* /*__dummy*/) { if (__s == __end) { __err |= ios_base::eofbit; return __s; } typedef _CharT char_type; typedef _StrType string_type; typedef _InputIter iter_type; typedef moneypunct<char_type, false> _Punct; typedef moneypunct<char_type, true> _Punct_intl; typedef ctype<char_type> _Ctype; locale __loc = __str.getloc(); const _Punct& __punct = use_facet<_Punct>(__loc) ; const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ; const _Ctype& __c_type = use_facet<_Ctype>(__loc) ; money_base::pattern __format = __intl ? __punct_intl.neg_format() : __punct.neg_format(); string_type __ns = __intl ? __punct_intl.negative_sign() : __punct.negative_sign(); string_type __ps = __intl ? __punct_intl.positive_sign() : __punct.positive_sign(); int __i; bool __symbol_required = (__str.flags() & ios_base::showbase) != 0; string_type __buf; back_insert_iterator<string_type> __out_ite(__buf); for (__i = 0; __i < 4; ++__i) { switch (__format.field[__i]) { case money_base::space: if (!__c_type.is(ctype_base::space, *__s)) { __err = ios_base::failbit; return __s; } ++__s; case money_base::none: while (__s != __end && __c_type.is(ctype_base::space, *__s)) ++__s; break; case money_base::symbol: { string_type __curs = __intl ? __punct_intl.curr_symbol() : __punct.curr_symbol(); pair<iter_type, bool> __result = __get_string(__s, __end, __curs.begin(), __curs.end()); if (!__result.second && __symbol_required) __err = ios_base::failbit; __s = __result.first; break; } case money_base::sign: { if (__s == __end) { if (__ps.empty()) break; if (__ns.empty()) { __is_positive = false; break; } __err = ios_base::failbit; return __s; } else { if (__ps.empty()) { if (__ns.empty()) break; if (*__s == __ns[0]) { ++__s; __is_positive = false; } break; } else { if (*__s == __ps[0]) { ++__s; break; } if (__ns.empty()) break; if (*__s == __ns[0]) { ++__s; __is_positive = false; break; } __err = ios_base::failbit; } } return __s; } case money_base::value: { char_type __point = __intl ? __punct_intl.decimal_point() : __punct.decimal_point(); int __frac_digits = __intl ? __punct_intl.frac_digits() : __punct.frac_digits(); string __grouping = __intl ? __punct_intl.grouping() : __punct.grouping(); bool __syntax_ok = true; bool __result; char_type __sep = __grouping.empty() ? char_type() : __intl ? __punct_intl.thousands_sep() : __punct.thousands_sep(); __result = __get_monetary_value(__s, __end, __out_ite, __c_type, __point, __frac_digits, __sep, __grouping, __syntax_ok); if (!__syntax_ok) __err |= ios_base::failbit; if (!__result) { __err = ios_base::failbit; return __s; } break; } // Close money_base::value case } // Close switch statement } // Close for loop if (__is_positive) { if (__ps.size() > 1) { pair<_InputIter, bool> __result = __get_string(__s, __end, __ps.begin() + 1, __ps.end()); __s = __result.first; if (!__result.second) __err |= ios::failbit; } if (!(__err & ios_base::failbit)) __digits = __buf; } else { if (__ns.size() > 1) { pair<_InputIter, bool> __result = __get_string(__s, __end, __ns.begin() + 1, __ns.end()); __s = __result.first; if (!__result.second) __err |= ios::failbit; } if (!(__err & ios::failbit)) { __digits = __c_type.widen('-');
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?