類別範本,描述可做為地區設定 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 序列,表示為特定地區設定格式化的數字。 |
| 將 放置 | 將數字轉換成 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 值產生整數輸出欄位。 此函式會傳回迭代器,此迭代器指定在所產生的整數輸出欄位後下一個要插入元素的位置。
產生整數輸出欄位的規則,與列印函式在將一系列 char 元素產生至檔案時所使用的規則相同。 每個這類char元素都假設是透過簡單、一對一的對應對應至類型的 CharType 對等專案。 不過,列印函式會以空白或數位 0 填補欄位, do_put 而是使用 fill。 對等的列印轉換規格是以下列方式決定:
如果 iosbase. flags &
ios_base::basefield==ios_base::oct,轉換規格為 。lo如果 iosbase.flags & ,則轉換規格為 。 ==
否則,轉換規格會是
ld。
如果 iosbase. width 不是零,就會在前面加上此值的欄位寬度。 接著,函式會呼叫 iosbase. width(0) 將欄位寬度重設為零。
只有當指定輸出欄位所需的元素數目下限 N 小於 iosbase. width 時,才需要進行填補。 這類填補是由填滿的 N - 寬度複本序列所組成。 接著,填補會以下列方式進行:
如果 iosbase. flags &
ios_base::adjustfield==ios_base::left,旗標 - 會加上前面。 (填補的發生位置是在已產生的文字之後)。如果 iosbase.flags (就數字輸出欄位而言,會在列印函式以 0 填補的地方進行填補)。
否則,不會在前面加上任何額外的旗標。 (填補字元會出現在已產生的序列之前)。
最後:
如果 iosbase. flags 和
ios_base::showpos 為非零,旗標 + 會預先加上轉換規格。如果 iosbase. flags & ios_base::showbase 為非零,旗標 # 會預先加上轉換規格。
整數輸出欄位格式是由呼叫use_facetnumpunct<Elem<(iosbase) 所傳回的地區設定 Facet> 進一步決定。 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;
行為與第一個相同,不同的是,它會以 ld 取代 lu 轉換規格。
第三個虛擬的受保護成員函式:
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 & ,轉換規格為 。 == 如果 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;
行為與第一個相同,不同的是,它會以 ld 取代 lld 轉換規格。
第八個虛擬的受保護成員函式:
virtual iter_type do_put(iter_type next,
ios_base& iosbase,
Elem fill,
unsigned long long val) const;
行為與第一個相同,不同的是,它會以 ld 取代 llu 轉換規格。
範例
請參閱 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 的地區設定,可用來為輸出和旗標加上標點符號以設定輸出格式。
_填補
間距所使用的字元。
瓦爾
要輸出的數字或布林值類型。
傳回值
輸出迭代器,定址對象是所產生之最後一個元素的後面一個位置。
備註
所有成員函式都會傳回do_put(next、、_Iosbase、 _Fillval。
範例
// 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