13.34 <locale>
The <locale> header declares class and function
templates for internationalization and localization. It supports
conversion between narrow and wide character sets, character
classification and collation, formatting and parsing numbers,
currency, dates and times, and retrieving messages. For example,
every I/O stream has a locale, which it uses to parse formatted input
or to format output.
A locale is an embodiment of a set of cultural
conventions, including information about the native character set,
how dates are formatted, which symbol to use for currency, and so on.
Each set of related attributes is called a
facet, which are grouped into categories.
The categories are fixed and defined by the standard (see Table 13-20, under locale::category,
for a complete list), and each category has several predefined
facets. For example, one of the facets in the time category is
time_get<charT,
InputIter>, which specifies rules for parsing a
time string. You can define additional facets; see the description of
the locale::facet class in this section for
details.
Many of the facets come in two flavors: plain and named. The plain
versions implement default behavior, and the named versions implement
the behavior for a named locale. See the locale
class later in this section for a discussion of locale names.
When a program starts, the global locale is initialized to the
"C" locale, and the standard I/O streams use this
locale for character conversions and formatting. A program can change
the locale at any time; see the locale class in
this section for details.
The C++ <locale> header provides more
functionality than the C <clocale>,
<cctype>, and
<cwchar> headers, especially the ability to
extend a locale with your own facets. On the other hand, facets and
the locale class template are more complicated than the C functions.
For simple character classification in a single locale, you are
probably better off using the C functions. If a program must work
with multiple locales simultaneously, use the C++
locale template.
codecvt class template |
Facet for mapping one character set to another
|
template <typename internT,typename externT,typename stateT>
class codecvt : public locale::facet, public codecvt_base
{
public:
typedef internT intern_type;
typedef externT extern_type;
typedef stateT state_type;
explicit codecvt(size_t refs = 0);
result out(stateT& state, const internT* from, const internT* from_end,
const internT*& from_next, externT* to, externT* to_limit,
externT*& to_next) const;
result unshift(stateT& state, externT* to, externT* to_limit,
externT*& to_next) const;
result in(stateT& state, const externT* from, const externT* from_end,
const externT*& from_next, internT* to, internT* to_limit,
internT*& to_next) const;
int encoding( ) const throw( );
bool always_noconv( ) const throw( );
int length(stateT&, const externT* from, const externT* end, size_t max)
const;
int max_length( ) const throw( );
static locale::id id;
protected:
virtual ~codecvt( );
virtual result do_out(stateT& state, const internT* from,
const internT* from_end, const internT*& from_next,
externT* to, externT* to_limit, externT*& to_next)
const;
virtual result do_in(stateT& state, const externT* from,
const externT* from_end, const externT*& from_next,
internT* to, internT* to_limit, internT*& to_next)
const;
virtual result do_unshift(stateT& state, externT* to, externT* to_limit,
externT*& to_next) const;
virtual int do_encoding( ) const throw( );
virtual bool do_always_noconv( ) const throw( );
virtual int do_length(stateT&, const externT* from, const externT* end,
size_t max) const;
virtual int do_max_length( ) const throw( );
};
|
|
The codecvt template converts characters from one
character encoding to another. It is most often used to convert
multibyte characters to and from wide characters.
The following template specializations are required by the standard:
- codecvt<wchar_t, char, mbstate_t>
-
Converts multibyte narrow characters to wide characters
(in) and wide to multibyte
(out)
- codecvt<char, char, mbstate_t>
-
A no-op, "converting" characters to
themselves
As with other facets, the public members of
codecvt call virtual, protected members with the
same name prefaced by do_. Thus, to use the facet,
call the public functions, such as in and
out, which in turn call do_in
and do_out. The descriptions below are for the
virtual functions because they do the real work. Imagine that for
each virtual function description, there is a corresponding
description for a public, nonvirtual function, such as:
- bool always_noconv( ) const throw( )
-
Returns do_always_noconv( )
The following are the virtual, protected members of
codecvt:
- virtual bool do_always_noconv( ) const throw( )
-
Returns true if the codecvt
object does not actually perform any conversions, that is,
in and out are no-ops. For
example, for the specialization
codecvt<char,char,mbstate_t>,
do_always_noconv always returns
true.
- virtual int do_encoding( ) const throw( )
-
Returns the number of externT characters needed to
represent a single internT character. If this
number is not a fixed constant, the return value is
0. The return value is -1 if
externT character sequences are not
state-dependent.
- virtual result do_in(stateT& state, const externT* from, const externT* from_end, const externT*& from_next, internT* to, internT* to_limit, internT*& to_next) const
-
Converts externT characters to
internT characters. The characters in the
range [from,
from_end) are converted and stored in the array
starting at to. The number of characters converted
is the minimum of from_end -
from and to_limit -
to.
The from_next parameter is set to point to the
value in [from, from_end) where
the conversion stopped, and to_next points to the
value in [to, to_limit) where
the conversion stopped. If no conversion was performed,
from_next is the same as from,
and to_next is equal to to.
The return value is a result, as described in
Table 13-19 (under the
codecvt_base class).
- virtual int do_length(stateT&, const externT* from, const externT* from_end, size_t max) const
-
Returns the number of externT characters in the
range [from, from_end) that are
used to convert to internT characters. At most,
max internT characters are
converted.
- virtual int do_max_length( ) const throw( )
-
Returns the maximum number of externT characters
needed to represent a single internT character,
that is, the maximum value that do_length can
return when max is 1.
- virtual result do_out(stateT& state, const internT* from, const internT* from_end, const internT*& from_next, externT* to, externT* to_limit, externT*& to_next) const
-
Converts internT characters to
externT characters. The characters in the
range [from,
from_end) are converted and stored in the array
starting at to. The number of characters converted
is the minimum of from_end -
from and to_limit -
to.
The from_next parameter is set to point to the
value in [from, from_end) where
the conversion stopped, and to_next points to the
value in [to, to_limit) where
the conversion stopped. If no conversion was performed,
from_next is the same as from,
and to_next is equal to to.
The return value is a result, as described in
Table 13-19 (under codecvt_base
class).
- virtual result do_unshift(stateT& state, externT* to, externT* to_limit, externT*& to_next) const
-
Ends a shift state by storing characters in the array starting at
to such that the characters undo the state shift
given by state. Up to to_limit
- to characters are written, and
to_next is set to point to one past the last
character written into to.
The return value is a result, as described in
Table 13-19 (under codecvt_base
class).
See Also
codecvt_base class,
codecvt_byname class template,
locale::facet class
codecvt_base class |
Base class for the codecvt template
|
class codecvt_base {
public:
enum result { ok, partial, error, noconv };
};
|
|
The codecvt_base class is the base class for the
codecvt and codecvt_byname
class templates. It declares the result type,
which is the type returned by the do_in and
do_out conversion functions. Table 13-19 lists the literals of the
result enumerated type.
Table 13-19. codecvt_base::result literals
error
|
Error in conversion (e.g., invalid state or multibyte character
sequence)
|
noconv
|
No conversion (or unshift terminated) needed
|
ok
|
Conversion finished successfully
|
partial
|
Not all source characters converted, or unshift
sequence is incomplete
|
See Also
codecvt class template,
codecvt_byname class template
codecvt_byname class template |
Facet for mapping one character set to another
|
template<typename internT, typename externT, typename stateT>
class codecvt_byname :
public codecvt<internT, externT, stateT>
{
public:
explicit codecvt_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in codecvt
};
|
|
The codecvt_byname class template converts
characters from one character encoding to another using the rules of
a named locale. The
codecvt_byname<char,char,mbstate_t> and
codecvt_byname<wchar_t,char,mbstate_t>
instantiations are standard.
See Also
codecvt class template,
locale::facet class
collate class template |
Facet for comparing strings in collation order
|
template <typename charT>
class collate : public locale::facet
{
public:
typedef charT char_type;
typedef basic_string<charT> string_type;
explicit collate(size_t refs = 0);
int compare(const charT* low1, const charT* high1, const charT* low2,
const charT* high2) const;
string_type transform(const charT* low, const charT* high) const;
long hash(const charT* low, const charT* high) const;
static locale::id id;
protected:
virtual ~collate( );
virtual int do_compare(const charT* low1, const charT* high1,
const charT* low2, const charT* high2) const;
virtual string_type do_transform (const charT* low, const charT* high) const;
virtual long do_hash (const charT* low, const charT* high) const;
};
|
|
The collate class template is a facet used to
compare strings. In some locales, the collation order of characters
is not the same as the numerical order of their encodings, and some
characters might be logically equivalent even if they have different
encodings.
You can use a locale object as a comparator for
algorithms that need a comparison function; the
locale's operator(
) function uses the
collate facet to perform the comparison.
The standard mandates the collate<char> and
collate<wchar_t> instantiations, which
perform lexicographical (element-wise, numerical) comparison. See
lexicographical_compare in
<algorithm> earlier in this chapter.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
compare, which calls
do_compare. The descriptions below are for the
virtual functions because they do the real work. Imagine that for
each virtual function description, there is a corresponding
description for a public, nonvirtual function, such as:
- int compare(const charT* low1, const charT* high1, const charT* low2, const charT* high2) const
-
Returns do_compare(low1, high1,
low2, high2)
The following are the virtual, protected members of
collate:
- virtual int do_compare(const charT* low1, const charT* high1, const charT* low2, const charT* high2) const
-
Compares the character sequences [low1,
high1) with the character sequence
[low2, high2). The return value
is one of the following:
-1 if sequence 1 is less than sequence 2
0 if the sequences are equal
1 if sequence 1 is greater than sequence 2
- virtual long do_hash (const charT* low, const charT* high) const
-
Returns a hash value for the character sequence
[low, high). If
do_compare returns 0 for two
character sequences, do_hash returns the same
value for the two sequences. The reverse is not necessarily the case.
- virtual string_type do_transform(const charT* low, const charT* high) const
-
Transforms the character sequence [low,
high) into a string that can be compared (as a
simple lexicographical comparison) with another transformed string to
obtain the same result as calling do_compare on
the original character sequences. The do_transform
function is useful if a program needs to compare the same character
sequence many times.
See Also
collate_byname class template,
locale class, locale::facet
class
collate_byname class template |
Facet for comparing strings in collation order
|
template <typename charT>
class collate_byname : public collate<charT>
{
public:
typedef basic_string<charT> string_type;
explicit collate_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in collate
};
|
|
Compares strings using a named locale's collation
order. The collate_byname<char> and
collate_byname<wchar_t> instantiations are
standard.
See Also
collate class template,
locale::facet class
ctype class template |
Facet for classifying characters
|
class ctype : public locale::facet, public ctype_base
{
public:
typedef charT char_type;
explicit ctype(size_t refs = 0);
bool is(mask m, charT c) const;
const charT* is(const charT* low, const charT* high, mask* vec) const;
const charT* scan_is(mask m, const charT* low, const charT* high) const;
const charT* scan_not(mask m, const charT* low, const charT* high) const;
charT toupper(charT c) const;
const charT* toupper(charT* low, const charT* high) const;
charT tolower(charT c) const;
const charT* tolower(charT* low, const charT* high) const;
charT widen(char c) const;
const char* widen(const char* low, const char* high, charT* to) const;
char narrow(charT c, char dfault) const;
const charT* narrow(const charT* low, const charT*, char dfault, char* to)
const;
static locale::id id;
protected:
virtual ~ctype( );
virtual bool do_is(mask m, charT c) const;
virtual const charT* do_is(const charT* low, const charT* high, mask* vec)
const;
virtual const charT* do_scan_is(mask m, const charT* low,
const charT* high) const;
virtual const charT* do_scan_not(mask m, const charT* low,
const charT* high) const;
virtual charT do_toupper(charT) const;
virtual const charT* do_toupper(charT* low, const charT* high) const;
virtual charT do_tolower(charT) const;
virtual const charT* do_tolower(charT* low, const charT* high) const;
virtual charT do_widen(char) const;
virtual const char* do_widen(const char* low, const char* high, charT* dest)
const;
virtual char do_narrow(charT, char dfault) const;
virtual const charT* do_narrow(const charT* low, const charT* high,
char dfault, char* dest) const;
};
|
|
The ctype class template is a facet for
classifying characters.
The ctype<char> specialization is described
in its own section later in this chapter. The standard also mandates
the ctype<wchar_t> instantiation. Both
instantiations depend on the implementation's native
character set.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
narrow, which calls do_narrow.
The descriptions below are for the virtual functions because they do
the real work. Imagine that for each virtual function description,
there is a corresponding description for a public, nonvirtual
function, such as:
- bool is(mask m, charT c) const
-
Returns do_is(m, c)
The following are the virtual, protected members of
ctype:
- virtual bool do_is(mask m, charT c) const
- virtual const charT* do_is(const charT* low, const charT* high, mask* dest) const
-
Classifies a single character c or a sequence of
characters [low, high). The
first form tests the classification mask, M, of
c and returns (M
& m) !=
0. The second form determines the mask for each
character in the range and stores the mask values
in the dest array (which must be large enough to
hold high - low masks),
returning high. See Table 13-19
(under the ctype_base class) for a description of
the mask type.
- virtual char do_narrow(charT c, char dfault) const
- virtual const charT* do_narrow(const charT* low, const charT* high, char dfault, char* dest) const
-
Converts a character c or a sequence of characters
[low, high) to narrow
characters of type char. The first form returns
the narrow character, and the second form stores the characters in
the array dest (which must be large enough to hold
high - low characters),
returning high. If a charT
source character cannot be converted to a narrow character, the first
function returns dfault, and the second function
stores dfault in dest as the
narrow version of that character.
- virtual const charT* do_scan_is(mask m, const charT* low, const charT* high) const
-
Searches the sequence of characters [low,
high) for the first character that matches
m, that is, for which do_is(m,
c) is true. The return value is
a pointer to the first matching character, or high
if no characters match m.
- virtual const charT* do_scan_not(mask m, const charT* low, const charT* high) const
-
Searches the sequence of characters [low,
high) for the first character that does not match
m, that is, for which do_is(m,
c) is false. The return value
is a pointer to the first matching character, or
high if every character matches
m.
- virtual charT do_tolower(charT c) const
- virtual const charT* do_tolower(charT* low, const charT* high) const
-
Converts a character c or a sequence of characters
[low, high) to lowercase. The
first form returns the lowercase version of c, or
it returns c if c does not have
a lowercase counterpart.
The second form modifies the character sequence: each character in
[low, high) is replaced by its
lowercase counterpart; if a character cannot be converted to
lowercase, it is not touched. The function returns
high.
- virtual charT do_toupper(charT c) const
- virtual const charT* do_toupper(charT* low, const charT* high) const
-
Converts a character c or a sequence of characters
[low, high) to uppercase. The
first form returns the uppercase version of c, or
it returns c if c does not have
a uppercase counterpart.
The second form modifies the character sequence: each character in
[low, high) is replaced by its
uppercase counterpart; if a character cannot be converted to
uppercase, it is not touched. The function returns
high.
- virtual charT do_widen(char c) const
- virtual const char* do_widen(const char* low, const char* high, charT* dest) const
-
Converts a narrow character c or a sequence of
narrow characters [low, high)
to characters of type charT. The first form
returns the new character, and the second form stores the characters
in the array dest (which must be large enough to
hold high - low characters),
returning high.
See Also
ctype_base class, ctype_byname
class template, locale::facet class
ctype<char> class |
Facet for classifying narrow characters
|
template <>
class ctype<char> : public locale::facet, public ctype_base
{
...
public:
explicit ctype(const mask* tab = 0, bool del = false, size_t refs = 0);
static const size_t table_size = . . . ;
inline bool is(mask m, char c) const;
inline const char* is(const char* low, const char* high, mask* vec) const;
inline const char* scan_is(mask m, const char* low, const char* high) const;
inline const char* scan_not(mask m, const char* low, const char* high) const;
protected:
virtual ~ctype( );
inline const mask* table( ) const throw( );
inline static const mask* classic_table( ) throw( );
};
|
|
The ctype<> class template is specialized
for type char (but not signed
char or unsigned
char) so the member functions can be implemented
as inline functions. The standard requires the implementation to have
the protected member functions table and
classic_table. Each of these functions returns an
array of mask values indexed by characters cast to
unsigned char. The number of
elements in a table must be at least table_size,
which is an implementation-defined constant value.
The following are the key member functions:
- explicit ctype(const mask* tab = 0, bool del = false, size_t refs = 0)
-
Initializes the table( ) pointer with
tab. If tab is a null pointer,
table( ) is set to classic_table(
). If tab is not null, and
del is true, the ctype object
owns the table, and when the ctype destructor is
called, it will delete the table. The refs
parameter is passed to the base class, as with any facet.
- virtual ~ctype( )
-
If the constructor's del flag was
true, and tab was not a null pointer, performs
delete[] tab.
- inline bool is(mask m, charT c) const
- inline const charT* is(const charT* low, const charT* high, mask* dest) const
-
Tests character classifications. The first form returns:
(table( )[static_cast<unsigned char>(c)] & m) != 0
The second form stores the following in dest for
each element c of the range
[low, high):
table( )[static_cast<unsigned char>(c)]
Note that is does not call
do_is, so is can be implemented
as an inline function.
- inline static const mask* classic_table( ) throw( )
-
Returns a table that corresponds to the "C" locale.
- inline const char* scan_is(mask m, const char* low, const char* high) const
-
Searches the sequence of characters [low,
high) for the first character that matches
m, that is, for which is(m,
c) is true. The return value is
a pointer to the first matching character, or high
if no characters match m.
- inline const char* scan_not(mask m, const char* low, const char* high) const
-
Searches the sequence of characters [low,
high) for the first character that does not match
m, that is, for which is(m,
c) is false. The return value
is a pointer to the first matching character, or
high if every character matches
m.
- inline const mask* table( ) throw( )
-
Returns the value that was passed to the constructor as the
tab parameter, or, if tab was
null, classic_table( ) is returned.
See Also
ctype class template,
locale::facet class,
<cctype>, <cwctype>
ctype_base class |
Base class for ctype facet
|
class ctype_base{
public:
enum mask {
space, print, cntrl, upper, lower, alpha, digit, punct, xdigit,
alnum=alpha|digit, graph=alnum|punct
};
};
|
|
The ctype_base class is the base class for the
ctype and ctype_byname class
templates. It declares the mask enumerated type,
which is used for classifying characters. Table 13-20 describes the mask literals
and their definitions for the classic "C" locale.
Table 13-20. mask literals for classifying characters
alpha
|
Alphabetic (a letter)
|
lower or upper
|
alnum
|
Alphanumeric (letter or digit)
|
alpha or digit
|
cntrl
|
Control (nonprintable)
|
Not print
|
digit
|
'0'-'9'
|
All locales
|
graph
|
Character that occupies graphical space
|
print but not space
|
lower
|
Lowercase letter
|
'a'-'z'
|
print
|
Printable character (alphanumeric, punctuation, space, etc.)
|
Depends on character set; in ASCII:
'\x20'-'\x7e')
|
space
|
Whitespace
|
' ', '\f',
'\n', '\r',
'\t', '\v'
|
upper
|
Uppercase letter
|
'A'-'Z'
|
xdigit
|
Hexadecimal digit ('0'-'9',
'a'-'f',
'A'-'F')
|
All locales
|
See Also
ctype class template,
ctype_byname class template
ctype_byname class template |
Facet for classifying characters
|
template <typename charT>
class ctype_byname : public ctype<charT>
{
public:
typedef ctype<charT>::mask mask;
explicit ctype_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in ctype
};
|
|
The ctype_byname class template is a facet for
classifying characters; it uses a named locale. The
ctype_byname<char> and
ctype_byname<wchar_t> instantiations are
standard.
See Also
ctype class template,
ctype_byname<char> class
ctype_byname<char> class |
Facet for classifying narrow characters
|
template <>
class ctype_byname<char> : public ctype<char>
{
public:
explicit ctype_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in ctype<char>
};
|
|
The ctype_byname<char> class specializes the
ctype_byname template for type
char. (No specialization exists for
signed char and
unsigned char.) It derives from
ctype<char>, so it inherits its table-driven
implementation.
See Also
ctype<char> class,
ctype_byname class template
has_facet function template |
Test for existence of a facet in a locale
|
template <typename Facet>
bool has_facet(const locale& loc) throw( );
|
|
The has_facet function determines whether the
locale loc supports the facet
Facet. It returns true if the
facet is supported or false if it is not. Call
has_facet to determine whether a locale supports a
user-defined facet. (Every locale must support the standard facets
that are described in this section.) Example 13-24
shows how has_facet is used.
Example
Example 13-24. Testing whether a locale supports a facet
// The units facet is defined under the locale::facet class (later in this
// section).
using std::locale;
if (std::has_facet<units>(locale( )) {
// Get a reference to the units facet of the locale.
const units& u = std::use_facet<units>(locale( ));
// Construct a value of 42 cm.
units::value_t len = u.make(42, units::cm);
// Print the length (42 cm) in the locale's preferred units.
u.length_put(std::cout, len);
}
See Also
locale class, use_facet
function template
isalnum function template |
Determines whether a character is alphanumeric in a locale
|
template <typename charT>
bool isalnum(charT c, const locale& loc);
|
|
The isalnum function determines whether the
character c is an alphanumeric character in the
locale loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::alnum, c)
See Also
ctype_base class, ctype class
template, isalpha function template,
isdigit function template
isalpha function template |
Determines whether a character is a letter in a locale
|
template <typename charT>
bool isalpha(charT c, const locale& loc);
|
|
The isalpha function determines whether the
character c is a letter in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::alpha, c)
See Also
ctype_base class, ctype class
template, isalnum function template,
islower function template,
isupper function template
iscntrl function template |
Determines whether a character is a control character in a locale
|
template <typename charT>
bool iscntrl(charT c, const locale& loc);
|
|
The iscntrl function determines whether the
character c is a control character in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::cntrl, c)
See Also
ctype_base class, ctype class
template, isprint function template
isdigit function template |
Determines whether a character is a digit in a locale
|
template <typename charT>
bool isdigit(charT c, const locale& loc);
|
|
The isdigit function determines whether the
character c is a digit in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::digit, c)
See Also
ctype_base class, ctype class
template, isalnum function template,
isxdigit function template
isgraph function template |
Determines whether a character is graphical in a locale
|
template <typename charT>
bool isgraph(charT c, const locale& loc);
|
|
The isgraph function determines whether the
character c is graphical (alphanumeric or
punctuation) in the locale loc. It returns the
following:
use_facet<ctype<charT> >(loc).is(ctype_base::graph, c)
See Also
ctype_base class, ctype class
template, isalnum function template,
isprint function template,
ispunct function template
islower function template |
Determines whether a character is lowercase in a locale
|
template <typename charT>
bool islower(charT c, const locale& loc);
|
|
The islower function determines whether the
character c is a lowercase letter in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::lower, c)
See Also
ctype_base class, ctype class
template, isalpha function template,
isupper function template
isprint function template |
Determines whether a character is printable in a locale
|
template <typename charT>
bool isprint(charT c, const locale& loc);
|
|
The isprint function determines whether the
character c is printable in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::print, c)
See Also
ctype_base class, ctype class
template, iscntrl function template,
isgraph function template,
isspace function template
ispunct function template |
Determines whether a character is punctuation in a locale
|
template <typename charT>
bool ispunct(charT c, const locale& loc);
|
|
The ispunct function determines whether the
character c is punctuation in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::punct, c)
See Also
ctype_base class, ctype class
template, isgraph function template
isspace function template |
Determines whether a character is whitespace in a locale
|
template <typename charT>
bool isspace(charT c, const locale& loc);
|
|
The isspace function determines whether the
character c is whitespace in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::space, c)
See Also
ctype_base class, ctype class
template, isgraph function template,
isprint function template
isupper function template |
Determines whether a character is uppercase in a locale
|
template <typename charT>
bool isupper(charT c, const locale& loc);
|
|
The isupper function determines whether the
character c is an uppercase letter in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::upper, c)
See Also
ctype_base class, ctype class
template, isalpha function template,
islower function template
isxdigit function template |
Determines whether a character is a hexadecimal digit in a locale
|
template <typename charT>
bool isxdigit(charT c, const locale& loc);
|
|
The isxdigit function determines whether the
character c is a hexadecimal digit in the locale
loc. It returns the following:
use_facet<ctype<charT> >(loc).is(ctype_base::xdigit, c)
See Also
ctype_base class, ctype class
template, isdigit function template
locale class |
Represents a locale as a set of facets
|
class locale{
public:
class facet;
class id;
typedef int category;
static const category
none, collate, ctype, monetary, numeric, time, messages,
all = collate|ctype|monetary|numeric|time|messages;
// Construct/copy/destroy
locale( ) throw( );
locale(const locale& other) throw( );
explicit locale(const char* std_name);
locale(const locale& other, const char* std_name,category);
template <typename Facet>
locale(const locale& other, Facet* f);
locale(const locale& other, const locale& one, category);
~locale( ) throw( );
const locale& operator=(const locale& other) throw( );
template <typename Facet>
locale combine(const locale& other) const;
basic_string<char> name( ) const;
bool operator==(const locale& other) const;
bool operator!=(const locale& other) const;
template <typename charT, typename Traits, typename Alloc>
bool operator( )(const basic_string<charT,Traits,Alloc>& s1,
const basic_string<charT,Traits,Alloc>& s2) const;
static locale global(const locale&);
static const locale& classic( );
};
|
|
The locale class template represents the
information for a locale. This information is stored as a set of
facets. Several facets are defined by the C++ standard, and
user-defined facets can be added to any locale. The
has_facet function template tests whether a locale
supports a particular facet. The use_facet
function template retrieves a facet of a locale.
References to a facet are safe until all locale objects that use that
facet have been destroyed. New locales can be created from existing
locales, with modifications to a particular facet.
Some locales have names. A locale can be constructed for a standard
name, or a named locale can be copied or combined with other named
locales to produce a new named locale.
|
When interacting with the user, either through the standard I/O
streams or through a graphical user interface, you should use the
native locale, that is, locale(""). When
performing I/O—especially to external files where the data must
be portable to other programs, systems, or environments—always
use the "C" locale (locale::classic(
)).
|
|
Example 13-25 shows locales that control input and
output formats.
Example
Example 13-25. Using locales for input and output
// Open a file and read floating-point numbers from it, computing the mean.
// Return the mean or 0 if the file contains no data. The data is in the classic
// format, that is, the same format used by C++.
double mean(const char* filename)
{
std::ifstream in(filename);
// Force the datafile to be interpreted in the classic locale, so the same
// datafile can be used everywhere.
in.imbue(std::locale::classic( ));
double sum = 0;
unsigned long count = 0;
std::istream_iterator<double> iter(in), end;
for ( ; iter != end; ++iter) {
++count;
sum += *iter;
}
return count == 0 ? 0.0 : sum / count;
}
int main( )
{
// Print results in the user's native locale.
std::cout.imbue(std::locale(""));
std::cout << mean("data.txt") << '\n';
}
The following are the member functions of locale:
- locale( ) throw( )
-
Initializes the locale with a copy of the current global locale. The
initial global locale is locale::classic( ).
- locale(const locale& other) throw( )
-
Copies the other locale.
- explicit locale(const char* std_name)
-
Initializes the locale using a standard name. The names
"C" and "" (empty string) are
always defined, in which "C" is the locale
returned by the classic( ) function, and
"" identifies the implementation-defined native
locale.
An implementation can define additional names. Many C++
implementations use ISO language codes and country codes to identify
a locale. For example, the ISO 639 language code for English is
"en", and the ISO 3166 country code
for the United States is "US", so
"en_US" could identify the locale for U.S.
English.
- locale(const locale& other, const char* std_name, category mask)
-
Copies the locale from other,
except for those categories identified by mask,
which are copied from the standard locale identified by
std_name. The new locale has a name only if
other has a name.
- template <typename Facet>
- locale(const locale& other, Facet* f)
-
Copies the locale from other
except for the facet Facet, which is obtained from
f if f is not null.
- locale(const locale& other, const locale& one, category mask)
-
Copies the locale from other except for those
categories identified by mask, which are copied
from one. The new locale has a name only if
other and one have names.
- template <typename Facet>
- locale combine(const locale& other) const
-
Returns a new locale that is a copy of *this,
except for Facet, which is copied from
other. If other does not
support the facet—that is,
has_facet<Facet>(other) is
false—runtime_error is
thrown. The new locale has no name.
- basic_string<char> name( ) const
-
Returns the locale's name or "*"
if the locale has no name. The exact contents of the name string are
implementation-defined, but you can use the string to construct a new
locale that is equal to *this—that is,
*this == locale(name(
).c_str( )).
- const locale& operator=(const locale& other) throw( )
-
Copies other and returns *this.
- bool operator==(const locale& other) const
-
Returns true if the two locales are the same
object, one locale object is a copy of the other, or the two locales
are named and have the same name. Otherwise, the function returns
false.
- bool operator!=(const locale& other) const
-
Returns !(*this ==
other).
- template <typename charT, typename Tr, typename A>
- bool operator( )(const basic_string<charT, Tr, A>& s1, const basic_string<charT,Tr,A>& s2) const
-
Compares two strings using the
collate<charT> facet and returns
true if s1
< s2. You can use the locale
object as a comparator predicate to compare strings. See
<string> for more information.
- static locale global(const locale& loc)
-
Sets the global locale to loc and returns the
previous global locale. If the new locale has a name, the C locale is
set by calling setlocale(LC_ALL,
loc.name( ).c_str( )); if the locale does not have
a name, the effect on the C locale is implementation-defined.
- static const locale& classic( )
-
Returns a locale that implements the "C" locale.
See Also
has_facet function template,
use_facet function template,
setlocale in <clocale>,
<string>
locale::category type |
Bitmask of facet categories
|
typedef int category;
static const category
none, collate, ctype, monetary, numeric, time, messages,
all = collate|ctype|monetary|numeric|time|messages;
|
|
The category type is an int and
represents a bitmask of category identifiers, as listed in Table 13-21. Each category represents a set of one or more
related facets. When combining locales, you can copy all the facets
in one or more categories. Category identifiers can be combined using
bitwise operators.
Table 13-21. Standard categories and their facets
collate
|
collate<char>
collate<wchar_t>
|
ctype
|
ctype<char>
ctype<wchar_t>
codecvt<char,char,mbstate_t>
codecvt<wchar_t,char,mbstate_t>
|
messages
|
messages<char>
messages<wchar_t>
|
monetary
|
money_get<char>
money_get<wchar_t>
money_put<char>
money_put<wchar_t>
moneypunct<char>
moneypunct<wchar_t>
moneypunct<char,true>
moneypunct<wchar_t,true>
|
numeric
|
num_get<char>
num_get<wchar_t>
num_put<char>
num_put<wchar_t>
numpunct<char>
numpunct<wchar_t>
|
time
|
time_get<char>
time_get<wchar_t>
time_put<char>
time_put<wchar_t>
|
See Also
locale class
locale::facet class |
Base class for locale facets
|
class locale::facet{
protected:
explicit facet(size_t refs = 0);
virtual ~facet( );
private:
facet(const facet&); // Not defined
void operator=(const facet&); // Not defined
};
|
|
The facet class is the base class for all facets.
A derived class must also declare a public, static data member of
type locale::id whose name is
id. Even a derived class must declare its own
id member because it must have an identifier that
is distinct from that of the base-class facet. Any other members for
a custom facet are entirely up to the programmer; the derived class
does not need to provide a copy or default constructor or an
assignment operator.
The locale class assigns a value to
id when the facet object is added to a locale. You
never need to examine or alter the id member; it
is managed entirely by locale.
The explicit constructor for facet takes a single
argument, ref. If ref
== 0, the
facet object is not deleted until the last locale
that uses the facet is destroyed. If ref
== 1, the
facet object is never destroyed. The standard
facet classes (ctype, etc.) also take a
ref parameter and pass it directly to the
inherited facet constructor. Custom facets can do
whatever the programmer wants, such as relying on the default value
of 0 to manage the facet's
lifetime automatically.
For example, suppose you want to define a facet that captures the
locale-specific preferences for units of measure, such as length and
weight. A program can store and manipulate values in a common base
unit and convert to the preferred unit for output. Example 13-26 shows a units facet that
allows you to do these things.
Example
Example 13-26. A simple facet for working with units of measure
class units : public std::locale::facet
{
public:
enum length_units {
length_base=1,
mm=10, cm=10*mm, m=10*cm, km=1000*m,
in=254, ft=12*in, yd=3*ft, mi=5280*ft };
typedef double value_t;
// All facets must have a static ID member.
static std::locale::id id;
// Constructor initializes length_units_ according to local preferences.
units( );
// Read a length and its units, and return the length in base units.
value_t length_get(std::istream& stream) const;
// Convert value to the preferred units, and print the converted value followed
// by the unit name.
void length_put(std::ostream& stream, value_t value) const;
// Make a base unit value from a value in src_units.
value_t make(value_t src_value, length_units src_units)
const;
// Convert base units to dst_unit.
value_t convert(value_t src_value, length_units dst_units)
const;
// Return the name of a unit.
const char* unit_name(length_units units) const;
// Return the preferred unit for length.
length_units get_length_unit( ) const;
private:
length_units length_units_;
};
int main( )
{
// Add the units facet to the global locale:
// 1. Construct a new locale that is a copy of the global locale, with the new
// units facet added to it.
// 2. Set the new locale as the global locale.
std::locale loc(std::locale(std::locale( ), new units));
std::locale::global(loc);
// Now anyone can get the units facet from the global locale.
const units& u = std::use_facet<units>(std::locale( ));
units::value_t size = u.make(42, units::cm);
u.length_put(std::cout, size);
}
See Also
locale class, locale::id class
locale::id class |
Facet identification
|
class locale::id{
public:
id( );
private:
void operator=(const id&); // Not defined
id(const id&); // Not defined
};
|
|
The id class identifies a facet. It is used only
to declare a public, static member of type
locale::id in every facet class. See
locale::facet for more information.
See Also
locale::facet class
messages class template |
Facet for retrieving strings from a message catalog
|
template <typename charT>
class messages : public locale::facet, public messages_base
{
public:
typedef charT char_type;
typedef basic_string<charT> string_type;
explicit messages(size_t refs = 0);
catalog open(const basic_string<char>& fn, const locale&) const;
string_type get(catalog c, int set, int msgid, const string_type& dfault)
const;
void close(catalog c) const;
static locale::id id;
protected:
virtual ~messages( );
virtual catalog do_open(const basic_string<char>&, const locale&) const;
virtual string_type do_get(catalog, int set, int msgid,
const string_type& dfault) const;
virtual void do_close(catalog) const;
};
|
|
The messages class template is a facet for a
message catalog. A message catalog is a database of textual messages
that can be translated into different languages. The
messages<char> and
messages<wchar_t> instantiations are
standard.
How a message catalog is found is implementation-defined. For
example, a catalog name could be the name of an external file, or it
could be the name of a special resource section in the
program's executable file. The mapping of message
identifiers to a particular message is also implementation-defined.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
get, which calls do_get. The
descriptions below are for the virtual functions because they do the
real work. Imagine that for each virtual-function description, there
is a corresponding description for a public, nonvirtual function,
such as:
- void close(catalog cat) const
-
Calls do_close(cat).
The following are the virtual, protected members of
messages:
- virtual void do_close(catalog cat) const
-
Closes the message catalog cat.
- virtual string_type do_get(catalog cat, int set, int msgid, const string_type& dfault) const
-
Gets a message that is identified by set,
msgid, and dfault from catalog
cat. If the message cannot be found,
dfault is returned.
- virtual catalog do_open(const basic_string<char>& name, const locale& loc) const
-
Opens a message catalog name. If the catalog
cannot be opened, a negative value is returned. Otherwise, the
catalog value can be passed to
get to retrieve messages. Call
close to close the catalog.
See Also
messages_base class,
messages_byname class template
messages_base class |
Base class for message facets
|
class messages_base {
public:
typedef int catalog;
};
|
|
The message_base class is the base class for
messages and message_byname. It
declares the catalog type, which stores a handle
for an open message catalog.
See Also
messages class template,
message_byname class template
messages_byname class template |
Facet for retrieving strings from a message catalog
|
template <typename charT>
class messages_byname : public messages<charT>
{
public:
typedef messages_base::catalog catalog;
typedef basic_string<charT> string_type;
explicit messages_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in messages
};
|
|
The messages_byname class template is a facet for
a message catalog; it uses a named locale. The
messages_byname<char> and
messages_byname<wchar_t> instantiations are
standard.
See Also
messages class template,
messages_base class
money_base class |
Base class for moneypunct facet
|
class money_base {
public:
enum part { none, space, symbol, sign, value };
struct pattern { char field[4]; };
};
|
|
The money_base class is a base class for the
moneypunct and
moneypunct_byname class templates. It declares the
part and pattern types. A
pattern actually stores four
part values, but they are stored as four
char values for space efficiency. See
moneypunct for an explanation of how
part and pattern are used.
See Also
moneypunct class template,
moneypunct_byname class template
money_get class template |
Facet for input of monetary values
|
template <typename charT,
typename InputIterator = istreambuf_iterator<charT> >
class money_get : public locale::facet
{
public:
typedef charT char_type;
typedef InputIterator iter_type;
typedef basic_string<charT> string_type;
explicit money_get(size_t refs = 0);
iter_type get(iter_type s, iter_type end, bool intl, ios_base& f,
ios_base::iostate& err, long double& units) const;
iter_type get(iter_type s, iter_type end, bool intl, ios_base& f,
ios_base::iostate& err, string_type& digits) const;
static locale::id id;
protected:
virtual ~money_get( );
virtual iter_type do_get(iter_type begin, iter_type end, bool intl,
ios_base& strean, ios_base::iostate& err,
long double& units) const;| virtual iter_type
do_get(iter_type begin, iter_type end, bool intl,
ios_base& stream, ios_base::iostate& err,
string_type& digits) const;
};
|
|
The money_get class template is a facet for
parsing monetary values from an input stream. The
money_get<char> and
money_get<wchar_t> instantiations are
standard. Example 13-27 shows a simple use of
money_get and money_put.
Example
Example 13-27. Reading and writing monetary values
#include <iostream>
#include <locale>
#include <ostream>
int main( )
{
std::ios_base::iostate err = std::ios_base::goodbit;
long double value;
std::cout << "What is your hourly wage? ";
std::use_facet<std::money_get<char> >(std::locale( )).get(
std::cin, std::istreambuf_iterator<char>( ),
false, std::cin, err, value);
if (err)
std::cerr << "Invalid input\n";
else {
std::cout << value << '\n';
std::cout << "You make ";
std::use_facet<std::money_put<char> >(std::locale( )).put(
std::cout, false, std::cout, std::cout.fill( ),
value * 40);
std::cout << " in a 40-hour work week.\n";
}
}
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public function get,
which calls do_get. The description below is for
the virtual functions because they do the real work. Imagine that for
each virtual-function description, there is a corresponding
description for a public, nonvirtual function, such as:
- iter_type get(iter_type begin, iter_type end, bool intl, ios_base& stream, ios_base::iostate& err, long double& units) const
-
Calls do_get(begin, end,
intl, stream,
err, units)
The following are the virtual, protected members of
money_get:
- virtual iter_type do_get(iter_type begin, iter_type end, bool intl, ios_base& stream, ios_base::iostate& err, long double& units) const
- virtual iter_type do_get(iter_type begin, iter_type end, bool intl, ios_base& stream, ios_base::iostate& err, string_type& digits) const
-
Reads characters in the range [begin,
end) and interprets them as a monetary value. If
intl is true, the value is
parsed using international format; otherwise, local format is used.
That is, the intl value is used as the
Intl template parameter to
moneypunct<char_type,
Intl>. If a valid monetary value is read from
the input stream, the integral value is stored in
units or is formatted as a string in
digits. (For example, the input
"$1,234.56" yields the units
123456 or the digits "123456".)
The digit string starts with an optional minus sign
('-') followed by digits
('0'-'9'), in which each
character c is produced by calling
ctype<char_type>.widen(c).
If a valid sequence is not found, err is modified
to include stream.failbit. If the end of the input
is reached without forming a valid monetary value,
stream.eofbit is also set.
If the showbase flag is set
(stream.flags( ) &
stream.showbase is not
0), the currency symbol is required; otherwise, it
is optional. Thousands grouping, if the local format supports it, is
optional.
The sign of the result is dictated by positive_sign(
) and negative_sign( ) from the
moneypunct facet.
The return value is an iterator that points to one past the last
character of the monetary value.
See Also
money_put class template,
moneypunct class template,
num_get class template
money_put class template |
Facet for output of monetary values
|
template <typename charT,
typename OutputIterator = ostreambuf_iterator<charT> >
class money_put : public locale::facet
{
public:
typedef charT char_type;
typedef OutputIterator iter_type;
typedef basic_string<charT> string_type;
explicit money_put(size_t refs = 0);
iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
long double units) const;
iter_type put(iter_type s, bool intl, ios_base& f, char_type fill,
const string_type& digits) const;
static locale::id id;
protected:
virtual ~money_put( );
virtual iter_type do_put(iter_type, bool, ios_base&, char_type fill,
long double units) const;
virtual iter_type do_put(iter_type, bool, ios_base&, char_type fill,
const string_type& digits) const;
};
|
|
The money_put class template is a facet for
formatting and printing monetary values. See Example 13-27 (under money_get), which
shows how to use the money_put facet. The
money_put<char> and
money_put<wchar_t> instantiations are
standard.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
put, which calls do_put. The
descriptions below are for the virtual functions because they do the
real work. Imagine that for each virtual function description, there
is a corresponding description for a public, nonvirtual function,
such as:
- iter_type put(iter_type iter, bool intl, ios_base& stream, char_type fill, long double units) const
-
Returns do_put(iter, intl,
stream, fill,
units)
The following are the virtual, protected members of
money_put:
- virtual iter_type do_put(iter_type iter, bool intl, ios_base& stream, char_type fill, long double units) const
- virtual iter_type do_put(iter_type iter, bool intl, ios_base& stream, char_type fill, const string_type& digits) const
-
Formats a monetary value and writes the formatted characters to
iter. The value to format is either an integer,
units, or a string of digit characters in
digits. If the first character of digits is
widen('-'), the remaining digits are interpreted
as a negative number.
The formatting pattern and punctuation characters are obtained from
the moneypunct facet. For positive values,
pos_format( ) is used; for negative values,
neg_format( ) is used. The pattern dictates the
output format. (See moneypunct later in this
section for information on patterns.) The currency symbol is printed
only if the showbase flag is set (that is,
stream.flags( ) &
stream.showbase is nonzero). Thousands separators
and a decimal point are inserted at the appropriate places in the
formatted output.
If necessary, fill characters are inserted until
the formatted width is stream.width( ). The
stream's adjustfield flag
dictates how fill characters are inserted. That is,
stream.flags( ) &
stream.adjustfield is tested, and if it is equal
to:
- ios_base::internal
-
Fill characters are inserted where the pattern is
none or space.
- ios_base::left
-
Fill characters are appended to the end of the formatted field.
- None of the above
-
Fill characters are inserted at the start of the formatted field.
Finally, stream.width(0) is called to reset the
field width to 0. The return value is an iterator
that points to one past the last output character.
See Also
money_get class template,
moneypunct class template,
num_put class template
moneypunct class template |
Facet for punctuation of monetary values
|
template <typename charT, bool International = false>
class moneypunct : public locale::facet, public money_base
{
public:
typedef charT char_type;
typedef basic_string<charT> string_type;
explicit moneypunct(size_t refs = 0);
charT decimal_point( ) const;
charT thousands_sep( ) const;
string grouping( ) const;
string_type curr_symbol( ) const;
string_type positive_sign( ) const;
string_type negative_sign( ) const;
int frac_digits( ) const;
pattern pos_format( ) const;
pattern neg_format( ) const;
static locale::id id;
static const bool intl = International;
protected:
virtual ~moneypunct( );
virtual charT do_decimal_point( ) const;
virtual charT do_thousands_sep( ) const;
virtual string do_grouping( ) const;
virtual string_type do_curr_symbol( ) const;
virtual string_type do_positive_sign( ) const;
virtual string_type do_negative_sign( ) const;
virtual int do_frac_digits( ) const;
virtual pattern do_pos_format( ) const;
virtual pattern do_neg_format( ) const;
};
|
|
The moneypunct class template is a facet that
describes the punctuation characters used to format a monetary value.
The moneypunct<char,false>,
moneypunct<wchar_t,false>,
moneypunct<char,true>, and
moneypunct<wchar_t,true> instantiations are
standard.
Specify true for the
International template parameter to obtain an
international format, or false to obtain a local
format. In an international format, the currency symbol is always
four characters, usually three characters followed by a space.
The money_get and money_put
facets use a pattern to parse or format a monetary value. The pattern
specifies the order in which parts of a monetary value must appear.
Each pattern has four fields, in which each field has type
part (cast to char). The
symbol, sign, and
value parts must appear exactly once, and the
remaining field must be space or
none. The value none cannot be
first (field[0]); space cannot
be first or last (field[3]).
Where sign appears in the pattern, the first
character of the sign string (positive_sign( ) or
negative_sign( )) is output, and the remaining
characters of the sign string appear at the end of the formatted
output. Thus, if negative_sign( ) returns
"( )", the value -12.34 might
be formatted as "(12.34)".
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
grouping, which calls
do_grouping. The descriptions below are for the
virtual functions because they do the real work. Imagine that for
each virtual-function description, there is a corresponding
description for a public, nonvirtual function, such as:
- string_type curr_symbol( ) const
-
Returns do_curr_symbol( )
The following are the virtual, protected members of
moneypunct:
- virtual string_type do_curr_symbol( ) const
-
Returns the currency symbol, such as "$" (which is
used by some U.S. locales) or "USD " (which is the
international currency symbol for U.S. dollars). In the
"C" locale, the currency symbol is
"" or L"".
- virtual charT do_decimal_point( ) const
-
Returns the character used before the fractional part when
do_frac_digits is greater than
0. For example, in the U.S., this is typically
'.', and in Europe, it is typically
','. In the "C" locale, the
decimal point is '.' or L'.'.
- virtual int do_frac_digits( ) const
-
Returns the number of digits to print after the decimal point. This
value can be 0. In the "C"
locale, the number of digits is
std::numeric_limits<char>.max( ).
- virtual string do_grouping( ) const
-
Returns a string that specifies the positions of thousands
separators. The string is interpreted as a vector of integers, in
which each value is a number of digits, starting from the right.
Thus, the string "\3" means every three digits
form a group. In the "C" locale, the grouping is
"" or L"".
- virtual pattern do_neg_format( ) const
-
Returns the pattern used to format negative values. In the
"C" locale, the negative format is
{ symbol,
sign, none,
value }.
- virtual string_type do_negative_sign( ) const
-
Returns the string (which may be empty) used to identify negative
values. The position of the sign is dictated by the
do_neg_format pattern. In the
"C" locale, the negative sign is
"-" or L"-".
- virtual pattern do_pos_format( ) const
-
Returns the pattern used to format positive values. In the
"C" locale, the positive format is
{ symbol,
sign, none,
value }.
- virtual string_type do_positive_sign( ) const
-
Returns the string (which may be empty) used to identify positive
values. The position of the sign is dictated by the
do_pos_format pattern. In the
"C" locale, the positive sign is
"" or L"".
- virtual charT do_thousands_sep( ) const
-
Returns the character used to separate groups of digits, in which the
groups are specified by do_grouping. In the U.S.,
the separator is typically ',', and in Europe, it
is often '.'. In the "C"
locale, the thousands separator is '\0' or
L'\0'.
See Also
money_base class, money_get
class template, money_put class template,
moneypunct_byname class template,
numpunct class template
moneypunct_byname class template |
Facet for punctuation of monetary values
|
template <typename charT, bool Intl = false>
class moneypunct_byname : public moneypunct<charT, Intl>
{
public:
typedef money_base::pattern pattern;
typedef basic_string<charT> string_type;
explicit moneypunct_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in moneypunct
};
|
|
The moneypunct_byname class template provides
formatting characters and information for monetary values using the
rules of a named locale. The
moneypunct_byname<char,International> and
moneypunct_byname<wchar_t,International>
instantiations are standard.
See Also
moneypunct class template
num_get class template |
Facet for input of numbers
|
template <typename charT,
typename InputIterator = istreambuf_iterator<charT> >
class num_get : public locale::facet
{
public:
typedef charT char_type;
typedef InputIterator iter_type;
explicit num_get(size_t refs = 0);
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, bool& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, long& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, unsigned short& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, unsigned int& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, unsigned long& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, float& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, double& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, long double& v) const;
iter_type get(iter_type in, iter_type end, ios_base&,
ios_base::iostate& err, void*& v) const;
static locale::id id;
protected:
virtual ~num_get( );
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, bool& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, long& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, unsigned short& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, unsigned int& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, unsigned long& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, float& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, double& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, long double& v) const;
virtual iter_type do_get(iter_type, iter_type, ios_base&,
ios_base::iostate& err, void*& v) const;
};
|
|
The num_get class template is a facet for parsing
and reading numeric values from an input stream. The
istream extraction operators
(>>) use num_get. The
num_get<char> and
num_get<wchar_t> instantiations are
standard.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
get, which calls do_get. The
descriptions below are for the virtual functions because they do the
real work. Imagine that for each virtual function description, there
is a corresponding description for a public, nonvirtual function,
such as:
- iter_type get(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, bool& v) const
-
Returns do_get(begin, end,
stream, err,
v)
The following are the virtual, protected members of
num_get:
- virtual iter_type do_get(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, bool& v) const
-
Reads a bool value, which can be represented as a
number or as a character string. The function first tests the
boolalpha flag, that is, stream.flags(
) &
stream.boolalpha. If the flag is
0, a numeric value is read; if the flag is
1, a string is read from
[begin, end).
If boolalpha is false, the input is interpreted as
a long int. If the numeric
value is 1, v is assigned
true; if the value is 0,
v is assigned false; otherwise,
failbit is set in err, and
v is not modified.
If boolalpha is true, characters are read from
begin until one of the following happens:
The input matches truename( ) from the numpunct facet: use_facet<numpunct<char_type> >(stream.getloc( )).truename( ) v is assigned true, and err is assigned goodbit. A match is determined by the shortest input sequence that uniquely matches truename( ) or falsename( ).
The input matches falsename( ): v is assigned false, and err is assigned goodbit.
begin == end, in which case eofbit is set in err.
The input does not match truename( ) or falsename( ); failbit is set in err.
- virtual iter_type do_get (iter_type begin , iter_type end, ios_base& stream , ios_base::iostate& err , type& v) const
-
Reads a single value. The do_get function is
overloaded for most of the fundamental types. The behavior of each
function is essentially the same (except for the
bool version described earlier) and depends on
stream.flags( ), the ctype
facet, and the numpunct facet. Both facets are
obtained for the locale stream.getloc( ).
First, input characters are collected from the range
[begin, end) or until the input
character is not part of a valid number according to the flags and
numpunct facet. A locale-dependent decimal point
is replaced with the character '.'. Thousands
separators are read but not checked for valid positions until after
the entire number has been read. The set of valid characters depends
on the type of v and the flags, in particular the
basefield flags. If stream.flags(
) & basefield is
hex, hexadecimal characters are read; if it is
oct, only octal characters are read
('0'-'7'). If the
basefield is 0, the prefix determines the radix:
0x or 0X for hexadecimal,
0 for octal, and anything else for decimal.
Floating-point numbers can use fixed or exponential notation,
regardless of the flags.
If v is of type void*, the
format is implementation-defined in the same manner as the
%p format for scanf (in
<cstdio>).
After all the valid characters have been read, they are interpreted
as a numeric value. If the string is invalid, or if the thousands
groupings are incorrect, failbit is set in
err and v is not changed. If
the string is valid, its numeric value is stored in
v and err is set to
goodbit. If the entire input stream is read (up to
end), eofbit is set in
err.
See Also
money_get class template,
num_put class template,
numpunct class template,
basic_istream in
<istream>
num_put class template |
Facet for output of numbers
|
template <typename charT,
typename OutputIterator = ostreambuf_iterator<charT> >
class num_put : public locale::facet
{
public:
typedef charT char_type;
typedef OutputIterator iter_type;
explicit num_put(size_t refs = 0);
iter_type put(iter_type s, ios_base& f, char_type fill, bool v) const;
iter_type put(iter_type s, ios_base& f, char_type fill, long v) const;
iter_type put(iter_type s, ios_base& f, char_type fill, unsigned long v) const;
iter_type put(iter_type s, ios_base& f, char_type fill, double v) const;
iter_type put(iter_type s, ios_base& f, char_type fill, long double v) const;
iter_type put(iter_type s, ios_base& f, char_type fill, const void* v) const;
static locale::id id;
protected:
virtual ~num_put( );
virtual iter_type do_put(iter_type, ios_base&, char_type fill, bool v) const;
virtual iter_type do_put(iter_type, ios_base&, char_type fill, long v) const;
virtual iter_type do_put(iter_type, ios_base&, char_type fill, unsigned long)
const;
virtual iter_type do_put(iter_type, ios_base&, char_type fill, double v) const;
virtual iter_type do_put(iter_type, ios_base&, char_type fill, long double v)
const;
virtual iter_type do_put(iter_type, ios_base&, char_type fill, const void* v)
const;
};
|
|
The num_put class template is a facet for
formatting and outputing a numeric value. The
ostream output operators
(>>) use num_put. The
num_put<char> and
num_put<wchar_t> instantiations are
standard.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
put, which calls do_put. The
descriptions below are for the virtual functions because they do the
real work. Imagine that for each virtual function description, there
is a corresponding description for a public, nonvirtual function,
such as:
- iter_type put(iter_type out, ios_base& stream, char_type fill, bool v) const
-
Returns do_put(out, stream,
fill, v)
The following are the virtual, protected members of
num_put:
- virtual iter_type do_put(iter_type out, ios_base& stream, char_type fill, bool v) const
-
Writes a bool value to out. If
the boolalpha flag is clear, that is,
stream.flags( ) &
stream.boolalpha is 0, the
integer value of v is written as a number. If
boolalpha is set, v is written
as a word: if v is true,
truename( ) is written; if v is
false, falsename( ) is written
using the numpunct facet. For example:
const numpunct<charT>& n = use_facet<numpunct<charT> >;
string_type s = v ? n.truename( ) : n.falsename( );
// Write characters of s to out.
- virtual iter_type do_put (iter_type out, ios_base& stream , char_type fill , type v) const
-
Formats v as a string and writes the string
contents to out using the flags of
stream to control the formatting and the imbued
locale of stream to obtain the
ctype and numpunct facets for
punctuation rules and characters. The format also depends on
type:
- Integral types (long, unsigned long)
-
The format depends on the basefield flags
(stream.flags( ) &
basefield). If oct, the number
is formatted as octal; if hex, the number is
formatted as hexadecimal (using
'a'-'f' for the digits 10-16,
or 'A'-'F' if the
uppercase flag is set); or else the number is
decimal. If the showbase flag is set, a prefix is
used: 0 for octal, or 0x or
0X for hexadecimal (depending on the
uppercase flag).
- Floating-point types (double, long double)
-
The format depends on the floatfield flags
(stream.flags( ) &
floatfield). If fixed, the
format is fixed-point: an integer part, a decimal point, and a
fractional part. If scientific, the format is
exponential.
If the floatfield flags do not indicate
fixed or scientific, the
general format is used: exponential if the exponent is -4 or less or
greater than the precision (number of places after the decimal
point), or fixed otherwise. Trailing zeros are dropped, as is the
decimal point if would be the last character in the string.
If the uppercase flag is set, the exponent is
introduced by 'E', or else by
'e'. If the showpoint flag is
set, the decimal point is always present.
- Pointer (void*)
-
The output format for a pointer is implementation-defined.
If the number is negative, it is prefaced with a minus sign
('-'). If the number is positive, no sign is
output unless the showpos flag is set, in which
case a positive sign ('+') appears at the start of
the string.
If a decimal point character is needed, it is obtained from the
numpunct facet's
decimal_point( ) function. Integers have thousands
separators inserted according to the grouping( )
function. See numpunct later in this section for
more information.
If necessary, fill characters are inserted until
the formatted width is stream.width( ). The
stream's adjustfield flag
dictates how fill characters are inserted. That
is, stream.flags( ) &
stream.adjustfield is tested, and if it is equal
to:
- ios_base::internal
-
Fill characters are inserted after a sign (if present) or, if there
is no sign, after a leading 0x or
0X, or else at the start of the field.
- ios_base::left
-
Fill characters are appended to the end of the formatted field.
- Any other value
-
Fill characters are inserted at the start of the formatted field.
Finally, stream.width(0) is called to reset the
field width to 0. The return value is an iterator
that points to one past the last output character.
See Also
money_put class template,
num_get class template,
numpunct class template,
basic_ostream in
<ostream>
numpunct class template |
Facet for punctuation of numbers
|
template <typename charT>
class numpunct : public locale::facet
{
public:
typedef charT char_type;
typedef basic_string<charT> string_type;
explicit numpunct(size_t refs = 0);
char_type decimal_point( ) const;
char_type thousands_sep( ) const;
string grouping( ) const;
string_type truename( ) const;
string_type falsename( ) const;
static locale::id id;
protected:
virtual ~numpunct( );
virtual char_type do_decimal_point( ) const;
virtual char_type do_thousands_sep( ) const;
virtual string do_grouping( ) const;
virtual string_type do_truename( ) const;
virtual string_type do_falsename( ) const;
};
|
|
The numpunct class template is a facet for numeric
formatting and punctuation. The num_get and
num_put facets use numpunct.
The numpunct<char> and
numpunct<wchar_t> instantiations are
standard.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
grouping, which calls
do_grouping. The descriptions below are for the
virtual functions because they do the real work. Imagine that for
each virtual-function description, there is a corresponding
description for a public, nonvirtual function, such as:
- char_type decimal_point( ) const
-
Returns do_decimal_point( )
The following are the virtual, protected members of
numpunct:
- virtual char_type do_decimal_point( ) const
-
Returns the decimal point character, which is typically
'.' in U.S. locales and ',' in
European locales. In the "C" locale, the decimal
point is '.' or L'.'.
- virtual string_type do_falsename( ) const
-
Returns the textual representation for the value
false. In the standard instantiations
(numpunct<char> and
numpunct<wchar_t>), the value is
"false" or L"false".
- virtual string do_grouping( ) const
-
Returns a string that specifies the positions of thousands
separators. The string is interpreted as a vector of integers, in
which each value is a number of digits, starting from the right.
Thus, the string "\3" means every three digits
form a group. In the "C" locale, the grouping is
"" or L"".
- virtual char_type do_thousands_sep( ) const
-
Returns the character used to separate digit groups. (See
do_grouping earlier in this section.) In U.S.
locales, this is typically ',', and in European
locales, it is typically '.'. In the
"C" locale, the thousands separator is
'\0' or L'\0'.
- virtual string_type do_truename( ) const
-
Returns the textual representation for the value
true. In the standard instantiations
(numpunct<char> and
numpunct<wchar_t>), the value is
"true" or L"true".
See Also
moneypunct class template,
num_get class template, num_put
class template
numpunct_byname class template |
Facet for punctuation of numbers
|
template <typename charT>
class numpunct_byname : public numpunct<charT>
{
// This class is specialized for char and wchar_t.
public:
typedef charT char_type;
typedef basic_string<charT> string_type;
explicit numpunct_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in numpunct
};
|
|
The numpunct_byname class template is a facet for
numeric formatting and punctuation; it uses the rules of a named
locale. The numpunct_byname<char> and
numpunct_byname<wchar_t> instantiations are
standard.
See Also
numpunct class template
time_base class |
Base class for time facets
|
class time_base {
public:
enum dateorder { no_order, dmy, mdy, ymd, ydm };
};
|
|
The time_base class is a base class for the
time_get class template. It declares the
dateorder type. See time_get
for more information.
See Also
time_get class template
time_get class template |
Facet for input of dates and times
|
template <typename charT, typename InputIterator = istreambuf_iterator<charT> >
class time_get : public locale::facet, public time_base
{
public:
typedef charT char_type;
typedef InputIterator iter_type;
explicit time_get(size_t refs = 0);
dateorder date_order( ) const;
iter_type get_time(iter_type s, iter_type end, ios_base& f,
ios_base::iostate& err, tm* t) const;
iter_type get_date(iter_type s, iter_type end, ios_base& f,
ios_base::iostate& err, tm* t) const;
iter_type get_weekday(iter_type s, iter_type end,
ios_base& f, ios_base::iostate& err, tm* t) const;
iter_type get_monthname(iter_type s, iter_type end,
ios_base& f, ios_base::iostate& err, tm* t) const;
iter_type get_year(iter_type s, iter_type end, ios_base& f,
ios_base::iostate& err, tm* t) const;
static locale::id id;
protected:
virtual ~time_get( );
virtual dateorder do_date_order( ) const;
virtual iter_type do_get_time(iter_type s, iter_type end, ios_base&,
ios_base::iostate& err, tm* t) const;
virtual iter_type do_get_date(iter_type s, iter_type end, ios_base&,
ios_base::iostate& err, tm* t) const;
virtual iter_type do_get_weekday(iter_type s, iter_type end, ios_base&,
ios_base::iostate& err, tm* t) const;
virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base&,
ios_base::iostate& err, tm* t) const;
virtual iter_type do_get_year(iter_type s, iter_type end, ios_base&,
ios_base::iostate& err, tm* t) const;
};
|
|
The time_get class template is a facet for parsing
and reading dates and times from an input stream. The components of
the date and time value are stored in a tm
structure. (See <ctime> for more information
about tm.) The
time_get<char> and
time_get<wchar_t> instantiations are
standard.
Most of the time_get functions take an
err parameter in much the same way other facets
and their functions do. Unlike other facets, however, the
time_get functions do not set
err to goodbit upon success.
Instead, they only set failbit for an error. They
do not set eofbit if the end of the input sequence
is reached.
Most of the time_get functions take a
t parameter, which is a pointer to a
tm object, which is filled in with the relevant
parts of the date and time. If a function fails, the state of the
tm object is undefined.
As with other facets, the public members call virtual, protected
members with the same name prefaced by do_. Thus,
to use the facet, call the public functions, such as
get_date, which calls
do_get_date. The descriptions below are for the
virtual functions because they do the real work. Imagine that for
each virtual-function description, there is a corresponding
description for a public, nonvirtual function, such as:
- dateorder date_order( ) const
-
Returns do_date_order( )
The following are the virtual, protected members of
time_get:
- virtual dateorder do_date_order( ) const
-
Returns the order in which the day, month, and year appear in a
locale-specific date. If the formatted date includes additional
elements, the return value is no_order. See the
time_base class for the declaration of the
dateorder type.
- virtual iter_type do_get_time(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, tm* t) const
-
Reads characters from [begin,
end) and interprets them as a time, according to
the format of time_put<>::put, using the
'X' format. The time elements are stored in
*t. If the input is invalid, the state of
t's members is undefined, and
err is set to failbit. The
return value is an iterator that points to one past where the input
stopped.
- virtual iter_type do_get_date(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, tm* t) const
-
Reads characters from [begin,
end) and interprets them as a date, according to
the format of time_put<>::put, using the
'x' format. The date elements are stored in
*t. If the input is invalid, the state of
t's members is undefined, and
err is set to failbit. The
return value is an iterator that points to one past where the input
stopped.
- virtual iter_type do_get_weekday(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, tm* t) const
-
Reads characters from [begin,
end) until it reads the name of a day of the week,
either abbreviated or spelled out. The appropriate date elements are
stored in *t. If the input is invalid, the state
of t's members is undefined, and
err is set to failbit. The
return value is an iterator that points to one past where the input
stopped.
- virtual iter_type do_get_monthname(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, tm* t) const
-
Reads characters from [begin,
end) until it reads the name of a month, either
abbreviated or spelled out. The appropriate date elements are stored
in *t. If the input is invalid, the state of
t's members is undefined, and
err is set to failbit. The
return value is an iterator that points to one past where the input
stopped.
- virtual iter_type do_get_year(iter_type begin, iter_type end, ios_base& stream, ios_base::iostate& err, tm* t) const
-
Reads characters from [begin,
end) until it reads a year. It is up to the
implementation to determine whether two-digit years are accepted, and
if so, which century to apply to the abbreviated year. The
t->tm_year member is set appropriately. If the
input is invalid, the state of
t's members is undefined, and
err is set to failbit. The
return value is an iterator that points to one past where the input
stopped.
See Also
time_base class,
time_get_byname class template,
time_put class template, tm in
<ctime>
time_get_byname class template |
Facet for input of dates and times
|
template <typename charT, typename InputIterator = istreambuf_iterator<charT> >
class time_get_byname : public time_get<charT, InputIterator>
{
public:
typedef time_base::dateorder dateorder;
typedef InputIterator iter_type;
explicit time_get_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in time_get
};
|
|
The time_get_byname class template is a facet for
reading dates and times from an input stream using a named locale.
The time_get_byname<char> and
time_get_byname<wchar_t> instantiations are
standard.
See Also
time_get class template
time_put class template |
Facet for output of dates and times
|
template <typename charT, typename OutputIterator = ostreambuf_iterator<charT> >
class time_put : public locale::facet
{
public:
typedef charT char_type;
typedef OutputIterator iter_type;
explicit time_put(size_t refs = 0);
iter_type put(iter_type s, ios_base& f, char_type fill, const tm* tmb,
const charT* pattern, const charT* pat_end) const;
iter_type put(iter_type s, ios_base& f, char_type fill, const tm* tmb,
char format, char modifier = 0) const;
static locale::id id;
protected:
virtual ~time_put( );
virtual iter_type do_put(iter_type s, ios_base&, char_type, const tm* t,
char format, char modifier) const;
};
|
|
The time_put class template is a facet for
formatting and writing dates and times. The
time_put<char> and
time_put<wchar_t> instantiations are
standard.
Note that time_put is unlike other facets. The
public put function does not always directly call
do_put. Here are the complete descriptions of
put and do_put:
- iter_type put(iter_type out, ios_base& stream, char_type fill, const tm* t, const charT* pattern, const charT* pat_end) const
-
Reads the pattern in [pattern,
pat_end) and writes formatted date and time
information to out. The pattern contains ordinary
characters (which are written directly to out)
interspersed with format specifiers. A format specifier starts with
'%' and is followed by an optional modifier
character, which is followed in turn by a format specifier character.
The put function checks format characters by first
calling narrow from the
ctype<charT> facet, then checking the
narrowed character.
For each format specifier, put calls
do_put(out, stream,
fill, t,
format, modifier), in which
format is the format specifier and
modifier is the modifier character or
0 if no modifier is present.
The use of modifier characters is implementation-defined. The
standard does not define any modifiers. See the
do_put member function for more information.
- iter_type put(iter_type out, ios_base& stream, char_type fill, const tm* t, char format, char modifier = 0) const
-
Returns do_put(out, stream,
fill, t,
format, modifier).
- virtual iter_type do_put(iter_type out, ios_base& stream, char_type fill, const tm* t, char format, char modifier) const
-
Formats a single date or time element and writes the formatted
characters to out. The format
character specifies what to output (as shown in Table 13-22). The date and time information is obtained
from t.
The do_put function, unlike some of the other
output facets, does not use
stream's flags or field width.
The fill parameter is used by
implementation-defined formatting.
Table 13-22. Format specifiers for do_put
a
|
Abbreviated weekday name
|
A
|
Full weekday name
|
b
|
Abbreviated month name
|
B
|
Full month name
|
C
|
Complete date and time
|
D
|
Day of the month (01-31)
|
H
|
Hour (00-23); 24-hour clock
|
I
|
Hour (01-12); 12-hour clock
|
j
|
Day of the year (001-366)
|
m
|
Month (01-12)
|
M
|
Minutes (00-59)
|
P
|
A.M./P.M. designation for use with a 12-hour clock
|
S
|
Second (00-61); up to two leap
seconds
|
U
|
Week number (00-53); week 1
starts with the first Sunday
|
w
|
Weekday (0-6); Sunday is day 0
|
W
|
Week number (00-53); week 1
starts with first Monday
|
x
|
Date
|
X
|
Time
|
y
|
Year in century (00-99)
|
Y
|
Year
|
Z
|
Time zone name or abbreviation, or empty string if time zone is
unknown
|
%
|
Literal %
|
|
The use of modifier is implementation-defined. The
C++ standard recommends the use of POSIX modifiers, which are
'E' and 'O'. These modifiers
request the use of an alternative format if the locale has one. The
'E' modifier applies to certain format specifiers
to request an alternative representation for dates and times. The
'O' modifier applies to certain format specifiers
to request the use of alternative numeric symbols. If a locale cannot
honor the modified request, it uses the unmodified format specifier.
|
|
See Also
time_get class template,
time_put_byname class template,
<ctime>
time_put_byname class template |
Facet for output of dates and times
|
template <typename charT, typename OutputIterator = ostreambuf_iterator<charT> >
class time_put_byname : public time_put<charT,OutputIterator>
{
public:
typedef charT char_type;
typedef OutputIterator iter_type;
explicit time_put_byname(const char*, size_t refs = 0);
protected:
// . . . Same virtual functions as in time_put
};
|
|
The time_put class template is a facet for
formatting and writing dates and times using a named locale. The
time_put_byname<char> and
time_put_byname<wchar_t> instantiations are
standard.
See Also
time_put class template
tolower function template |
Converts a character to lowercase in a locale
|
template <typename charT>
charT tolower(charT c, const locale& loc);
|
|
The tolower function converts the character
c to lowercase using the locale
loc:
use_facet<ctype<charT> >(loc).tolower(c)
See Also
ctype class template, islower
function template, toupper function template
toupper function template |
Converts a character to uppercase in a locale
|
template <typename charT>
charT toupper(charT c, const locale& loc);
|
|
The toupper function converts the character
c to uppercase using the locale
loc:
use_facet<ctype<charT> >(loc).toupper(c)
See Also
ctype class template, isupper
function template, tolower function template
use_facet function template |
Retrieves a facet for a locale
|
template <typename Facet>
const Facet& use_facet(const locale& loc)
|
|
The use_facet function template obtains a facet
from locale loc. See Example 13-24 and Example 13-27, earlier in
this section.
See Also
has_facet function template,
locale::facet class
|