📄 facets_byname.cpp
字号:
codecvt_byname<wchar_t, char, mbstate_t>::do_length(const state_type&,
const extern_type* from, const extern_type* end,
size_t mx) const
{ return (int)(min) ((size_t) (end - from), mx); }
int
codecvt_byname<wchar_t, char, mbstate_t>::do_max_length() const _STLP_NOTHROW
{ return _Locale_mb_cur_max(_M_ctype); }
# endif
_STLP_END_NAMESPACE
#endif /* MBSTATE_T */
_STLP_BEGIN_NAMESPACE
// numpunct_byname<char>
numpunct_byname<char>::numpunct_byname(const char* name, size_t refs, _Locale_name_hint* hint)
: numpunct<char>(refs),
_M_numeric(_STLP_PRIV __acquire_numeric(name, hint)) {
if (!_M_numeric)
locale::_M_throw_runtime_error();
_M_truename = _Locale_true(_M_numeric);
_M_falsename = _Locale_false(_M_numeric);
}
numpunct_byname<char>::~numpunct_byname()
{ _STLP_PRIV __release_numeric(_M_numeric); }
char numpunct_byname<char>::do_decimal_point() const
{ return _Locale_decimal_point(_M_numeric); }
char numpunct_byname<char>::do_thousands_sep() const
{ return _Locale_thousands_sep(_M_numeric); }
string numpunct_byname<char>::do_grouping() const {
const char * __grouping = _Locale_grouping(_M_numeric);
if (__grouping != NULL && __grouping[0] == CHAR_MAX)
__grouping = "";
return __grouping;
}
//----------------------------------------------------------------------
// numpunct<wchar_t>
#if !defined (_STLP_NO_WCHAR_T)
// numpunct_byname<wchar_t>
numpunct_byname<wchar_t>::numpunct_byname(const char* name, size_t refs, _Locale_name_hint* hint)
: numpunct<wchar_t>(refs),
_M_numeric(_STLP_PRIV __acquire_numeric(name, hint)) {
if (!_M_numeric)
locale::_M_throw_runtime_error();
const char* truename = _Locale_true(_M_numeric);
const char* falsename = _Locale_false(_M_numeric);
_M_truename.resize(strlen(truename));
_M_falsename.resize(strlen(falsename));
copy(truename, truename + strlen(truename), _M_truename.begin());
copy(falsename, falsename + strlen(falsename), _M_falsename.begin());
}
numpunct_byname<wchar_t>::~numpunct_byname()
{ _STLP_PRIV __release_numeric(_M_numeric); }
wchar_t numpunct_byname<wchar_t>::do_decimal_point() const
{ return (wchar_t) _Locale_decimal_point(_M_numeric); }
wchar_t numpunct_byname<wchar_t>::do_thousands_sep() const
{ return (wchar_t) _Locale_thousands_sep(_M_numeric); }
string numpunct_byname<wchar_t>::do_grouping() const {
const char * __grouping = _Locale_grouping(_M_numeric);
if (__grouping != NULL && __grouping[0] == CHAR_MAX)
__grouping = "";
return __grouping;
}
#endif
_STLP_MOVE_TO_PRIV_NAMESPACE
static void _Init_monetary_formats(money_base::pattern& pos_format,
money_base::pattern& neg_format,
_Locale_monetary * monetary) {
switch (_Locale_p_sign_posn(monetary)) {
case 0: // Parentheses surround the quantity and currency_symbol
case 1: // The sign string precedes the quantity and currency_symbol
pos_format.field[0] = (char) money_base::sign;
if (_Locale_p_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a positive value
pos_format.field[1] = (char) money_base::symbol;
if (_Locale_p_sep_by_space(monetary)) {
// a space separates currency_symbol from a positive value.
pos_format.field[2] = (char) money_base::space;
pos_format.field[3] = (char) money_base::value;
} else {
// a space not separates currency_symbol from a positive value.
pos_format.field[2] = (char) money_base::value;
pos_format.field[3] = (char) money_base::none;
}
} else {
// 0 if currency_symbol succeeds a positive value
pos_format.field[1] = (char) money_base::value;
if (_Locale_p_sep_by_space(monetary)) {
// a space separates currency_symbol from a positive value.
pos_format.field[2] = (char) money_base::space;
pos_format.field[3] = (char) money_base::symbol;
} else {
// a space not separates currency_symbol from a positive value.
pos_format.field[2] = (char) money_base::symbol;
pos_format.field[3] = (char) money_base::none;
}
}
break;
case 2: // The sign string succeeds the quantity and currency_symbol.
if (_Locale_p_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a positive value
pos_format.field[0] = (char) money_base::symbol;
if (_Locale_p_sep_by_space(monetary)) {
// a space separates currency_symbol from a positive value.
pos_format.field[1] = (char) money_base::space;
pos_format.field[2] = (char) money_base::value;
pos_format.field[3] = (char) money_base::sign;
} else {
// a space not separates currency_symbol from a positive value.
pos_format.field[1] = (char) money_base::value;
pos_format.field[2] = (char) money_base::sign;
pos_format.field[3] = (char) money_base::none;
}
} else {
// 0 if currency_symbol succeeds a positive value
pos_format.field[0] = (char) money_base::value;
if (_Locale_p_sep_by_space(monetary)) {
// a space separates currency_symbol from a positive value.
pos_format.field[1] = (char) money_base::space;
pos_format.field[2] = (char) money_base::symbol;
pos_format.field[3] = (char) money_base::sign;
} else {
// a space not separates currency_symbol from a positive value.
pos_format.field[1] = (char) money_base::symbol;
pos_format.field[2] = (char) money_base::sign;
pos_format.field[3] = (char) money_base::none;
}
}
break;
case 3: // The sign string immediately precedes the currency_symbol.
if (_Locale_p_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a positive value
pos_format.field[0] = (char) money_base::sign;
pos_format.field[1] = (char) money_base::symbol;
if (_Locale_p_sep_by_space(monetary)) {
// a space separates currency_symbol from a positive value.
pos_format.field[2] = (char) money_base::space;
pos_format.field[3] = (char) money_base::value;
} else {
// a space not separates currency_symbol from a positive value.
pos_format.field[2] = (char) money_base::value;
pos_format.field[3] = (char) money_base::none;
}
} else {
// 0 if currency_symbol succeeds a positive value
pos_format.field[0] = (char) money_base::value;
pos_format.field[1] = (char) money_base::sign;
pos_format.field[2] = (char) money_base::symbol;
pos_format.field[3] = (char) money_base::none;
}
break;
case 4: // The sign string immediately succeeds the currency_symbol.
default:
if (_Locale_p_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a positive value
pos_format.field[0] = (char) money_base::symbol;
pos_format.field[1] = (char) money_base::sign;
pos_format.field[2] = (char) money_base::value;
pos_format.field[3] = (char) money_base::none;
} else {
// 0 if currency_symbol succeeds a positive value
pos_format.field[0] = (char) money_base::value;
if (_Locale_p_sep_by_space(monetary)) {
// a space separates currency_symbol from a positive value.
pos_format.field[1] = (char) money_base::space;
pos_format.field[2] = (char) money_base::symbol;
pos_format.field[3] = (char) money_base::sign;
} else {
// a space not separates currency_symbol from a positive value.
pos_format.field[1] = (char) money_base::symbol;
pos_format.field[2] = (char) money_base::sign;
pos_format.field[3] = (char) money_base::none;
}
}
break;
}
switch (_Locale_n_sign_posn(monetary)) {
case 0: // Parentheses surround the quantity and currency_symbol
case 1: // The sign string precedes the quantity and currency_symbol
neg_format.field[0] = (char) money_base::sign;
if (_Locale_n_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a negative value
neg_format.field[1] = (char) money_base::symbol;
if (_Locale_n_sep_by_space(monetary)) {
// a space separates currency_symbol from a negative value.
neg_format.field[2] = (char) money_base::space;
neg_format.field[3] = (char) money_base::value;
} else {
// a space not separates currency_symbol from a negative value.
neg_format.field[2] = (char) money_base::value;
neg_format.field[3] = (char) money_base::none;
}
} else {
// 0 if currency_symbol succeeds a negative value
neg_format.field[1] = (char) money_base::value;
if (_Locale_n_sep_by_space(monetary)) {
// a space separates currency_symbol from a negative value.
neg_format.field[2] = (char) money_base::space;
neg_format.field[3] = (char) money_base::symbol;
} else {
// a space not separates currency_symbol from a negative value.
neg_format.field[2] = (char) money_base::symbol;
neg_format.field[3] = (char) money_base::none;
}
}
break;
case 2: // The sign string succeeds the quantity and currency_symbol.
if (_Locale_n_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a negative value
neg_format.field[0] = (char) money_base::symbol;
if (_Locale_n_sep_by_space(monetary)) {
// a space separates currency_symbol from a negative value.
neg_format.field[1] = (char) money_base::space;
neg_format.field[2] = (char) money_base::value;
neg_format.field[3] = (char) money_base::sign;
} else {
// a space not separates currency_symbol from a negative value.
neg_format.field[1] = (char) money_base::value;
neg_format.field[2] = (char) money_base::sign;
neg_format.field[3] = (char) money_base::none;
}
} else {
// 0 if currency_symbol succeeds a negative value
neg_format.field[0] = (char) money_base::value;
if (_Locale_n_sep_by_space(monetary)) {
// a space separates currency_symbol from a negative value.
neg_format.field[1] = (char) money_base::space;
neg_format.field[2] = (char) money_base::symbol;
neg_format.field[3] = (char) money_base::sign;
} else {
// a space not separates currency_symbol from a negative value.
neg_format.field[1] = (char) money_base::symbol;
neg_format.field[2] = (char) money_base::sign;
neg_format.field[3] = (char) money_base::none;
}
}
break;
case 3: // The sign string immediately precedes the currency_symbol.
if (_Locale_n_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a negative value
neg_format.field[0] = (char) money_base::sign;
neg_format.field[1] = (char) money_base::symbol;
if (_Locale_n_sep_by_space(monetary)) {
// a space separates currency_symbol from a negative value.
neg_format.field[2] = (char) money_base::space;
neg_format.field[3] = (char) money_base::value;
} else {
// a space not separates currency_symbol from a negative value.
neg_format.field[2] = (char) money_base::value;
neg_format.field[3] = (char) money_base::none;
}
} else {
// 0 if currency_symbol succeeds a negative value
neg_format.field[0] = (char) money_base::value;
neg_format.field[1] = (char) money_base::sign;
neg_format.field[2] = (char) money_base::symbol;
neg_format.field[3] = (char) money_base::none;
}
break;
case 4: // The sign string immediately succeeds the currency_symbol.
default:
if (_Locale_n_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a negative value
neg_format.field[0] = (char) money_base::symbol;
neg_format.field[1] = (char) money_base::sign;
neg_format.field[2] = (char) money_base::value;
neg_format.field[3] = (char) money_base::none;
} else {
// 0 if currency_symbol succeeds a negative value
neg_format.field[0] = (char) money_base::value;
if (_Locale_n_sep_by_space(monetary)) {
// a space separates currency_symbol from a negative value.
neg_format.field[1] = (char) money_base::space;
neg_format.field[2] = (char) money_base::symbol;
neg_format.field[3] = (char) money_base::sign;
} else {
// a space not separates currency_symbol from a negative value.
neg_format.field[1] = (char) money_base::symbol;
neg_format.field[2] = (char) money_base::sign;
neg_format.field[3] = (char) money_base::none;
}
}
break;
}
}
// international variant of monetary
/*
* int_curr_symbol
*
* The international currency symbol. The operand is a four-character
* string, with the first three characters containing the alphabetic
* international currency symbol in accordance with those specified
* in the ISO 4217 specification. The fourth character is the character used
* to separate the international currency symbol from the monetary quantity.
*
* (http://www.opengroup.org/onlinepubs/7990989775/xbd/locale.html)
*/
/*
* Standards are unclear in the usage of international currency
* and monetary formats.
* But I am expect that international currency symbol should be the first
* (not depends upon where currency symbol situated in the national
* format).
*
* If this isn't so, let's see:
* 1 234.56 RUR
* GBP 1,234.56
* USD 1,234.56
* The situation really is worse than you see above:
* RUR typed wrong here---it prints '1 234.56 RUR ' (see space after RUR).
* This is due to intl_fmp.curr_symbol() == "RUR ". (see reference in comments
* above).
*
*/
static void _Init_monetary_formats_int(money_base::pattern& pos_format,
money_base::pattern& neg_format,
_Locale_monetary * monetary)
{
pos_format.field[0] = (char) money_base::symbol;
// pos_format.field[1] = (char) money_base::space;
switch (_Locale_p_sign_posn(monetary)) {
case 0: // Parentheses surround the quantity and currency_symbol
case 1: // The sign string precedes the quantity and currency_symbol
pos_format.field[1] = (char) money_base::sign;
pos_format.field[2] = (char) money_base::value;
break;
case 2: // The sign string succeeds the quantity and currency_symbol.
pos_format.field[1] = (char) money_base::value;
pos_format.field[2] = (char) money_base::sign;
break;
case 3: // The sign string immediately precedes the currency_symbol.
case 4: // The sign string immediately succeeds the currency_symbol.
default:
if (_Locale_p_cs_precedes(monetary)) {
// 1 if currency_symbol precedes a positive value
pos_format.field[1] = (char) money_base::sign;
pos_format.field[2] = (char) money_base::value;
} else {
// 0 if currency_symbol succeeds a positive value
pos_format.field[1] = (char) money_base::value;
pos_format.field[2] = (char) money_base::sign;
}
break;
}
pos_format.field[3] = (char) money_base::none;
neg_format.field[0] = (char) money_base::symbol;
// neg_format.field[1] = (char) money_base::space;
switch (_Locale_n_sign_posn(monetary)) {
case 0: // Parentheses surround the quantity and currency_symbol
case 1: // The sign string precedes the quantity and currency_symbol
neg_format.field[1] = (char) money_base::sign;
neg_format.field[2] = (char) money_base::value;
break;
case 2: // The sign string succeeds the quantity and currency_symbol.
neg_format.field[1] = (char) money_base::value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -