num_put 類別
類別範本,描述可做為地區設定 Facet 的物件,以控制數值轉換為 型 CharType
別序列的轉換。
語法
template <class CharType,
class OutputIterator = ostreambuf_iterator<CharType>>
class num_put : public locale::facet;
參數
CharType
程式內用於編碼地區設定字元的類型。
OutputIterator
數值 put 函式將其輸出寫入其中的迭代器類型。
備註
如同所有地區設定 facet,靜態物件識別碼有初始儲存值零。 第一次嘗試存取它的儲存值時,會在 id 中儲存一個唯一的正值。
建構函式
建構函式 | 描述 |
---|---|
num_put | num_put 類型物件的建構函式。 |
Typedefs
類型名稱 | 描述 |
---|---|
char_type | 類型,用來描述由地區設定使用的字元。 |
iter_type | 描述輸出迭代器的類型。 |
成員函式
成員函數 | 描述 |
---|---|
do_put | 虛擬函式,呼叫以將數字轉換成 CharType 序列,表示為特定地區設定格式化的數字。 |
put | 將數字轉換成 CharType 序列,表示為特定地區設定格式化的數字。 |
需求
Header:<locale>
命名空間:std
num_put::char_type
類型,用來描述由地區設定使用的字元。
typedef CharType char_type;
備註
此類型是範本參數 CharType
的同義字。
num_put::d o_put
虛擬函式,呼叫以將數字轉換成 CharType
序列,表示為特定地區設定格式化的數字。
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
bool val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
long val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
unsigned long val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
double val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
long double val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
const void* val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
const long long val) const;
virtual iter_type do_put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
const unsigned long long val) const;
參數
下一步
迭代器,定址對象是所插入字串的第一個元素。
_Iosbase
指定的資料流,其中包含帶有 numpunct facet 的地區設定,可用來為輸出和旗標加上標點符號以設定輸出格式。
_填補
間距所使用的字元。
val
要輸出的數字或布林值類型。
傳回值
輸出迭代器,定址對象是所產生之最後一個元素的後面一個位置。
備註
第一個虛擬受保護的成員函式會產生循序專案,從 val 值產生整數輸出欄位。 此函式會傳回迭代器,此迭代器指定在所產生的整數輸出欄位後下一個要插入元素的位置。
產生整數輸出欄位的規則,與列印函式在將一系列 char
元素產生至檔案時所使用的規則相同。 每個這類char元素都假設是透過簡單、一對一的對應對應至類型的 CharType
對等專案。 不過,列印函式會以空白或數位 0 填補欄位, do_put
而是使用 fill
。 對等的列印轉換規格是以下列方式決定:
如果 iosbase. flags &
ios_base::basefield
==ios_base::
oct,轉換規格為 。lo
如果 iosbase.flags & ios_base::basefield ==
ios_base::
十六進位,則轉換規格為 。lx
否則,轉換規格會是
ld
。
如果 iosbase. width 不是零,就會在前面加上此值的欄位寬度。 接著,函式會呼叫 iosbase. width(0) 將欄位寬度重設為零。
只有當指定輸出欄位所需的元素數目下限 N 小於 iosbase. width 時,才需要進行填補。 這類填補是由填滿的 N - 寬度複本序列所組成。 接著,填補會以下列方式進行:
如果 iosbase. flags &
ios_base::adjustfield
==ios_base::
left,旗標 - 會加上前面。 (填補的發生位置是在已產生的文字之後)。如果 iosbase.flags 和 ios_base::adjustfield
ios_base::
== 內部,則旗標 0 前面會加上。 (就數字輸出欄位而言,會在列印函式以 0 填補的地方進行填補)。否則,不會在前面加上任何額外的旗標。 (填補字元會出現在已產生的序列之前)。
最後:
如果 iosbase. flags 和
ios_base::
showpos 為非零,旗標 + 會預先加上轉換規格。如果 iosbase. flags & ios_base::showbase 為非零,旗標 # 會預先加上轉換規格。
整數輸出欄位格式是由呼叫use_facet<numpunct<Elem>(iosbase) 所傳回的地區設定 Facetfac 進一步決定。 getloc)。 具體而言:
fac. grouping 會決定任何小數點左邊數字分組的方式
fac. thousands_sep 會決定任何小數點左邊分隔數字群組的序列
如果 fac. grouping (其第一個元素的值為 CHAR_MAX) 未施加任何千分號條件約束,就不會有任何 fac. thousands_sep
執行個體在輸出欄位中產生。 否則,會在進行列印轉換之後插入分隔符號。
第二個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& _Iosbase,
CharType _Fill,
unsigned long val) const;
行為與第一個相同,不同的是,它會以 lu
取代 ld
轉換規格。
第三個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& _Iosbase,
CharType _Fill,
double val) const;
行為與第一個相同,不同的是,它會從 val 的值產生浮點數輸出欄位。 fac. decimal_point 會決定將整數與小數分隔的序列。 對等的列印轉換規格是以下列方式決定:
如果 iosbase. flags &
ios_base::floatfield
==ios_base::
fixed,轉換規格為 。lf
如果 iosbase. flags & ios_base::floatfield ==
ios_base::
科學,轉換規格為 。le
如果 iosbase. flags 和ios_base::
uppercase 為非零,e
會取代為E
。否則,轉換規格會是 lg。 如果 iosbase. flags & ios_base::uppercase 為非零,
g
會取代為G
。
如果 iosbase. flags & ios_base::fixed 為非零或 iosbase。 precision 大於零,就會在轉換規格前面加上值為 iosbase. precision 的有效位數。 所有填補行為都與整數輸出欄位的填補行為相同。 填補字元為 fill。 最後:
如果 iosbase. flags 和
ios_base::
showpos 為非零,旗標 + 會預先加上轉換規格。如果 iosbase. flags 和
ios_base::
showpoint 為非零值,旗標 # 會加上轉換規格的前面。
第四個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& _Iosbase,
CharType _Fill,
long double val) const;
行為相同的第三個,不同之處在於轉換規格中的限定符 l
會取代為 L
。
第五個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& _Iosbase,
CharType _Fill,
const void* val) const;
行為與第一個相同,不同的是,轉換規格為 p
, 再加上指定填補時所需的任何限定詞。
第六個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& _Iosbase,
CharType _Fill,
bool val) const;
行為與第一個相同,不同之處在於它會從 val 產生布爾輸出欄位。
布林值輸出欄位採用下列兩種形式其中之一。 如果 iosbase.flags & ios_base::
boolalpha 為 false
,則成員函式會傳 do_put(_Next, _Iosbase, _Fill, (long)val)
回 ,這通常會產生0(for false
) 或1(針對 true
) 產生的序列。 否則,產生的序列為 fac。falsename (for false
), 或 fac.truename (for true
)。
第七個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& iosbase,
Elem fill,
long long val) const;
行為與第一個相同,不同的是,它會以 lld
取代 ld
轉換規格。
第八個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& iosbase,
Elem fill,
unsigned long long val) const;
行為與第一個相同,不同的是,它會以 llu
取代 ld
轉換規格。
範例
請參閱 put 的範例,它會呼叫 do_put
。
num_put::iter_type
描述輸出迭代器的類型。
typedef OutputIterator iter_type;
備註
此類型與範本參數 OutputIterator 同義。
num_put::num_put
num_put
類型物件的建構函式。
explicit num_put(size_t _Refs = 0);
參數
_裁判
整數值,用來指定物件的記憶體管理類型。
備註
_Refs 參數的可能值及其重要性如下:
0:物件的存留期由包含該物件的地區設定來管理。
1:物件的存留期必須以手動方式管理。
> 1:未定義這些值。
無法提供任何直接範例,因為解構函式受到保護。
建構函式會以 locale::facet(_ Refs) 將其基底物件初始化。
num_put::p ut
將數字轉換成 的序列 CharType
,代表為指定地區設定格式化的數位。
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
bool val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
long val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
unsigned long val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
Long long val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
Unsigned long long val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
double val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
long double val) const;
iter_type put(
iter_type dest,
ios_base& _Iosbase,
_Elem _Fill,
const void* val) const;
參數
dest
迭代器,定址對象是所插入字串的第一個元素。
_Iosbase
指定的資料流,其中包含帶有 numpunct facet 的地區設定,可用來為輸出和旗標加上標點符號以設定輸出格式。
_填補
間距所使用的字元。
val
要輸出的數字或布林值類型。
傳回值
輸出迭代器,定址對象是所產生之最後一個元素的後面一個位置。
備註
所有成員函式都會傳回 do_put( next
, _Iosbase
, _Fill
, val
)。
範例
// num_put_put.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
locale loc( "german_germany" );
basic_stringstream<char> psz2;
ios_base::iostate st = 0;
long double fVal;
cout << "The thousands separator is: "
<< use_facet < numpunct <char> >(loc).thousands_sep( )
<< endl;
psz2.imbue( loc );
use_facet < num_put < char > >
( loc ).put(basic_ostream<char>::_Iter(psz2.rdbuf( ) ),
psz2, ' ', fVal=1000.67);
if ( st & ios_base::failbit )
cout << "num_put( ) FAILED" << endl;
else
cout << "num_put( ) = " << psz2.rdbuf( )->str( ) << endl;
}
The thousands separator is: .
num_put( ) = 1.000,67