num_get 類別
類別範本,描述可做為地區設定 Facet 的物件,以控制型 CharType
別序列轉換成數值的序列。
語法
template <class CharType, class InputIterator = istreambuf_iterator<CharType>>
class num_get : public locale::facet;
參數
CharType
程式內用於編碼地區設定字元的類型。
InputIterator
數值 get 函式從中讀取其輸入的迭代器類型。
備註
如同所有地區設定 facet,靜態物件識別碼有初始儲存值零。 第一次嘗試存取它的儲存值時,會在 id 中儲存一個唯一的正值。
建構函式
建構函式 | 描述 |
---|---|
num_get | 用來從序列擷取數值之 num_get 類型物件的建構函式。 |
Typedefs
類型名稱 | 描述 |
---|---|
char_type | 類型,用來描述由地區設定使用的字元。 |
iter_type | 描述輸入迭代器的類型。 |
成員函式
成員函數 | 描述 |
---|---|
do_get | 虛擬函式,呼叫以從字元序列擷取數值或布林值。 |
get | 從字元序列擷取數值或布林值。 |
需求
Header:<locale>
命名空間:std
num_get::char_type
類型,用來描述由地區設定使用的字元。
typedef CharType char_type;
備註
此類型與範本參數 CharType 同義。
num_get::d o_get
虛擬函式,呼叫以從字元序列擷取數值或布林值。
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned short& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned int& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
float& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
參數
first
要從中讀取數字的字元範圍開頭。
last
要從中讀取數字的字元範圍結尾。
iosbase
旗標供轉換使用的 ios_base。
state
失敗時會新增 failbit (請參閱 ios_base::iostate) 的狀態。
val
已讀取的值。
傳回值
已讀取值之後的迭代器。
備註
第一個虛擬的受保護成員函式
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long& val) const;
會比對序列中從第一個開始的循序[first, last)
專案,直到它辨識出完整的無空整數輸入字段為止。 如果成功,它會將此字段轉換成其相等值做為類型long
,並將結果儲存在 val 中。 它會傳回迭代器,此迭代器指定數字輸入欄位後的第一個元素。 否則,函式會將任何項目儲存在 val 中,並在 中state
設定 ios_base::failbit
。 它會傳回迭代器,此迭代器指定有效整數輸入欄位之任何前置詞後的第一個元素。 不論是上述哪一種情況,如果傳回值等於 last
,函式就會在 state
中設定 ios_base::eofbit
。
轉換整數輸入欄位的規則,與掃描函式在比對及轉換來自某個檔案的一系列 char
元素時所使用的規則相同。 (假設每個這類 char
元素都會以簡單、一對一的對應方式對應至類型的 Elem
對等專案。對等掃描轉換規格的判斷方式如下:
如果 iosbase.
ios_base::flags() & ios_base::basefield == ios_base::
oct,則轉換規格為 lo
。
如果 iosbase.flags() & ios_base::basefield == ios_base::
hex,則轉換規格為 lx
。
如果 iosbase.flags() & ios_base::basefield == 0
,則轉換規格為 li
。
否則,轉換規格會是 ld
。
整數輸入欄位的格式會進一步由呼叫use_facet numpunct<Elem>(iosbase.
ios_base<
::getloc())
所傳回的地區設定 Facetfac
決定。 具體而言:
fac.
numpunct::grouping()
會決定任何小數點左邊數字分組的方式
fac.
numpunct::thousands_sep()
會決定任何小數點左邊分隔數字群組的序列。
如果沒有任何 fac.thousands_sep()
執行個體出現在數字輸入欄位中,就不會施加任何千分號條件約束。 否則,將會強制執行 fac.grouping()
所施加的任何千分號條件約束,並在進行掃描轉換之前將分隔符號移除。
第四個虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
行為與第一個相同,不同的是,它會以 lu
取代 ld
轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的unsigned long
值,並將該值儲存在 val 中。
第五個虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long long& val) const;
行為與第一個相同,不同的是,它會以 lld
取代 ld
轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的long long
值,並將該值儲存在 val 中。
第六個虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long long& val) const;
行為與第一個相同,不同的是,它會以 llu
取代 ld
轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的unsigned long long
值,並將該值儲存在 val 中。
第七個虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
float& val) const;
行為與第一個相同,不同的是,它會盡力比對出完整、非空白的浮點數輸入欄位。 fac.
numpunct::decimal_point()
會決定將整數與小數分隔的序列。 對等掃描轉換指定名稱是 lf
。
第八個虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
行為與第一個相同,不同的是,它會盡力比對出完整、非空白的浮點數輸入欄位。 fac.
numpunct::decimal_point()
會決定將整數與小數分隔的序列。 對等掃描轉換指定名稱是 lf
。
第九個虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
行為與第八個相同,不同的是,對等掃描轉換指定名稱是 Lf
。
第十個虛擬受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
行為與第一個相同,不同的是,對等掃描轉換指定名稱是 p
。
最後一個 (第十一個) 虛擬的受保護成員函式:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
行為與第一個相同,不同的是,它會盡力比對出完整、非空白的布林值輸入欄位。 如果成功,它會將布爾值輸入字段轉換成 類型的bool
值,並將該值儲存在 val 中。
布林值輸入欄位採用下列兩種形式其中之一。 如果 iosbase.flags() & ios_base::
boolalpha 為 false,它就與整數輸入欄位相同,不同的是,轉換的值必須是 0 (代表 false) 或 1 (代表 true)。 否則,序列必須與 fac.
numpunct::falsename()
(代表 false) 或 fac.
numpunct::truename()
(代表 true) 相符。
範例
請參閱 get 的範例,其中會由 do_get
呼叫此虛擬成員函式。
num_get::get
從字元序列擷取數值或布林值。
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned short& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned int& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
float& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
參數
first
要從中讀取數字的字元範圍開頭。
last
要從中讀取數字的字元範圍結尾。
iosbase
旗標供轉換使用的 ios_base。
state
失敗時會新增 failbit (請參閱 ios_base::iostate) 的狀態。
val
已讀取的值。
傳回值
已讀取值之後的迭代器。
備註
所有成員函式都會傳回 do_get( first, last, iosbase, state, val)
。
第一個虛擬的受保護成員函式會嘗試比對序列 [ first
, last
) 中從 first 開始的一系列元素,直到它辨識出完整、非空白的整數輸入欄位為止。 如果成功,它會將此字段轉換成其相等值做為類型long
,並將結果儲存在 val 中。 它會傳回迭代器,此迭代器指定數字輸入欄位後的第一個元素。 否則,函式會將任何專案儲存在 val 中,並設定ios_base::failbit
為 狀態。 它會傳回迭代器,此迭代器指定有效整數輸入欄位之任何前置詞後的第一個元素。 在任一情況下,如果傳回值等於 last,則函式 ios_base::eofbit
會設定為 狀態。
轉換整數輸入欄位的規則,與掃描函式在比對及轉換來自某個檔案的一系列 char
元素時所使用的規則相同。 每個這類 char
專案都假設透過簡單、一對一的對應對應對應至類型的 CharType
對等專案。 對等的掃描轉換規格是以下列方式決定:
如果
iosbase.
旗標為& ios_base::basefield == ios_base::
oct,則轉換規格為 。lo
如果
iosbase.flags & ios_base::basefield == ios_base::
hex,則轉換規格為lx
。如果
iosbase.flags & ios_base::basefield == 0
,則轉換規格為li
。否則,轉換規格會是
ld
。
整數輸入欄位的格式會進一步由呼叫傳回的地區設定 facet fac
來決定use_facet<Elem>(iosbase.
<
numpunct
getloc。())
具體而言:
fac.
grouping 會決定任何小數點左邊數字分組的方式。fac.
thousands_sep 會決定任何小數點左邊分隔數字群組的序列。
如果沒有任何 fac.thousands_sep
執行個體出現在數字輸入欄位中,就不會施加任何千分號條件約束。 否則,會強制執行 所 fac.grouping
強加的任何群組條件約束,並在掃描轉換發生之前移除分隔符。
第二個虛擬的受保護成員函式:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
行為與第一個相同,不同的是,它會以 lu
取代 ld
轉換規格。 如果成功,它會將數值輸入字段轉換成 類型的unsigned long
值,並將該值儲存在 val 中。
第三個虛擬的受保護成員函式:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
行為與第一個相同,不同的是,它會嘗試比對出完整、非空白的浮點數輸入欄位。 fac.
decimal_point 會決定將整數與小數分隔的序列。 對等掃描轉換指定名稱是 lf
。
第四個虛擬的受保護成員函式:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
行為相同的第三個,不同之處在於對等的掃描轉換規範是 Lf
。
第五個虛擬的受保護成員函式:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
行為與第一個相同,不同的是,對等掃描轉換指定名稱是 p
。
第六個虛擬的受保護成員函式:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
行為與第一個相同,不同的是,它會嘗試比對出完整、非空白的布林值輸入欄位。 如果成功,它會將布爾值輸入字段轉換成 類型的bool
值,並將該值儲存在 val 中。
布林值輸入欄位採用下列兩種形式其中之一。 如果 iosbase.flags & ios_base::
boolalpha 是 false
,它與整數輸入字段相同,不同之處在於轉換的值必須是 0 (for false
) 或 1 (針對 true
)。 否則,序列必須符合 fac.
falsename (針對 false
), 或fac.
truename (針對 true
)。
範例
// num_get_get.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
locale loc( "german_germany" );
basic_stringstream<char> psz, psz2;
psz << "-1000,56";
ios_base::iostate st = 0;
long double fVal;
cout << use_facet <numpunct <char> >(loc).thousands_sep( ) << endl;
psz.imbue( loc );
use_facet <num_get <char> >
(loc).get( basic_istream<char>::_Iter( psz.rdbuf( ) ),
basic_istream<char>::_Iter(0), psz, st, fVal );
if ( st & ios_base::failbit )
cout << "money_get( ) FAILED" << endl;
else
cout << "money_get( ) = " << fVal << endl;
}
num_get::iter_type
描述輸入迭代器的類型。
typedef InputIterator iter_type;
備註
此類型是範本參數 InputIterator
的同義字。
num_get::num_get
用來從序列擷取數值之 num_get
類型物件的建構函式。
explicit num_get(size_t refs = 0);
參數
裁判
整數值,用來指定物件的記憶體管理類型。
備註
refs 參數的可能值及其重要性如下:
0:物件的存留期由包含該物件的地區設定來管理。
1:物件的存留期必須以手動方式管理。
> 1:未定義這些值。
無法提供任何直接範例,因為解構函式受到保護。
建構函式會使用 locale::
Facet(refs)
初始化其基底物件。