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_COLLATEctype
,對應至 C 類別LC_CTYPEmonetary
,對應至 C 類別LC_MONETARYnumeric
,對應至 C 類別LC_NUMERICtime
,對應至 C 類別LC_TIMEmessages
,對應至 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 的地區設定。
傳回值
成員函式會傳回地區設定物件,此物件會取代 或 加入至*this
source_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.