共用方式為


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 Standard。

類別會使用這些 iostream 預先定義的 Facet,來控制數值的轉換與文字序列之間的轉換。

locale 類別的物件也會將地區設定名稱儲存為 string 類別的物件。 使用無效的地區設定名稱來建構地區設定 facet 或地區設定物件時,會擲回 runtime_error 類別的物件。 儲存的地區設定名稱是 "*" ,如果地區設定對象無法確定 C 樣式地區設定與 物件所代表的地區設定完全對應。 否則,您可以藉由呼叫setlocale(LC_ALL , locale_object.名稱().c_str()),針對某些地區設定物件locale_object,在標準 C 連結庫中建立相符的地區設定。

在這個實作,您也可以呼叫靜態成員函式:

static locale empty();

建構沒有 facet 的地區設定物件。 這也是一個透明的地區設定。 如果範本函式has_facet且use_facet在透明地區設定中找不到要求的 Facet,則會先諮詢全域地區設定,然後,如果是透明,則為傳統地區設定。 您可以寫入︰

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

後續的 cout 插入會由全域地區設定的目前狀態所調解。 您甚至可以撰寫:

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

cout.imbue(loc);

即使全域地區設定提供插入日期和貨幣金額數量的變更規則,對 cout 後續插入的數字格式化規則與 C 地區設定保持相同。

建構函式

建構函式 描述
地區設定 建立地區設定、地區設定複本,或 facet 或分類已被其他地區設定的 facet 或分類取代的地區設定複本。

Typedefs

類型名稱 描述
category 整數類型,提供位元遮罩值以表示標準 facet 系列。

成員函式

成員函數 描述
combine 將指定之地區設定的 facet 插入至目標地區設定。
name 傳回儲存的地區設定名稱。

靜態函式

名稱 描述
classic 此靜態成員函式傳回表示傳統 C 地區設定的地區設定物件。
全域 重設程式的預設地區設定。

操作員

運算子 描述
operator= 指派地區設定。
operator!= 測試兩個地區設定是否不等。
operator( ) 比較兩個 basic_string 物件。
operator== 測試兩個地區設定是否相等。

類別

類別 描述
facet 做為所有地區設定 facet 之基底類別的類別。
id 此成員類別提供唯一 facet 項目識別,做為用於地區設定中查詢 facet 的索引鍵。

需求

Header:<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 類型同義,int 類型可代表 locale 類別本機位元遮罩類型的一組不同元素,或可用來代表任何對應的 C locale 類別。 這些元素如下:

  • 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

您可以使用位 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 的地區設定。

傳回值

成員函式會傳回地區設定物件,此物件會取代 或 加入至*thissource_locale中列出的 FacetFacet

範例

// 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 的建構函式應該有零 個參考 自變數。 不再需要物件時,即會將其刪除。 只有在您負責物件存留期的罕見情況下,才提供非零 參考 自變數。

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 類別

此成員類別提供唯一 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);

會取代 其他 對應至 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_categoryreplace_category & new_category的 Facet 取代 。

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

如果new_facet不是 Null 指標,則會取代 from_locale facet new_facet。

如果地區設定名稱 locale_name 為 null 指標或無效,則函式會 擲回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()

根據本地區設定 Facet std::collate<charT> 所定義的語彙比較規則,比較兩個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
要比較的第二個字串。

傳回值

  • 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++ 標準程式庫中的執行緒安全