locale 类

一种描述区域设置对象的类,此对象用于将特定于文化的信息封装为一组 facet 以共同定义特定本地化环境。

语法

class locale;

备注

facet 是指向派生自 facet 类的类对象的指针,该类具有以下格式的公共对象:

static locale::id id;

可以定义这些 facet 的开放式集。 还可以构建指定任意个 facet 的区域设置对象。

这些 facet 的预定义组表示传统上在标准 C 库中由函数 setlocale 管理的区域设置类别

类别 collate (LC_COLLATE) 包括以下 facet:

collate<char>
collate<wchar_t>

类别 ctype (LC_CTYPE) 包括以下 facet:

ctype<char>
ctype<wchar_t>
codecvt<char, char, mbstate_t>
codecvt<wchar_t, char, mbstate_t>
codecvt<char16_t, char, mbstate_t>
codecvt<char32_t, char, mbstate_t>

类别 monetary (LC_MONETARY) 包括以下 facet:

moneypunct<char, false>
moneypunct<wchar_t, false>
moneypunct<char, true>
moneypunct<wchar_t, true>
money_get<char, istreambuf_iterator<char>>
money_get<wchar_t, istreambuf_iterator<wchar_t>>
money_put<char, ostreambuf_iterator<char>>
money_put<wchar_t, ostreambuf_iterator<wchar_t>>

类别 numeric (LC_NUMERIC) 包括以下 facet:

num_get<char, istreambuf_iterator<char>>
num_get<wchar_t, istreambuf_iterator<wchar_t>>
num_put<char, ostreambuf_iterator<char>>
num_put<wchar_t, ostreambuf_iterator<wchar_t>>
numpunct<char>
numpunct<wchar_t>

类别 time (LC_TIME) 包括以下 facet:

time_get<char, istreambuf_iterator<char>>
time_get<wchar_t, istreambuf_iterator<wchar_t>>
time_put<char, ostreambuf_iterator<char>>
time_put<wchar_t, ostreambuf_iterator<wchar_t>>

类别 messages (LC_MESSAGES) 包括以下 facet:

messages<char>
messages<wchar_t>

(最后一个类别是 POSIX 需要而非 C 标准需要的类别。)

其中某些预定义的 facet 由 iostream 类使用,用来控制数值与文本序列的相互转换。

locale 类的对象还将区域设置名称存储为字符串类的对象。 若使用无效区域设置名称构造区域设置 facet 或区域设置对象,将引发 runtime_error 类的对象。 如果区域设置对象无法确定 C 样式区域设置与此对象表示的区域设置完全对应,则存储的区域设置名称为 "*"。 如果能够确定,可以在标准 C 库中通过调用 setlocale(LC_ALL , locale_object.name().c_str()) 为某个区域设置对象 locale_object 建立匹配的区域设置。

在此实现中,还可以调用静态成员函数:

static locale empty();

构造不包含 facet 的区域设置对象。 这也是透明区域设置。 如果模板函数 has_facetuse_facet 在透明区域设置中找不到请求的 facet,将先参考全局区域设置,如果此为透明区域设置,则将再参考经典区域设置。 因此,可以写入:

cout.imbue(locale::empty());

cout 的后续插入通过全局区域设置的当前状态调整。 你还可以编写:

locale loc(locale::empty(),
    locale::classic(),
    locale::numeric);

cout.imbue(loc);

cout 的后续插入的数值格式设置规则与 C 区域设置相同,即使全局区域设置提供有关插入日期和货币金额的更改规则也是如此。

构造函数

构造函数 说明
区域设置 创建区域设置、区域设置副本,或其中的 facet 或类别替换为其他区域设置中的 facet 类别的区域设置副本。

Typedef

类型名称 说明
category 一种整数类型,此类型提供位掩码值以表示标准 facet 系列。

成员函数

成员函数 说明
combine 将指定区域设置中的 facet 插入到目标区域设置。
name 返回存储的区域设置名称。

静态函数

名称 描述
经典 此静态成员函数返回表示经典 C 区域设置的区域设置对象。
global 重置程序的默认区域设置。

运算符

运算符 说明
operator= 分配一个区域设置。
operator!= 测试两个区域设置是否不相等。
operator( ) 比较两个 basic_string 对象。
operator== 测试两个区域设置是否相等。

说明
facet 一种类,此类用作所有区域设置 facet 的基类。
id 成员类提供用作索引以查找区域设置中的 facet 的唯一 facet 标识。

要求

标头:<locale>

命名空间: std

locale::category

一种整数类型,此类型提供位掩码值以表示标准 facet 系列。

typedef int category;
static const int collate = LC_COLLATE;
static const int ctype = LC_CTYPE;
static const int monetary = LC_MONETARY;
static const int numeric = LC_NUMERIC;
static const int time = LC_TIME;
static const int messages = LC_MESSAGES;
static const int all = LC_ALL;
static const int none = 0;

注解

该类型为类型 int 的同义词,可表示类区域设置的本地位掩码类型的一组非重复元素,或可用于表示任何对应的 C 区域设置类别。 这些元素为:

  • collate,对应于 C 类 LC_COLLATE

  • ctype,对应于 C 类 LC_CTYPE

  • monetary,对应于 C 类 LC_MONETARY

  • numeric,对应于 C 类 LC_NUMERIC

  • time,对应于 C 类 LC_TIME

  • messages,对应于 POSIX 类 LC_MESSAGES

还有两个有用的值:

  • none,不对应任何 C 类

  • all,对应于所有 C 类 LC_ALL

可以通过将 bitwise-OR 与这些常量配合使用来表示任意一组类别,如 monetary | time

locale::classic

此静态成员函数返回表示经典 C 区域设置的区域设置对象。

static const locale& classic();

返回值

C 区域设置的引用。

备注

经典 C 区域设置是标准 C 库中的美国英语 ASCII 区域设置。 它是在尚未国际化的程序中隐式使用的区域设置。

示例

// locale_classic.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "german" );
   locale loc2 = locale::global( loc1 );
   cout << "The name of the previous locale is: " << loc2.name( )
        << "." << endl;
   cout << "The name of the current locale is: " << loc1.name( )
        << "." << endl;

   if (loc2 == locale::classic( ) )
      cout << "The previous locale was classic." << endl;
   else
      cout << "The previous locale was not classic." << endl;

   if (loc1 == locale::classic( ) )
      cout << "The current locale is classic." << endl;
   else
      cout << "The current locale is not classic." << endl;
}
The name of the previous locale is: C.
The name of the current locale is: German_Germany.1252.
The previous locale was classic.
The current locale is not classic.

locale::combine

将指定区域设置中的 facet 插入到目标区域设置。

template <class Facet>
locale combine(const locale& source_locale) const;

参数

source_locale
包含要插入到目标区域设置的 facet 的区域设置。

返回值

该成员函数将返回一个区域设置对象,该对象在 source_locale 中列出的 *this the facet Facet 中进行替换或添加到其中。

示例

// locale_combine.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main() {
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s; it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc ) << result1 << endl;

   locale loc2 ( "C" );
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc2 )  << result2 << endl;

   locale loc3 = loc2.combine<collate<_TCHAR> > (loc);
   int result3 = use_facet<collate<_TCHAR> > ( loc3 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc3 ) << result3 << endl;
}

facet 类

一种类,此类用作所有区域设置 facet 的基类。

class facet {
protected:
    explicit facet(size_t references = 0);
    virtual ~facet();
private:
    facet(const facet&) // not defined
    void operator=(const facet&) // not defined
};

备注

不能复制或分配类 facet的对象。 可以构造和销毁派生自类 locale::facet 的对象,但不能构造和销毁适当的基类对象。 通常情况下,构造 locale 时将构造一个派生自 facet 的对象 _Myfac,如 locale loc(locale::classic(), new _Myfac);

在这种情况下,基类 facet 的构造函数应具有一个零 references 自变量。 当不再需要该对象时,将删除。 仅在负责该对象的生存期这样极少数情况下提供非零 references 自变量。

locale::global

重置程序的默认区域设置。 此调用将影响 C 和 C++ 的全局区域设置。

static locale global(const locale& new_default_locale);

参数

new_default_locale
要由该程序用作默认区域设置的区域设置。

返回值

重置默认区域设置之前的上一个区域设置。

注解

在程序启动时,全局区域设置与经典区域设置相同。 global() 函数调用 setlocale( LC_ALL, loc.name. c_str()) 以在标准 C 库中建立匹配的区域设置。

示例

// locale_global.cpp
// compile by using: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( )
{
   locale loc ( "German_germany" );
   locale loc1;
   cout << "The initial locale is: " << loc1.name( ) << endl;
   locale loc2 = locale::global ( loc );
   locale loc3;
   cout << "The current locale is: " << loc3.name( ) << endl;
   cout << "The previous locale was: " << loc2.name( ) << endl;
}
The initial locale is: C
The current locale is: German_Germany.1252
The previous locale was: C

id Class

成员类提供用作索引以查找区域设置中的 facet 的唯一 facet 标识。

class id
{
   protected:    id();
   private:      id(const id&)
   void operator=(const id&)  // not defined
};

注解

该成员类描述每个唯一区域设置 facet 所需的静态成员对象。 不能复制或分配类 id的对象。

locale::locale

创建区域设置、区域设置副本,或其中的 facet 或类别替换为其他区域设置中的 facet 类别的区域设置副本。 还包括一个析构函数。

locale();

explicit locale(const char* locale_name, category new_category = all);
explicit locale(const string& locale_name);
locale(const locale& from_locale);
locale(const locale& from_locale, const locale& Other, category new_category);
locale(const locale& from_locale, const char* locale_name, category new_category);

template <class Facet>
locale(const locale& from_locale, const Facet* new_facet);

~locale();

参数

locale_name
区域设置的名称。

from_locale
要进行复制以便用于构造新区域设置的区域设置。

其他
要从中选择一种类别的区域设置。

new_category
要替换为构造的区域设置的类别。

new_facet
要替换为构造的区域设置的 facet。

注解

第一个构造函数将初始化该对象,以便匹配全局构造函数。 第二和第三个构造函数初始化所有区域设置类别,以便具有与区域设置名称 locale_name 一致的行为。 剩余的构造函数将复制 from_locale,并出现以下异常:

locale(const locale& from_locale, const locale& Other, category new_category);

从 Other 替换对应于 C & new_category 为非零值的某个类别 C 的 facet。

locale(const locale& from_locale, const char* locale_name, category new_category);

locale(const locale& from_locale, const string& locale_name, category new_category);

locale(locale_name, all) 替换对应于类别 replace_category 的 facet,其 replace_category & new_category 为非零值。

template<class Facet> locale(const locale& from_locale, Facet* new_facet);

如果 new_facet 不是空指针,则在 from_locale 中替换(或添加到)facet new_facet

如果区域设置名称 locale_name 为空指针或无效,则该函数将引发 runtime_error

示例

// locale_locale.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( ) {

   // Second constructor
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s, it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc ) << result1 << endl;

   // The first (default) constructor
   locale loc2;
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc2 )  << result2 << endl;

   // Third constructor
   locale loc3 (loc2,loc, _M_COLLATE );
   int result3 = use_facet<collate<_TCHAR> > ( loc3 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc3 ) << result3 << endl;

   // Fourth constructor
   locale loc4 (loc2, "German_Germany", _M_COLLATE );
   int result4 = use_facet<collate<_TCHAR> > ( loc4 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc4 ) << result4 << endl;
}

locale::name

返回存储的区域设置名称。

string name() const;

返回值

一个字符串,它提供区域设置的名称。

示例

// locale_name.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "german" );
   locale loc2 = locale::global( loc1 );
   cout << "The name of the previous locale is: "
        << loc2.name( ) << "." << endl;
   cout << "The name of the current locale is: "
        << loc1.name( ) << "." << endl;
}
The name of the previous locale is: C.
The name of the current locale is: German_Germany.1252.

locale::operator=

分配一个区域设置。

const locale& operator=(const locale& other) noexcept;

locale::operator!=

测试两个区域设置是否不相等。

bool operator!=(const locale& right) const;

参数

right
要测试不相等的区域设置之一。

返回值

如果区域设置不是相同区域设置的副本,则是为 true 的布尔值。 如果区域设置是相同区域设置的副本,则为 false

备注

如果两个区域设置是相同的区域设置,或一个区域设置是另一个的副本,又或者它们具有相同的名称,则这两个区域设置相等。

示例

// locale_op_ne.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "German_Germany" );
   locale loc2( "German_Germany" );
   locale loc3( "English" );

   if ( loc1 != loc2 )
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc2 (" << loc2.name( ) << ") are not equal." << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc2 (" << loc2.name( ) << ") are equal." << endl;

   if ( loc1 != loc3 )
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc3 (" << loc3.name( ) << ") are not equal." << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc3 (" << loc3.name( ) << ") are equal." << endl;
}
locales loc1 (German_Germany.1252) and
loc2 (German_Germany.1252) are equal.
locales loc1 (German_Germany.1252) and
loc3 (English_United States.1252) are not equal.

locale::operator()

根据此区域设置的 std::collate<charT> facet 定义的词典比较规则,比较两个 basic_string 对象。

template <class CharType, class Traits, class Allocator>
bool operator()(
    const basic_string<CharType, Traits, Allocator>& left,
    const basic_string<CharType, Traits, Allocator>& right) const;

参数

left
要比较的第一个字符串。

right
要比较的第二个字符串。

返回值

  • 如果 left 按字典顺序小于 right,则为 true;否则为 false

备注

该成员函数有效执行以下操作:

const collate<CharType>& fac = use_fac<collate<CharType>>(*this);

return (fac.compare(left.begin(), left.end(), right.begin(), right.end()) < 0);

这意味着可以将区域设置对象用作函数对象。

示例

// locale_op_compare.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

int main( )
{
   using namespace std;
   const wchar_t *sa = L"ztesting";
   const wchar_t *sb = L"\0x00DFtesting";
   basic_string<wchar_t> a( sa );
   basic_string<wchar_t> b( sb );

   locale loc( "German_Germany" );
   cout << loc( a,b ) << endl;

   const collate<wchar_t>& fac = use_facet<collate<wchar_t> >( loc );
   cout << ( fac.compare( sa, sa + a.length( ),
       sb, sb + b.length( ) ) < 0) << endl;
}
0
0

locale::operator==

测试两个区域设置是否相等。

bool operator==(const locale& right) const;

参数

right
要测试相等的区域设置之一。

返回值

如果区域设置是相同区域设置的副本,则是为 true 的布尔值。 如果区域设置不是相同区域设置的副本,则为 false

注解

如果两个区域设置是相同的区域设置,或一个区域设置是另一个的副本,又或者它们具有相同的名称,则这两个区域设置相等。

示例

// locale_op_eq.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "German_Germany" );
   locale loc2( "German_Germany" );
   locale loc3( "English" );

   if ( loc1 == loc2 )
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc2 (" << loc2.name( ) << ") are equal."
      << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc2 (" << loc2.name( ) << ") are not equal."
      << endl;

   if ( loc1 == loc3 )
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc3 (" << loc3.name( ) << ") are equal."
      << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc3 (" << loc3.name( ) << ") are not equal."
      << endl;
}
locales loc1 (German_Germany.1252)
and loc2 (German_Germany.1252) are equal.
locales loc1 (German_Germany.1252)
and loc3 (English_United States.1252) are not equal.

另请参阅

<区域设置>
代码页
区域设置名称、语言和国家/地区字符串
C++ 标准库中的线程安全