📄 xlocnum
字号:
for (; _First != _Last && *_First == _E0;
_Seendigit = true, ++_First)
--_Pten; // just count leading fraction zeros
if (_Pten < 0)
*_Ptr++ = '0', ++_Pten; // put one back
}
for (; _First != _Last
&& _E0 <= *_First && *_First <= _E0 + 9;
_Seendigit = true, ++_First)
if (_Significant < _MAX_SIG_DIG)
{ // save a significant fraction digit
*_Ptr++ = (char)((*_First - _E0) + '0');
++_Significant;
}
if (_Seendigit && _First != _Last
&& (*_First == _MAKLOCCHR(_Elem, 'e', _Cvt)
|| *_First == _MAKLOCCHR(_Elem, 'E', _Cvt)))
{ // 'e' or 'E', collect exponent
*_Ptr++ = 'e', ++_First;
_Seendigit = false, _Significant = 0;
if (_First == _Last)
; // 'e' or 'E' is last element
else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
*_Ptr++ = '+', ++_First; // gather plus sign
else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
*_Ptr++ = '-', ++_First; // gather minus sign
for (; _First != _Last && *_First == _E0; )
_Seendigit = true, ++_First; // strip leading zeros
if (_Seendigit)
*_Ptr++ = '0'; // put one back
for (; _First != _Last
&& _E0 <= *_First && *_First <= _E0 + 9;
_Seendigit = true, ++_First)
if (_Significant < _MAX_EXP_DIG)
{ // save a significant exponent digit
*_Ptr++ = (char)((*_First - _E0) + '0');
++_Significant;
}
}
if (_Bad || !_Seendigit)
_Ptr = _Ac; // roll back pointer to indicate failure
*_Ptr = '\0';
return (_Pten);
}
int __CLRCALL_OR_CDECL _Hexdig(const _Elem _Dig, const _Elem _E0,
const _Elem _Al, const _Elem _Au) const
{ // convert hex digit
if (_E0 <= _Dig && _Dig <= _E0 + 9)
return (_Dig - _E0); // assume 0-9 contiguous (C Standard)
else if (_Al <= _Dig && _Dig <= _Al + 5)
return (_Dig - _Al + 10); // assume a-f contiguous
else if (_Au <= _Dig && _Dig <= _Au + 5)
return (_Dig - _Au + 10); // assume A-F contiguous
else
return (-1);
}
int __CLRCALL_OR_CDECL _Getffldx(char *_Ac,
_InIt& _First, _InIt &_Last,
ios_base& _Iosbase, int *_Phexexp) const
{ // get hex floating-point field from [_First, _Last) into _Ac
const _Mypunct& _Punct_fac = _USE(_Iosbase.getloc(), _Mypunct);
const string _Grouping = _Punct_fac.grouping();
const _Elem _E0 = _MAKLOCCHR(_Elem, '0', _Cvt);
const _Elem _Al = _MAKLOCCHR(_Elem, 'a', _Cvt);
const _Elem _Au = _MAKLOCCHR(_Elem, 'A', _Cvt);
char *_Ptr = _Ac;
bool _Bad = false;
int _Dig;
if (_First == _Last)
; // empty field
else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
*_Ptr++ = '+', ++_First; // gather plus sign
else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
*_Ptr++ = '-', ++_First; // gather minus sign
*_Ptr++ = '0';
*_Ptr++ = 'x';
bool _Seendigit = false; // seen a digit in input
int _Significant = 0; // number of significant digits
int _Phex = 0; // power of 10 multiplier
if (_First == _Last || *_First != _E0)
;
else if (++_First != _Last
&& (*_First == _MAKLOCCHR(_Elem, 'x', _Cvt)
|| *_First == _MAKLOCCHR(_Elem, 'X', _Cvt)))
++_First; // discard any 0x or 0X
else
_Seendigit = true; // '0' not followed by 'x' or 'X'
if (*_Grouping.c_str() == CHAR_MAX || *_Grouping.c_str() <= '\0')
for (; _First != _Last
&& 0 <= (_Dig = _Hexdig(*_First, _E0, _Al, _Au));
_Seendigit = true, ++_First)
if (_MAX_SIG_DIG <= _Significant)
++_Phex; // just scale by 10
else if (*_First == _E0 && _Significant == 0)
; // drop leading zeros
else
{ // save a significant digit
*_Ptr++ = "0123456789abcdef"[_Dig];
++_Significant;
}
else
{ // grouping specified, gather digits and group sizes
const _Elem _Kseparator = _Grouping.size() == 0
? (_Elem)0 : _Punct_fac.thousands_sep();
string _Groups((size_t)1, '\0');
size_t _Group = 0;
for (; _First != _Last; ++_First)
if (0 <= (_Dig = _Hexdig(*_First, _E0, _Al, _Au)))
{ // got a digit, add to group size
_Seendigit = true;
if (_MAX_SIG_DIG <= _Significant)
++_Phex; // just scale by 10
else if (*_First == _E0 && _Significant == 0)
; // drop leading zeros
else
{ // save a significant digit
*_Ptr++ = "0123456789abcdef"[_Dig];
++_Significant;
}
if (_Groups[_Group] != CHAR_MAX)
++_Groups[_Group];
}
else if (_Groups[_Group] == '\0'
|| _Kseparator == (_Elem)0
|| *_First != _Kseparator)
break; // not a group separator, done
else
{ // add a new group to _Groups string
_Groups.append((size_t)1, '\0');
++_Group;
}
if (_Group == 0)
; // no thousands separators seen
else if ('\0' < _Groups[_Group])
++_Group; // add trailing group to group count
else
_Bad = true; // trailing separator, fail
for (const char *_Pg = _Grouping.c_str();
!_Bad && 0 < _Group; )
if (*_Pg == CHAR_MAX)
break; // end of grouping constraints to check
else if (0 < --_Group && *_Pg != _Groups[_Group]
|| 0 == _Group && *_Pg < _Groups[_Group])
_Bad = true; // bad group size, fail
else if ('\0' < _Pg[1])
++_Pg; // group size okay, advance to next test
}
if (_Seendigit && _Significant == 0)
*_Ptr++ = '0'; // save at least one leading digit
if (_First != _Last && *_First == _Punct_fac.decimal_point())
*_Ptr++ = localeconv()->decimal_point[0], ++_First; // add .
if (_Significant == 0)
{ // 0000. so far
for (; _First != _Last && *_First == _E0;
_Seendigit = true, ++_First)
--_Phex; // just count leading fraction zeros
if (_Phex < 0)
*_Ptr++ = '0', ++_Phex; // put one back
}
for (; _First != _Last
&& 0 <= (_Dig = _Hexdig(*_First, _E0, _Al, _Au));
_Seendigit = true, ++_First)
if (_Significant < _MAX_SIG_DIG)
{ // save a significant fraction digit
*_Ptr++ = "0123456789abcdef"[_Dig];
++_Significant;
}
if (_Seendigit && _First != _Last
&& (*_First == _MAKLOCCHR(_Elem, 'p', _Cvt)
|| *_First == _MAKLOCCHR(_Elem, 'P', _Cvt)))
{ // 'p' or 'P', collect exponent
*_Ptr++ = 'p', ++_First;
_Seendigit = false, _Significant = 0;
if (_First == _Last)
; // 'p' or 'P' is last element
else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
*_Ptr++ = '+', ++_First; // gather plus sign
else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
*_Ptr++ = '-', ++_First; // gather minus sign
for (; _First != _Last && *_First == _E0; )
_Seendigit = true, ++_First; // strip leading zeros
if (_Seendigit)
*_Ptr++ = '0'; // put one back
for (; _First != _Last
&& _E0 <= *_First && *_First <= _E0 + 9;
_Seendigit = true, ++_First)
if (_Significant < _MAX_EXP_DIG)
{ // save a significant exponent digit
*_Ptr++ = (char)((*_First - _E0) + '0');
++_Significant;
}
}
if (_Bad || !_Seendigit)
_Ptr = _Ac; // roll back pointer to indicate failure
*_Ptr = '\0';
*_Phexexp = _Phex; // power of 16 multiplier
return (0); // power of 10 multiplier
}
};
// STATIC num_get::id OBJECT
template<class _Elem,
class _InIt>
__PURE_APPDOMAIN_GLOBAL locale::id num_get<_Elem, _InIt>::id;
// TEMPLATE CLASS num_put
template<class _Elem,
class _OutIt = ostreambuf_iterator<_Elem, char_traits<_Elem> > >
class num_put
: public locale::facet
{ // facet for converting encoded numbers to text
public:
typedef numpunct<_Elem> _Mypunct;
typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
_Mystr;
static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
const locale *_Ploc = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT num_put<_Elem, _OutIt>(
_Locinfo(_Ploc->c_str()));
return (_X_NUMERIC);
}
__PURE_APPDOMAIN_GLOBAL static locale::id id; // unique facet id
protected:
virtual __CLR_OR_THIS_CALL ~num_put()
{ // destroy the object
}
void __CLR_OR_THIS_CALL _Init(const _Locinfo& _Lobj)
{ // initialize from _Locinfo object
_Cvt = _Lobj._Getcvt();
}
_Locinfo::_Cvtvec _Cvt; // conversion information
public:
explicit __CLR_OR_THIS_CALL num_put(size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from current locale
_BEGIN_LOCINFO(_Lobj)
_Init(_Lobj);
_END_LOCINFO()
}
__CLR_OR_THIS_CALL num_put(const _Locinfo& _Lobj, size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from specified locale
_Init(_Lobj);
}
typedef _Elem char_type;
typedef _OutIt iter_type;
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, _Bool _Val) const
{ // put formatted bool to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, long _Val) const
{ // put formatted long to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, unsigned long _Val) const
{ // put formatted unsigned long to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
#ifdef _LONGLONG
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, _LONGLONG _Val) const
{ // put formatted long long to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, _ULONGLONG _Val) const
{ // put formatted unsigned long long to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
#endif /* _LONGLONG */
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, double _Val) const
{ // put formatted double to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, long double _Val) const
{ // put formatted long double to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
_OutIt __CLR_OR_THIS_CALL put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, const void *_Val) const
{ // put formatted void pointer to _Dest
return (do_put(_Dest, _Iosbase, _Fill, _Val));
}
protected:
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, _Bool _Val) const
{ // put formatted bool to _Dest
_DEBUG_POINTER(_Dest);
if (!(_Iosbase.flags() & ios_base::boolalpha))
return (do_put(_Dest, _Iosbase, _Fill, (long)_Val));
else
{ // put "false" or "true"
const _Mypunct& _Punct_fac = _USE(_Iosbase.getloc(), _Mypunct);
_Mystr _Str;
if (_Val)
_Str.assign(_Punct_fac.truename());
else
_Str.assign(_Punct_fac.falsename());
size_t _Fillcount = _Iosbase.width() <= 0
|| (size_t)_Iosbase.width() <= _Str.size()
? 0 : (size_t)_Iosbase.width() - _Str.size();
if ((_Iosbase.flags() & ios_base::adjustfield) != ios_base::left)
{ // put leading fill
_Dest = _Rep(_Dest, _Fill, _Fillcount);
_Fillcount = 0;
}
_Dest = _Put(_Dest, _Str.c_str(), _Str.size()); // put field
_Iosbase.width(0);
return (_Rep(_Dest, _Fill, _Fillcount)); // put trailing fill
}
}
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, long _Val) const
{ // put formatted long to _Dest
char _Buf[2 * _MAX_INT_DIG], _Fmt[6];
return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
_CSTD sprintf_s(_Buf, sizeof (_Buf), _Ifmt(_Fmt, "ld",
_Iosbase.flags()), _Val)));
}
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, unsigned long _Val) const
{ // put formatted unsigned long to _Dest
char _Buf[2 * _MAX_INT_DIG], _Fmt[6];
return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
_CSTD sprintf_s(_Buf, sizeof (_Buf), _Ifmt(_Fmt, "lu",
_Iosbase.flags()), _Val)));
}
#ifdef _LONGLONG
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, _LONGLONG _Val) const
{ // put formatted long long to _Dest
char _Buf[2 * _MAX_INT_DIG], _Fmt[8];
return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
_CSTD sprintf_s(_Buf, sizeof (_Buf), _Ifmt(_Fmt, "Ld",
_Iosbase.flags()), _Val)));
}
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, _ULONGLONG _Val) const
{ // put formatted unsigned long long to _Dest
char _Buf[2 * _MAX_INT_DIG], _Fmt[8];
return (_Iput(_Dest, _Iosbase, _Fill, _Buf,
_CSTD sprintf_s(_Buf, sizeof (_Buf), _Ifmt(_Fmt, "Lu",
_Iosbase.flags()), _Val)));
}
#endif /* _LONGLONG */
virtual _OutIt __CLR_OR_THIS_CALL do_put(_OutIt _Dest,
ios_base& _Iosbase, _Elem _Fill, double _Val) const
{ // put formatted double to _Dest
char _Buf[_MAX_EXP_DIG + _MAX_SIG_DIG + 64], _Fmt[8];
streamsize _Precision = _Iosbase.precision() <= 0
&& !(_Iosbase.flags() & ios_base::fixed)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -