diff --git a/reference/bitset/bitset/op_ostream.md b/reference/bitset/bitset/op_ostream.md index 9d828cfb79..064fe77dd0 100644 --- a/reference/bitset/bitset/op_ostream.md +++ b/reference/bitset/bitset/op_ostream.md @@ -28,7 +28,7 @@ os << x.template to_string>( * use_facet[link /reference/locale/use_facet.md] * ctype[link /reference/locale/ctype.md] * getloc[link /reference/ios/ios_base/getloc.md] -* widen[link /reference/locale/ctype/widen.md.nolink] +* widen[link /reference/locale/ctype/widen.md] ## 例 diff --git a/reference/fstream/basic_filebuf/overflow.md b/reference/fstream/basic_filebuf/overflow.md index f0cc47cd14..f52e68f3de 100644 --- a/reference/fstream/basic_filebuf/overflow.md +++ b/reference/fstream/basic_filebuf/overflow.md @@ -31,7 +31,7 @@ codecvt_base::result r = * pbase()[link /reference/streambuf/basic_streambuf/pbase.md] * pptr()[link /reference/streambuf/basic_streambuf/pptr.md] * codecvt_base::result[link /reference/locale/codecvt_base.md] -* a_codecvt.out[link /reference/locale/codecvt/out.md.nolink] +* a_codecvt.out[link /reference/locale/codecvt/out.md] ここで`a_codecvt`は、このストリームバッファに設定されているロケールの[`codecvt`](/reference/locale/codecvt.md)ファセットである。変換結果`r`に応じて、以下のように動作する。 diff --git a/reference/fstream/basic_filebuf/underflow.md b/reference/fstream/basic_filebuf/underflow.md index 528f8dc898..341e367a88 100644 --- a/reference/fstream/basic_filebuf/underflow.md +++ b/reference/fstream/basic_filebuf/underflow.md @@ -29,7 +29,7 @@ codecvt_base::result r = intern_buf, intern_buf+ISIZE, intern_end); ``` * codecvt_base::result[link /reference/locale/codecvt_base.md] -* a_codecvt.in[link /reference/locale/codecvt/in.md.nolink] +* a_codecvt.in[link /reference/locale/codecvt/in.md] ここで`a_codecvt`は、このストリームバッファに設定されているロケールの[`codecvt`](/reference/locale/codecvt.md)ファセットである。 diff --git a/reference/iomanip/put_time.md b/reference/iomanip/put_time.md index 604723da2d..c2ca9db526 100644 --- a/reference/iomanip/put_time.md +++ b/reference/iomanip/put_time.md @@ -43,7 +43,7 @@ void f(basic_ios& out, const struct tm* tmb, const CharT* fmt) * out.getloc()[link /reference/ios/ios_base/getloc.md] * out.rdbuf()[link /reference/ios/basic_ios/rdbuf.md] * out.fill()[link /reference/ios/basic_ios/fill.md] -* tp.put[link /reference/locale/time_put/put.md.nolink] +* tp.put[link /reference/locale/time_put/put.md] * end.failed()[link /reference/iterator/ostreambuf_iterator/failed.md] * out.setstate[link /reference/ios/basic_ios/setstate.md] * ios_base[link /reference/ios/ios_base.md] diff --git a/reference/ios/basic_ios/narrow.md b/reference/ios/basic_ios/narrow.md index 4d51002cfc..614978f40a 100644 --- a/reference/ios/basic_ios/narrow.md +++ b/reference/ios/basic_ios/narrow.md @@ -13,12 +13,12 @@ char narrow(char_type c, char def) const; ## 戻り値 -[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`(`[`getloc`](../ios_base/getloc.md)`()).`[`narrow`](../../locale/ctype/narrow.md.nolink)`(c, def)` +[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`(`[`getloc`](../ios_base/getloc.md)`()).`[`narrow`](../../locale/ctype/narrow.md)`(c, def)` ## 備考 ストリームに設定されているロケールに従って、`char_type` 型の文字 `c` を対応する `char` 型の文字に変換する。変換できなかった場合には `def` を返す。 -詳細は [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md.nolink) を参照。 +詳細は [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md) を参照。 ## 例 @@ -49,7 +49,7 @@ int main() - [`ios_base`](../ios_base.md)`::`[`imbue`](../ios_base/imbue.md) - [`ios_base`](../ios_base.md)`::`[`getloc`](../ios_base/getloc.md) - [`ctype`](../../locale/ctype.md) -- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md.nolink) -- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md.nolink) +- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md) +- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md) - [`use_facet`](../../locale/use_facet.md) - [`locale`](../../locale/locale.md) diff --git a/reference/ios/basic_ios/widen.md b/reference/ios/basic_ios/widen.md index 1c8ef83339..65eb877eea 100644 --- a/reference/ios/basic_ios/widen.md +++ b/reference/ios/basic_ios/widen.md @@ -13,12 +13,12 @@ char_type widen(char c) const; ## 戻り値 -[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`(`[`getloc`](../ios_base/getloc.md)`()).`[`widen`](../../locale/ctype/widen.md.nolink)`(c)` +[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`(`[`getloc`](../ios_base/getloc.md)`()).`[`widen`](../../locale/ctype/widen.md)`(c)` ## 備考 ストリームに設定されているロケールに従って、`char` 型の文字 `c` を対応する `char_type` 型の文字に変換する。 -詳細は [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md.nolink) を参照。 +詳細は [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md) を参照。 ## 例 @@ -49,7 +49,7 @@ int main() - [`ios_base`](../ios_base.md)`::`[`imbue`](../ios_base/imbue.md) - [`ios_base`](../ios_base.md)`::`[`getloc`](../ios_base/getloc.md) - [`ctype`](../../locale/ctype.md) -- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md.nolink) -- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md.nolink) +- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md) +- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md) - [`use_facet`](../../locale/use_facet.md) - [`locale`](../../locale/locale.md) diff --git a/reference/ios/ios_base/imbue.md b/reference/ios/ios_base/imbue.md index bcf870b3d1..5d19e2b3f4 100644 --- a/reference/ios/ios_base/imbue.md +++ b/reference/ios/ios_base/imbue.md @@ -43,7 +43,7 @@ int main() ``` * imbue[color ff0000] * std::locale[link ../../locale/locale.md] -* classic[link ../../locale/classic.md.nolink] +* classic[link /reference/locale/locale/classic.md] ### 出力例 ``` diff --git a/reference/istream/basic_istream/sentry/op_constructor.md b/reference/istream/basic_istream/sentry/op_constructor.md index 5e566c837b..a7957f72d5 100644 --- a/reference/istream/basic_istream/sentry/op_constructor.md +++ b/reference/istream/basic_istream/sentry/op_constructor.md @@ -19,7 +19,7 @@ explicit sentry(basic_istream& is, bool noskipws = false); - `is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`underflow`](../../../streambuf/basic_streambuf/underflow.md)`()`の呼び出しが発生するまで、この処理を遅延させても良い。 - `is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`underflow`](../../../streambuf/basic_streambuf/underflow.md)`()`の呼び出しが発生しなかったら、この処理を省略して良い(標準ライブラリ実装内部で、そのような最適化を行っても良い)。 1. `noskipws`が`false`かつ`is.`[`flags`](../../../ios/ios_base/flags.md)`() &` [`ios_base`](../../../ios/ios_base.md)`::skipws`が真なら、ストリームから空白文字を読み捨てる。 - - 空白文字の判定は、文字`c`について[`use_facet`](../../../locale/use_facet.md)`<`[`ctype`](../../../locale/ctype.md)`>(is.`[`getloc`](../../../ios/ios_base/getloc.md)`()).`[`is`](../../../locale/ctype/is.md.nolink)`(`[`ctype`](../../../locale/ctype.md)`::`[`space`](../../../locale/ctype_base.md)`, c)`と等価な方法で行う。 + - 空白文字の判定は、文字`c`について[`use_facet`](../../../locale/use_facet.md)`<`[`ctype`](../../../locale/ctype.md)`>(is.`[`getloc`](../../../ios/ios_base/getloc.md)`()).`[`is`](../../../locale/ctype/is.md)`(`[`ctype`](../../../locale/ctype.md)`::`[`space`](../../../locale/ctype_base.md)`, c)`と等価な方法で行う。 - このとき`is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`sbumpc`](../../../streambuf/basic_streambuf/sbumpc.md)`()`または`is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`sgetc`](../../../streambuf/basic_streambuf/sgetc.md)`()`が`Traits::eof()`を返したら、`is.`[`setstate`](../../../ios/basic_ios/setstate.md)`(failbit | eofbit)`を呼び出す。 ここまでの手順が完了したら、このオブジェクトの`operator bool`関数は`true`を、さもなくば`false`を返すようになる。 diff --git a/reference/locale/codecvt.md b/reference/locale/codecvt.md index d746a452b7..c369b9234a 100644 --- a/reference/locale/codecvt.md +++ b/reference/locale/codecvt.md @@ -13,41 +13,47 @@ namespace std { * codecvt_base[link /reference/locale/codecvt_base.md] ## 概要 -(ここに、クラスの概要を記載する) +`codecvt`は、内部型`internT`の文字列と外部型`externT`の文字列を相互に変換するためのロケールファセットである。 + +[`basic_filebuf`](/reference/fstream/basic_filebuf.md)は、ファイル上のバイト列(外部型)とプログラム上の文字列(内部型)の変換にこのファセットを使用する。 + +`stateT`は変換の状態を保持する型であり、状態依存のエンコーディングを扱うために使用される。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------------------------------------------|--------------------------------------------------------------------------------------------| -| `(constructor)` | コンストラクタ | -| `out` | 内部型から外部型に変換 | -| in | 外部型から内部型に変換 | -| `unshift` | 変換が不完全だった場合のために、変換の開始位置をずらす | -| `encoding` | 内部型の1文字への変換に必要な外部型の長さを取得する | -| `always_noconv` | 変換を行う必要がないか判定する | -| `length` | 内部型文字列への変換で消費される外部型文字列の長さを取得する | -| `max_length` | 内部型の1文字への変換に必要な外部型の最大の長さを取得する | +| [`(constructor)`](codecvt/op_constructor.md) | コンストラクタ | +| [`out`](codecvt/out.md) | 内部型から外部型に変換 | +| [`in`](codecvt/in.md) | 外部型から内部型に変換 | +| [`unshift`](codecvt/unshift.md) | 文字列を終端するためのシフト状態を戻す文字列を出力する | +| [`encoding`](codecvt/encoding.md) | 内部型の1文字への変換に必要な外部型の長さを取得する | +| [`always_noconv`](codecvt/always_noconv.md) | 変換を行う必要がないか判定する | +| [`length`](codecvt/length.md) | 内部型文字列への変換で消費される外部型文字列の長さを取得する | +| [`max_length`](codecvt/max_length.md) | 内部型の1文字への変換に必要な外部型の最大の長さを取得する | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------|------| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |-------------------------------|--------------------------------------------------------------------------------------------| -| `(destructor)` | デストラクタ | -| `do_out` | 内部型から外部型に変換 | -| `do_in` | 外部型から内部型に変換 | -| `do_unshift` | 変換が不完全だった場合のために、変換の開始位置をずらす | -| `do_encoding` | 内部型の1文字への変換に必要な外部型の長さを取得する | -| `do_always_noconv` | 変換を行う必要がないか判定する | -| `do_length` | 内部型文字列への変換で消費される外部型文字列の長さを取得する | -| `do_max_length` | 内部型の1文字への変換に必要な外部型の最大の長さを取得する | +| [`(destructor)`](codecvt/op_destructor.md) | デストラクタ | +| [`do_out`](codecvt/do_out.md) | 内部型から外部型に変換 | +| [`do_in`](codecvt/do_in.md) | 外部型から内部型に変換 | +| [`do_unshift`](codecvt/do_unshift.md) | 文字列を終端するためのシフト状態を戻す文字列を出力する | +| [`do_encoding`](codecvt/do_encoding.md) | 内部型の1文字への変換に必要な外部型の長さを取得する | +| [`do_always_noconv`](codecvt/do_always_noconv.md) | 変換を行う必要がないか判定する | +| [`do_length`](codecvt/do_length.md) | 内部型文字列への変換で消費される外部型文字列の長さを取得する | +| [`do_max_length`](codecvt/do_max_length.md) | 内部型の1文字への変換に必要な外部型の最大の長さを取得する | -### メンバ型 +## メンバ型 | 名前 | 説明 | |--------------------------|-------------------------------------------------| @@ -55,13 +61,51 @@ namespace std { | `extern_type` | 外部型 `externT` | | `state_type` | 変換の状態を表す型 `stateT` | -### 例 +## 例 +```cpp example +#include +#include +#include -```cpp +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + const char from[] = "abc"; + wchar_t to[4] = {}; + + std::mbstate_t state{}; + const char* from_next = nullptr; + wchar_t* to_next = nullptr; + + // 外部型(char)から内部型(wchar_t)へ変換する + codecvt_t::result r = cv.in(state, from, from + 3, from_next, to, to + 3, to_next); + + *to_next = L'\0'; + std::cout << std::boolalpha << (r == codecvt_t::ok) << std::endl; + std::wcout << to << std::endl; +} ``` +* std::codecvt[color ff0000] +* cv.in[link codecvt/in.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +true +abc ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt_byname`](codecvt_byname.md) +- [`codecvt_base`](codecvt_base.md) +- [`basic_filebuf`](/reference/fstream/basic_filebuf.md) +- [`locale`](locale.md) diff --git a/reference/locale/codecvt/always_noconv.md b/reference/locale/codecvt/always_noconv.md new file mode 100644 index 0000000000..d1035c85f3 --- /dev/null +++ b/reference/locale/codecvt/always_noconv.md @@ -0,0 +1,51 @@ +# always_noconv +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +bool always_noconv() const throw(); // (1) C++98 +bool always_noconv() const noexcept; // (1) C++11 +``` + +## 概要 +変換を行う必要がないか判定する。 + + +## 戻り値 +[`do_always_noconv()`](do_always_noconv.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + // wchar_tとcharの間では変換が必要 + std::cout << std::boolalpha << cv.always_noconv() << std::endl; +} +``` +* always_noconv[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +false +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_always_noconv`](do_always_noconv.md) diff --git a/reference/locale/codecvt/do_always_noconv.md b/reference/locale/codecvt/do_always_noconv.md new file mode 100644 index 0000000000..2a006c79e9 --- /dev/null +++ b/reference/locale/codecvt/do_always_noconv.md @@ -0,0 +1,28 @@ +# do_always_noconv +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual bool do_always_noconv() const throw(); // (1) C++98 + virtual bool do_always_noconv() const noexcept; // (1) C++11 +``` + +## 概要 +変換を行う必要がないか判定する。[`always_noconv()`](always_noconv.md)から呼び出される仮想関数である。 + + +## 戻り値 +すべての妥当な実引数について[`do_in()`](do_in.md)と[`do_out()`](do_out.md)が`noconv`を返す場合は`true`、そうでない場合は`false`。 + +特殊化`codecvt`は`true`を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::always_noconv`](always_noconv.md) diff --git a/reference/locale/codecvt/do_encoding.md b/reference/locale/codecvt/do_encoding.md new file mode 100644 index 0000000000..eabd11260a --- /dev/null +++ b/reference/locale/codecvt/do_encoding.md @@ -0,0 +1,32 @@ +# do_encoding +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual int do_encoding() const throw(); // (1) C++98 + virtual int do_encoding() const noexcept; // (1) C++11 +``` + +## 概要 +内部型の1文字への変換に必要な外部型の長さを取得する。[`encoding()`](encoding.md)から呼び出される仮想関数である。 + + +## 戻り値 +- `externT`のエンコーディングが状態依存である場合、`-1` +- そうでない場合、内部型の1文字を生成するために必要な`externT`の文字数(一定である場合) +- その文字数が一定でない場合、`0` + + +## 備考 +`encoding()`が`-1`を返す場合、内部型の1文字を生成するために[`max_length()`](max_length.md)より多くの`externT`要素が消費されることがある。また、最後の内部型文字を生成した要素の後ろに、追加の`externT`要素が現れることがある。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::encoding`](encoding.md) diff --git a/reference/locale/codecvt/do_in.md b/reference/locale/codecvt/do_in.md new file mode 100644 index 0000000000..5fc4675375 --- /dev/null +++ b/reference/locale/codecvt/do_in.md @@ -0,0 +1,52 @@ +# do_in +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual result + do_in(stateT& state, + const externT* from, + const externT* from_end, + const externT*& from_next, + internT* to, + internT* to_end, + internT*& to_next) const; // (1) C++98 +``` + +## 概要 +外部型の文字列を内部型の文字列へ変換する。[`in()`](in.md)から呼び出される仮想関数である。 + + +## 事前条件 +`from <= from_end && to <= to_end`が妥当な式であり、定義された動作をすること。またその結果が`true`であること。 + +`state`は、シーケンスの先頭であれば初期化されていること。そうでなければ、シーケンス内の先行する文字を変換した結果と等しいこと。 + + +## 効果 +範囲`[from, from_end)`の文字を変換し、結果を`to`から順に格納する。変換する要素数は`(from_end - from)`以下、格納する要素数は`(to_end - to)`以下である。 + +変換できない文字に遭遇した場合は、そこで変換を停止する。`from_next`と`to_next`は、常に変換に成功した最後の要素の1つ次を指す。 + + +## 戻り値 +[`codecvt_base::result`](/reference/locale/codecvt_base.md)の列挙値。意味は[`do_out()`](do_out.md)と同じである。 + + +## 備考 +`state`に対する操作は未規定である。 + +[`basic_filebuf`](/reference/fstream/basic_filebuf.md)が使用する`codecvt`ファセットは、`to != to_end`で`do_in(state, from, from_end, from_next, to, to_end, to_next)`が`ok`を返すならば、`do_in(state, from, from_end, from_next, to, to + 1, to_next)`も`ok`を返す、という性質を持つ必要がある。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::in`](in.md) +- [`codecvt::do_out`](do_out.md) +- [`codecvt_base`](/reference/locale/codecvt_base.md) diff --git a/reference/locale/codecvt/do_length.md b/reference/locale/codecvt/do_length.md new file mode 100644 index 0000000000..24281ce22f --- /dev/null +++ b/reference/locale/codecvt/do_length.md @@ -0,0 +1,42 @@ +# do_length +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual int + do_length(stateT& state, + const externT* from, + const externT* from_end, + size_t max) const; // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +内部型文字列への変換で消費される外部型文字列の長さを取得する。[`length()`](length.md)から呼び出される仮想関数である。 + + +## 事前条件 +`from <= from_end`が妥当な式であり、定義された動作をすること。またその結果が`true`であること。 + +`state`は、シーケンスの先頭であれば初期化されていること。そうでなければ、シーケンス内の先行する文字を変換した結果と等しいこと。 + + +## 効果 +`state`に対する効果は、`max`要素以上のバッファを指す`to`に対して[`do_in`](do_in.md)`(state, from, from_end, from, to, to + max, to)`を呼び出した場合と同じである。 + + +## 戻り値 +`(from_next - from)`。ここで`from_next`は、範囲`[from, from_end]`のうち、範囲`[from, from_next)`の値の列が`internT`型の`max`個以下の妥当な完全文字を表すような最大の値である。 + +特殊化`codecvt`は、`max`と`(from_end - from)`のうち小さい方を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::length`](length.md) diff --git a/reference/locale/codecvt/do_max_length.md b/reference/locale/codecvt/do_max_length.md new file mode 100644 index 0000000000..6e6664bf8a --- /dev/null +++ b/reference/locale/codecvt/do_max_length.md @@ -0,0 +1,28 @@ +# do_max_length +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual int do_max_length() const throw(); // (1) C++98 + virtual int do_max_length() const noexcept; // (1) C++11 +``` + +## 概要 +内部型の1文字への変換に必要な外部型の最大の長さを取得する。[`max_length()`](max_length.md)から呼び出される仮想関数である。 + + +## 戻り値 +任意の妥当な範囲`[from, from_end)`と`stateT`の値`state`について、[`do_length`](do_length.md)`(state, from, from_end, 1)`が返しうる最大の値。 + +特殊化`codecvt::do_max_length()`は`1`を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::max_length`](max_length.md) diff --git a/reference/locale/codecvt/do_out.md b/reference/locale/codecvt/do_out.md new file mode 100644 index 0000000000..526665e23c --- /dev/null +++ b/reference/locale/codecvt/do_out.md @@ -0,0 +1,63 @@ +# do_out +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual result + do_out(stateT& state, + const internT* from, + const internT* from_end, + const internT*& from_next, + externT* to, + externT* to_end, + externT*& to_next) const; // (1) C++98 +``` + +## 概要 +内部型の文字列を外部型の文字列へ変換する。[`out()`](out.md)から呼び出される仮想関数である。 + + +## 事前条件 +`from <= from_end && to <= to_end`が妥当な式であり、定義された動作をすること。またその結果が`true`であること。 + +`state`は、シーケンスの先頭であれば初期化されていること。そうでなければ、シーケンス内の先行する文字を変換した結果と等しいこと。 + + +## 効果 +範囲`[from, from_end)`の文字を変換し、結果を`to`から順に格納する。変換する要素数は`(from_end - from)`以下、格納する要素数は`(to_end - to)`以下である。 + +変換できない文字に遭遇した場合は、そこで変換を停止する。`from_next`と`to_next`は、常に変換に成功した最後の要素の1つ次を指す。 + +`noconv`を返す場合、`internT`と`externT`は同じ型であり、変換後のシーケンスは入力シーケンス`[from, from_next)`と同一である。このとき`to_next`は`to`と等しく設定され、`state`の値は変更されず、`[to, to_end)`の値も変更されない。 + + +## 戻り値 +[`codecvt_base::result`](/reference/locale/codecvt_base.md)の列挙値。 + +| 値 | 意味 | +|----|------| +| `ok` | 変換が完了した | +| `partial` | すべての入力文字を変換できなかった | +| `error` | `[from, from_end)`に変換できない文字があった | +| `noconv` | `internT`と`externT`が同じ型で、入力シーケンスが変換後のシーケンスと同一である | + +`from_next == from_end`である場合の`partial`は、出力側がすべての出力要素を吸収していないか、次の出力要素を生成するために追加の入力要素が必要であることを示す。 + + +## 備考 +`state`に対する操作は未規定である。この引数は、たとえばシフト状態の保持、変換オプションの指定、シーク位置のキャッシュの識別などに使用できる。 + +[`basic_filebuf`](/reference/fstream/basic_filebuf.md)が使用する`codecvt`ファセットは、`from != from_end`で`do_out(state, from, from_end, from_next, to, to_end, to_next)`が`ok`を返すならば、`do_out(state, from, from + 1, from_next, to, to_end, to_next)`も`ok`を返す、という性質を持つ必要がある(内部文字を1文字ずつ変換できる必要がある)。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::out`](out.md) +- [`codecvt::do_in`](do_in.md) +- [`codecvt_base`](/reference/locale/codecvt_base.md) diff --git a/reference/locale/codecvt/do_unshift.md b/reference/locale/codecvt/do_unshift.md new file mode 100644 index 0000000000..637e2cd121 --- /dev/null +++ b/reference/locale/codecvt/do_unshift.md @@ -0,0 +1,49 @@ +# do_unshift +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + virtual result + do_unshift(stateT& state, + externT* to, + externT* to_end, + externT*& to_next) const; // (1) C++98 +``` + +## 概要 +文字列を終端するために必要な、シフト状態を戻す文字列を出力する。[`unshift()`](unshift.md)から呼び出される仮想関数である。 + + +## 事前条件 +`to <= to_end`が妥当な式であり、定義された動作をすること。またその結果が`true`であること。 + +`state`は、シーケンスの先頭であれば初期化されていること。そうでなければ、シーケンス内の先行する文字を変換した結果と等しいこと。 + + +## 効果 +現在の状態が`state`である場合に、シーケンスを終端するために付加すべき文字を`to`から順に格納する。格納する要素数は`(to_end - to)`以下であり、`to_next`は格納に成功した最後の要素の1つ次を指す。 + +通常これは、状態を`stateT()`に戻すための文字列となる。 + + +## 戻り値 +[`codecvt_base::result`](/reference/locale/codecvt_base.md)の列挙値。 + +| 値 | 意味 | +|----|------| +| `ok` | シーケンスを完了した | +| `partial` | `state`の値に対してシーケンスを終端するために、`to_end - to`より多くの出力要素が必要だった | +| `error` | 未規定のエラーが発生した | +| `noconv` | この`state_type`では終端処理が不要である | + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::unshift`](unshift.md) +- [`codecvt_base`](/reference/locale/codecvt_base.md) diff --git a/reference/locale/codecvt/encoding.md b/reference/locale/codecvt/encoding.md new file mode 100644 index 0000000000..700af3a4dd --- /dev/null +++ b/reference/locale/codecvt/encoding.md @@ -0,0 +1,52 @@ +# encoding +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +int encoding() const throw(); // (1) C++98 +int encoding() const noexcept; // (1) C++11 +``` + +## 概要 +内部型の1文字への変換に必要な外部型の長さを取得する。 + + +## 戻り値 +[`do_encoding()`](do_encoding.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + // "C"ロケールでは、1文字の変換に必要な外部型の文字数は1で固定 + std::cout << cv.encoding() << std::endl; +} +``` +* encoding[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +1 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_encoding`](do_encoding.md) +- [`codecvt::max_length`](max_length.md) diff --git a/reference/locale/codecvt/in.md b/reference/locale/codecvt/in.md new file mode 100644 index 0000000000..e9afd29869 --- /dev/null +++ b/reference/locale/codecvt/in.md @@ -0,0 +1,69 @@ +# in +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +result in(stateT& state, + const externT* from, + const externT* from_end, + const externT*& from_next, + internT* to, + internT* to_end, + internT*& to_next) const; // (1) C++98 +``` + +## 概要 +外部型の文字列を内部型の文字列へ変換する。 + + +## 戻り値 +[`do_in(state, from, from_end, from_next, to, to_end, to_next)`](do_in.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + const char from[] = "abc"; + wchar_t to[4] = {}; + + std::mbstate_t state{}; + const char* from_next = nullptr; + wchar_t* to_next = nullptr; + + codecvt_t::result r = cv.in(state, from, from + 3, from_next, to, to + 3, to_next); + + *to_next = L'\0'; + std::cout << std::boolalpha << (r == codecvt_t::ok) << std::endl; + std::wcout << to << std::endl; +} +``` +* in[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +true +abc +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_in`](do_in.md) +- [`codecvt::out`](out.md) +- [`codecvt_base`](/reference/locale/codecvt_base.md) diff --git a/reference/locale/codecvt/length.md b/reference/locale/codecvt/length.md new file mode 100644 index 0000000000..78514bd072 --- /dev/null +++ b/reference/locale/codecvt/length.md @@ -0,0 +1,59 @@ +# length +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +int + length(stateT& state, + const externT* from, + const externT* from_end, + size_t max) const; // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +内部型文字列への変換で消費される外部型文字列の長さを取得する。 + + +## 戻り値 +[`do_length(state, from, from_end, max)`](do_length.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + const char from[] = "abc"; + std::mbstate_t state{}; + + // 内部型で2文字を得るために消費する外部型の文字数 + std::cout << cv.length(state, from, from + 3, 2) << std::endl; +} +``` +* length[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +2 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_length`](do_length.md) +- [`codecvt::max_length`](max_length.md) diff --git a/reference/locale/codecvt/max_length.md b/reference/locale/codecvt/max_length.md new file mode 100644 index 0000000000..04470fed0e --- /dev/null +++ b/reference/locale/codecvt/max_length.md @@ -0,0 +1,51 @@ +# max_length +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +int max_length() const throw(); // (1) C++98 +int max_length() const noexcept; // (1) C++11 +``` + +## 概要 +内部型の1文字への変換に必要な外部型の最大の長さを取得する。 + + +## 戻り値 +[`do_max_length()`](do_max_length.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + std::cout << cv.max_length() << std::endl; +} +``` +* max_length[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +1 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_max_length`](do_max_length.md) +- [`codecvt::length`](length.md) diff --git a/reference/locale/codecvt/op_constructor.md b/reference/locale/codecvt/op_constructor.md new file mode 100644 index 0000000000..aefa5cf44c --- /dev/null +++ b/reference/locale/codecvt/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +explicit codecvt(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`codecvt`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`codecvt_byname`](/reference/locale/codecvt_byname.md) diff --git a/reference/locale/codecvt/op_destructor.md b/reference/locale/codecvt/op_destructor.md new file mode 100644 index 0000000000..269ddffd68 --- /dev/null +++ b/reference/locale/codecvt/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +protected: + ~codecvt(); // (1) C++98 +``` + +## 概要 +`codecvt`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`codecvt`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/codecvt/out.md b/reference/locale/codecvt/out.md new file mode 100644 index 0000000000..f637301bf0 --- /dev/null +++ b/reference/locale/codecvt/out.md @@ -0,0 +1,70 @@ +# out +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +result + out(stateT& state, + const internT* from, + const internT* from_end, + const internT*& from_next, + externT* to, + externT* to_end, + externT*& to_next) const; // (1) C++98 +``` + +## 概要 +内部型の文字列を外部型の文字列へ変換する。 + + +## 戻り値 +[`do_out(state, from, from_end, from_next, to, to_end, to_next)`](do_out.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + const wchar_t from[] = L"abc"; + char to[4] = {}; + + std::mbstate_t state{}; + const wchar_t* from_next = nullptr; + char* to_next = nullptr; + + codecvt_t::result r = cv.out(state, from, from + 3, from_next, to, to + 3, to_next); + + *to_next = '\0'; + std::cout << std::boolalpha << (r == codecvt_t::ok) << std::endl; + std::cout << to << std::endl; +} +``` +* out[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +true +abc +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_out`](do_out.md) +- [`codecvt::in`](in.md) +- [`codecvt_base`](/reference/locale/codecvt_base.md) diff --git a/reference/locale/codecvt/unshift.md b/reference/locale/codecvt/unshift.md new file mode 100644 index 0000000000..25592fcea2 --- /dev/null +++ b/reference/locale/codecvt/unshift.md @@ -0,0 +1,64 @@ +# unshift +* locale[meta header] +* std[meta namespace] +* codecvt[meta class] +* function[meta id-type] + +```cpp +result + unshift(stateT& state, + externT* to, + externT* to_end, + externT*& to_next) const; // (1) C++98 +``` + +## 概要 +文字列を終端するために必要な、シフト状態を戻す文字列を出力する。 + + +## 戻り値 +[`do_unshift(state, to, to_end, to_next)`](do_unshift.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + char to[8] = {}; + + std::mbstate_t state{}; + char* to_next = nullptr; + + codecvt_t::result r = cv.unshift(state, to, to + 8, to_next); + + // "C"ロケールは状態依存のエンコーディングではないため、終端処理は失敗しない + // 終端文字を出力する場合はok、出力するものが無い場合はnoconvが返る + std::cout << std::boolalpha + << (r == codecvt_t::ok || r == codecvt_t::noconv) << std::endl; +} +``` +* unshift[color ff0000] +* std::codecvt[link /reference/locale/codecvt.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt::do_unshift`](do_unshift.md) +- [`codecvt_base`](/reference/locale/codecvt_base.md) diff --git a/reference/locale/codecvt_base.md b/reference/locale/codecvt_base.md index fa63024e4c..2fa1189d44 100644 --- a/reference/locale/codecvt_base.md +++ b/reference/locale/codecvt_base.md @@ -10,7 +10,9 @@ namespace std { ``` ## 概要 -(ここに、クラスの概要を記載する) +`codecvt_base`は、[`codecvt`](codecvt.md)による変換の結果を表す列挙型を定義する基底クラスである。 + +[`codecvt`](codecvt.md)はこのクラスを継承しており、[`codecvt::in()`](codecvt/in.md)・[`codecvt::out()`](codecvt/out.md)・[`codecvt::unshift()`](codecvt/unshift.md)がこの列挙値を返す。 ### メンバ型 @@ -29,11 +31,47 @@ namespace std { ## 例 -```cpp +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + const auto& cv = std::use_facet(std::locale::classic()); + + const char from[] = "abc"; + wchar_t to[4] = {}; + + std::mbstate_t state{}; + const char* from_next = nullptr; + wchar_t* to_next = nullptr; + + // 変換結果はcodecvt_baseの列挙値として返る + codecvt_t::result r = cv.in(state, from, from + 3, from_next, to, to + 3, to_next); + + std::cout << std::boolalpha << (r == std::codecvt_base::ok) << std::endl; +} ``` +* std::codecvt_base::ok[color ff0000] +* std::codecvt[link codecvt.md] +* cv.in[link codecvt/in.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt`](codecvt.md) +- [`codecvt::in`](codecvt/in.md) +- [`codecvt::out`](codecvt/out.md) diff --git a/reference/locale/codecvt_byname.md b/reference/locale/codecvt_byname.md index b3502a8554..595edae7f6 100644 --- a/reference/locale/codecvt_byname.md +++ b/reference/locale/codecvt_byname.md @@ -12,27 +12,61 @@ namespace std { * codecvt[link codecvt.md] ## 概要 +`codecvt_byname`は、名前で指定したロケールの文字コード変換を提供する、[`codecvt`](/reference/locale/codecvt.md)の派生クラスである。 -(ここに、クラスの概要を記載する) +[`codecvt`](/reference/locale/codecvt.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`codecvt`](/reference/locale/codecvt.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](codecvt_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](codecvt_byname/op_destructor.md) | デストラクタ | -### 例 -```cpp +## 例 +```cpp example +#include +#include +#include + +int main() +{ + using codecvt_t = std::codecvt; + + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), + new std::codecvt_byname{"C"}}; + + std::cout << std::boolalpha << std::has_facet(loc) << std::endl; +} ``` +* std::codecvt_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::codecvt[link codecvt.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt`](/reference/locale/codecvt.md) +- [`locale`](locale.md) diff --git a/reference/locale/codecvt_byname/op_constructor.md b/reference/locale/codecvt_byname/op_constructor.md new file mode 100644 index 0000000000..f456622965 --- /dev/null +++ b/reference/locale/codecvt_byname/op_constructor.md @@ -0,0 +1,85 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* codecvt_byname[meta class] +* function[meta id-type] + +```cpp +explicit codecvt_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit codecvt_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、文字コード変換ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`codecvt`](/reference/locale/codecvt.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `codecvt_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), + new std::codecvt_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + using codecvt_t = std::codecvt; + + const auto& fa = std::use_facet(a); + const auto& fb = std::use_facet(b); + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha + << (fa.always_noconv() == fb.always_noconv()) << std::endl; +} +``` +* std::codecvt_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::codecvt[link /reference/locale/codecvt.md] +* fa.always_noconv()[link /reference/locale/codecvt/always_noconv.md] + +### 出力 +``` +true +``` + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt`](/reference/locale/codecvt.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/codecvt_byname/op_destructor.md b/reference/locale/codecvt_byname/op_destructor.md new file mode 100644 index 0000000000..3d8c72cbf7 --- /dev/null +++ b/reference/locale/codecvt_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* codecvt_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~codecvt_byname(); // (1) C++98 +``` + +## 概要 +`codecvt_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`codecvt_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`codecvt_byname`のコンストラクタ](op_constructor.md) +- [`codecvt`](/reference/locale/codecvt.md) diff --git a/reference/locale/collate.md b/reference/locale/collate.md index 2858c6e5da..e6f8f0e801 100644 --- a/reference/locale/collate.md +++ b/reference/locale/collate.md @@ -12,39 +12,78 @@ namespace std { * locale::facet[link /reference/locale/locale/facet.md] ## 概要 -(ここに、クラスの概要を記載する) +`collate`は、文字列の照合(比較)とハッシュ計算のための機能を提供するロケールファセットである。 -### メンバ関数 +[`locale`](locale.md)のメンバ関数テンプレート[`operator()`](locale/op_call.md)は、このファセットを使用することで、[`locale`](locale.md)オブジェクトを文字列を扱うアルゴリズムやコンテナの述語として直接使えるようにしている。 + +規格が要求する特殊化(`collate`と`collate`)は、辞書順による順序付けを行う。 + +## メンバ関数 + +### publicメンバ関数 | 名前 | 説明 | |----------------------------|--------------------------------------------| -| `(constructor)` | コンストラクタ | -| `compare` | 文字列を比較する | -| `transform` | 文字の範囲を文字列に変換する | -| `hash` | 文字範囲のハッシュ値を求める | +| [`(constructor)`](collate/op_constructor.md) | コンストラクタ | +| [`compare`](collate/compare.md) | 文字列を比較する | +| [`transform`](collate/transform.md) | 文字の範囲を照合順序での比較に使える文字列に変換する | +| [`hash`](collate/hash.md) | 文字範囲のハッシュ値を求める | + +### 静的メンバ変数 + +| 名前 | 説明 | +|--------------------------------------------------------------|--------------------------------| +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------------------------------| -| `(destructor)` | デストラクタ | -| `do_compare` | 文字列を比較する | -| `do_transform` | 文字の範囲を文字列に変換する | -| `do_hash` | 文字範囲のハッシュ値を求める | +| [`(destructor)`](collate/op_destructor.md) | デストラクタ | +| [`do_compare`](collate/do_compare.md) | 文字列を比較する | +| [`do_transform`](collate/do_transform.md) | 文字の範囲を照合順序での比較に使える文字列に変換する | +| [`do_hash`](collate/do_hash.md) | 文字範囲のハッシュ値を求める | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& col = std::use_facet>(std::locale::classic()); + + const char a[] = "abc"; + const char b[] = "abd"; + + // ロケールの照合順序で比較する + std::cout << col.compare(a, a + 3, b, b + 3) << std::endl; +} ``` +* std::collate[color ff0000] +* col.compare[link collate/compare.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +-1 ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate_byname`](collate_byname.md) +- [`locale::operator()`](locale/op_call.md) +- [`locale`](locale.md) diff --git a/reference/locale/collate/compare.md b/reference/locale/collate/compare.md new file mode 100644 index 0000000000..d4a583d873 --- /dev/null +++ b/reference/locale/collate/compare.md @@ -0,0 +1,56 @@ +# compare +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +int compare(const charT* low1, const charT* high1, + const charT* low2, const charT* high2) const; // (1) C++98 +``` + +## 概要 +文字列を比較する。範囲`[low1, high1)`と範囲`[low2, high2)`の文字列を、ロケールの照合順序で比較する。 + + +## 戻り値 +[`do_compare(low1, high1, low2, high2)`](do_compare.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& col = std::use_facet>(std::locale::classic()); + + const char a[] = "abc"; + const char b[] = "abd"; + + std::cout << col.compare(a, a + 3, b, b + 3) << std::endl; + std::cout << col.compare(b, b + 3, a, a + 3) << std::endl; + std::cout << col.compare(a, a + 3, a, a + 3) << std::endl; +} +``` +* compare[color ff0000] +* std::collate[link /reference/locale/collate.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +-1 +1 +0 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate::do_compare`](do_compare.md) +- [`locale::operator()`](/reference/locale/locale/op_call.md) diff --git a/reference/locale/collate/do_compare.md b/reference/locale/collate/do_compare.md new file mode 100644 index 0000000000..d2989f5792 --- /dev/null +++ b/reference/locale/collate/do_compare.md @@ -0,0 +1,30 @@ +# do_compare +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +protected: + virtual int + do_compare(const charT* low1, const charT* high1, + const charT* low2, const charT* high2) const; // (1) C++98 +``` + +## 概要 +文字列を比較する。[`compare()`](compare.md)から呼び出される仮想関数である。 + + +## 戻り値 +1つめの文字列が2つめの文字列より大きい場合は`1`、小さい場合は`-1`、そうでない場合は`0`。 + +規格が要求する特殊化(`collate`と`collate`)は、辞書順比較を行う。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate::compare`](compare.md) +- [`lexicographical_compare`](/reference/algorithm/lexicographical_compare.md) diff --git a/reference/locale/collate/do_hash.md b/reference/locale/collate/do_hash.md new file mode 100644 index 0000000000..e5078128fa --- /dev/null +++ b/reference/locale/collate/do_hash.md @@ -0,0 +1,26 @@ +# do_hash +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +protected: + virtual long do_hash(const charT* low, const charT* high) const; // (1) C++98 +``` + +## 概要 +文字範囲のハッシュ値を求める。[`hash()`](hash.md)から呼び出される仮想関数である。 + + +## 戻り値 +整数値。この値は、[`do_compare()`](do_compare.md)に渡したときに`0`(等しい)を返すような他の任意の文字列に対して[`hash()`](hash.md)を呼び出した結果と等しい。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate::hash`](hash.md) +- [`collate::do_compare`](do_compare.md) diff --git a/reference/locale/collate/do_transform.md b/reference/locale/collate/do_transform.md new file mode 100644 index 0000000000..571fc2924f --- /dev/null +++ b/reference/locale/collate/do_transform.md @@ -0,0 +1,27 @@ +# do_transform +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type + do_transform(const charT* low, const charT* high) const; // (1) C++98 +``` + +## 概要 +文字の範囲を、照合順序での比較に使用できる文字列へ変換する。[`transform()`](transform.md)から呼び出される仮想関数である。 + + +## 戻り値 +[`std::basic_string`](/reference/string/basic_string.md)``の値。この値を、別の文字列に対して[`transform()`](transform.md)を呼び出した結果と辞書順で比較すると、それら2つの文字列に対して[`do_compare()`](do_compare.md)を呼び出した場合と同じ結果になる。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate::transform`](transform.md) +- [`collate::do_compare`](do_compare.md) diff --git a/reference/locale/collate/hash.md b/reference/locale/collate/hash.md new file mode 100644 index 0000000000..b13d2d0adf --- /dev/null +++ b/reference/locale/collate/hash.md @@ -0,0 +1,50 @@ +# hash +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +long hash(const charT* low, const charT* high) const; // (1) C++98 +``` + +## 概要 +文字範囲のハッシュ値を求める。 + + +## 戻り値 +[`do_hash(low, high)`](do_hash.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& col = std::use_facet>(std::locale::classic()); + + const char a[] = "abc"; + + // 同じ文字列に対しては同じハッシュ値が得られる + std::cout << std::boolalpha << (col.hash(a, a + 3) == col.hash(a, a + 3)) << std::endl; +} +``` +* hash[color ff0000] +* std::collate[link /reference/locale/collate.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate::do_hash`](do_hash.md) diff --git a/reference/locale/collate/op_constructor.md b/reference/locale/collate/op_constructor.md new file mode 100644 index 0000000000..a383030d3d --- /dev/null +++ b/reference/locale/collate/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +explicit collate(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`collate`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`collate_byname`](/reference/locale/collate_byname.md) diff --git a/reference/locale/collate/op_destructor.md b/reference/locale/collate/op_destructor.md new file mode 100644 index 0000000000..78a78b0573 --- /dev/null +++ b/reference/locale/collate/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +protected: + ~collate(); // (1) C++98 +``` + +## 概要 +`collate`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`collate`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/collate/transform.md b/reference/locale/collate/transform.md new file mode 100644 index 0000000000..f2b98068c9 --- /dev/null +++ b/reference/locale/collate/transform.md @@ -0,0 +1,61 @@ +# transform +* locale[meta header] +* std[meta namespace] +* collate[meta class] +* function[meta id-type] + +```cpp +string_type transform(const charT* low, const charT* high) const; // (1) C++98 +``` + +## 概要 +文字の範囲を、照合順序での比較に使用できる文字列へ変換する。 + + +## 戻り値 +[`do_transform(low, high)`](do_transform.md) + + +## 備考 +変換後の文字列同士を辞書順で比較した結果は、変換前の文字列同士を[`compare()`](compare.md)で比較した結果と一致する。同じ文字列を何度も比較する場合、あらかじめ変換しておくことで比較のコストを下げられる。 + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + const auto& col = std::use_facet>(std::locale::classic()); + + const char a[] = "abc"; + const char b[] = "abd"; + + std::string ka = col.transform(a, a + 3); + std::string kb = col.transform(b, b + 3); + + // 変換後の文字列の辞書順比較は、compare()の結果と一致する + std::cout << std::boolalpha << ((ka < kb) == (col.compare(a, a + 3, b, b + 3) < 0)) << std::endl; +} +``` +* transform[color ff0000] +* std::collate[link /reference/locale/collate.md] +* col.compare[link compare.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate::do_transform`](do_transform.md) +- [`collate::compare`](compare.md) diff --git a/reference/locale/collate_byname.md b/reference/locale/collate_byname.md index b4048bb692..f5f74abf87 100644 --- a/reference/locale/collate_byname.md +++ b/reference/locale/collate_byname.md @@ -12,32 +12,64 @@ namespace std { * collate[link /reference/locale/collate.md] ## 概要 -(ここに、クラスの概要を記載する) +`collate_byname`は、名前で指定したロケールの文字列の照合を提供する、[`collate`](/reference/locale/collate.md)の派生クラスである。 + +[`collate`](/reference/locale/collate.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`collate`](/reference/locale/collate.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](collate_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](collate_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), new std::collate_byname{"C"}}; + + std::cout << std::boolalpha + << std::has_facet>(loc) << std::endl; +} ``` +* std::collate_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::collate[link collate.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate`](/reference/locale/collate.md) +- [`locale`](locale.md) diff --git a/reference/locale/collate_byname/op_constructor.md b/reference/locale/collate_byname/op_constructor.md new file mode 100644 index 0000000000..ef8ff75cf6 --- /dev/null +++ b/reference/locale/collate_byname/op_constructor.md @@ -0,0 +1,83 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* collate_byname[meta class] +* function[meta id-type] + +```cpp +explicit collate_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit collate_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、文字列の照合ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`collate`](/reference/locale/collate.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `collate_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), new std::collate_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + const auto& fa = std::use_facet>(a); + const auto& fb = std::use_facet>(b); + + const char x[] = "abc"; + const char y[] = "abd"; + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha + << (fa.compare(x, x + 3, y, y + 3) == fb.compare(x, x + 3, y, y + 3)) + << std::endl; +} +``` +* std::collate_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::collate[link /reference/locale/collate.md] +* fa.compare[link /reference/locale/collate/compare.md] +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate`](/reference/locale/collate.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/collate_byname/op_destructor.md b/reference/locale/collate_byname/op_destructor.md new file mode 100644 index 0000000000..1043c51f7f --- /dev/null +++ b/reference/locale/collate_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* collate_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~collate_byname(); // (1) C++98 +``` + +## 概要 +`collate_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`collate_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`collate_byname`のコンストラクタ](op_constructor.md) +- [`collate`](/reference/locale/collate.md) diff --git a/reference/locale/ctype.md b/reference/locale/ctype.md index ab0506499b..8cb24090df 100644 --- a/reference/locale/ctype.md +++ b/reference/locale/ctype.md @@ -16,52 +16,103 @@ namespace std { * ctype_base[link /reference/locale/ctype_base.md] ## 概要 -(ここに、クラスの概要を記載する) +`ctype`は、文字の分類(英字・数字・空白など)と、大文字小文字の変換、および`char`型と`charT`型の相互変換を提供するロケールファセットである。C言語の[``](/reference/cctype.md)の機能をカプセル化したものである。 + +[`basic_istream`](/reference/istream/basic_istream.md)のメンバ関数は、入力の解析における文字の分類にこのファセットを使用する。 + +`ctype`に対しては、`char`型に対するメンバ関数をインライン実装できるようにするための特殊化が提供される。この特殊化は分類テーブルを直接持ち、[`table()`](ctype/table.md)と[`classic_table()`](ctype/classic_table.md)を追加のメンバ関数として持つ。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|----------------------------------------------------------------------------------------------------------| -| `(constructor)` | コンストラクタ | -| `is` | 文字の分類を判定する | -| `scan_is` | 文字列中の、指定した分類に該当する最初の文字を取得する | -| `scan_not` | 文字列中の、指定した分類に該当しない最初の文字を取得する | -| `toupper` | 大文字に変換する | -| `tolower` | 小文字に変換する | -| `widen` | 指定された`char`型の文字に該当する`charT`型の文字を取得する | -| `narrow` | 指定された`charT`型の文字に該当する`char`型の文字を取得する | +| [`(constructor)`](ctype/op_constructor.md) | コンストラクタ | +| [`is`](ctype/is.md) | 文字の分類を判定する | +| [`scan_is`](ctype/scan_is.md) | 文字列中の、指定した分類に該当する最初の文字を取得する | +| [`scan_not`](ctype/scan_not.md) | 文字列中の、指定した分類に該当しない最初の文字を取得する | +| [`toupper`](ctype/toupper.md) | 大文字に変換する | +| [`tolower`](ctype/tolower.md) | 小文字に変換する | +| [`widen`](ctype/widen.md) | 指定された`char`型の文字に該当する`charT`型の文字を取得する | +| [`narrow`](ctype/narrow.md) | 指定された`charT`型の文字に該当する`char`型の文字を取得する | ### 静的メンバ変数 | 名前 | 説明 | |--------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | + + +### `ctype`の特殊化にのみ存在するメンバ + +| 名前 | 説明 | +|------|------| +| [`table`](ctype/table.md) | 文字の分類テーブルを取得する | +| [`classic_table`](ctype/classic_table.md) | `"C"`ロケールにおける文字の分類テーブルを取得する (static) | +| `static const std::size_t table_size;` | 分類テーブルの要素数。値は処理系定義であり、`256`以上であることが規定されている | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|----------------------------------------------------------------------------------------------------------| -| `(destructor)` | デストラクタ | -| `do_is` | 文字列中の、指定した分類に該当する最初の文字を取得する | -| `do_scan_is` | 文字列中の、指定した分類に該当する最初の文字を取得する | -| `do_scan_not` | 文字列中の、指定した分類に該当しない最初の文字を取得する | -| `do_toupper` | 大文字に変換する | -| `do_tolower` | 小文字に変換する | -| `do_widen` | 指定された`char`型の文字に該当する`charT`型の文字を取得する | -| `do_narrow` | 指定された`charT`型の文字に該当する`char`型の文字を取得する | +| [`(destructor)`](ctype/op_destructor.md) | デストラクタ | +| [`do_is`](ctype/do_is.md) | 文字の分類を判定する | +| [`do_scan_is`](ctype/do_scan_is.md) | 文字列中の、指定した分類に該当する最初の文字を取得する | +| [`do_scan_not`](ctype/do_scan_not.md) | 文字列中の、指定した分類に該当しない最初の文字を取得する | +| [`do_toupper`](ctype/do_toupper.md) | 大文字に変換する | +| [`do_tolower`](ctype/do_tolower.md) | 小文字に変換する | +| [`do_widen`](ctype/do_widen.md) | 指定された`char`型の文字に該当する`charT`型の文字を取得する | +| [`do_narrow`](ctype/do_narrow.md) | 指定された`charT`型の文字に該当する`char`型の文字を取得する | -### メンバ型 +## メンバ型 | 名前 | 説明 | |------------------------|------------------------------| | `char_type` | 文字型 `charT` | -### 例 -```cpp +## 例 +```cpp example +#include +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + std::cout << std::boolalpha; + + // 文字の分類を判定する + std::cout << ct.is(std::ctype_base::digit, '5') << std::endl; + + // 大文字へ変換する + std::string s = "abc"; + ct.toupper(&s[0], &s[0] + s.size()); + std::cout << s << std::endl; +} ``` +* std::ctype[color ff0000] +* ct.is[link ctype/is.md] +* ct.toupper[link ctype/toupper.md] +* std::ctype_base::digit[link ctype_base.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +true +ABC ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype_byname`](ctype_byname.md) +- [`ctype_base`](ctype_base.md) +- [`locale`](locale.md) +- [`std::isalpha`](isalpha.md) diff --git a/reference/locale/ctype/classic_table.md b/reference/locale/ctype/classic_table.md new file mode 100644 index 0000000000..40733c24b8 --- /dev/null +++ b/reference/locale/ctype/classic_table.md @@ -0,0 +1,65 @@ +# classic_table +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +static const mask* classic_table() throw(); // (1) C++98 +static const mask* classic_table() noexcept; // (1) C++11 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +`"C"`ロケールにおける文字の分類テーブルを取得する。 + +このメンバ関数は、`ctype`の特殊化にのみ存在する。 + + +## 戻り値 +`"C"`ロケールの`ctype`の意味論を実装するのに十分な、`table_size`個の要素を持つ配列の先頭へのポインタを返す。 + + +## 例 +```cpp example +#include +#include + +int main() +{ + const std::ctype::mask* tbl = std::ctype::classic_table(); + + if (tbl == nullptr) { + std::cout << "no table" << std::endl; + } + else { + // 'a'は英字に分類される + std::cout << std::boolalpha + << ((tbl[static_cast('a')] & std::ctype_base::alpha) != 0) + << std::endl; + } +} +``` +* classic_table[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::ctype_base::alpha[link /reference/locale/ctype_base.md] + +### 出力例 +``` +true +``` + +- 規格上はテーブルへの有効なポインタが返るが、一部の環境ではヌルポインタが返り`no table`が出力される(下記の備考を参照) + +## バージョン +### 言語 +- C++98 + + +### 備考 +- macOS上のlibstdc++など、一部の環境では`classic_table()`がヌルポインタを返す + + +## 関連項目 +- [`ctype::table`](table.md) +- [`ctype_base`](/reference/locale/ctype_base.md) diff --git a/reference/locale/ctype/do_is.md b/reference/locale/ctype/do_is.md new file mode 100644 index 0000000000..025ce7ea69 --- /dev/null +++ b/reference/locale/ctype/do_is.md @@ -0,0 +1,42 @@ +# do_is +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual bool + do_is(mask m, + charT c) const; // (1) C++98 + + virtual const charT* + do_is(const charT* low, + const charT* high, + mask* vec) const; // (2) C++98 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字の分類を判定する。[`is()`](is.md)から呼び出される仮想関数である。 + + +## 効果 +1文字、もしくは文字列を分類する。各実引数の文字について、[`ctype_base::mask`](/reference/locale/ctype_base.md)型の値`M`を求める。 + +- (2) : 範囲`[low, high)`の各文字`*p`について求めた値を、`vec[p - low]`へ格納する + + +## 戻り値 +- (1) : 式`(M & m) != 0`の結果。すなわち、文字が指定された特性を持つ場合は`true` +- (2) : `high` + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::is`](is.md) +- [`ctype_base`](/reference/locale/ctype_base.md) diff --git a/reference/locale/ctype/do_narrow.md b/reference/locale/ctype/do_narrow.md new file mode 100644 index 0000000000..9e6f4c738f --- /dev/null +++ b/reference/locale/ctype/do_narrow.md @@ -0,0 +1,47 @@ +# do_narrow +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual char + do_narrow(charT c, + char dfault) const; // (1) C++98 + + virtual const charT* + do_narrow(const charT* low, + const charT* high, + char dfault, + char* dest) const; // (2) C++98 +``` + +## 概要 +指定された`charT`型の文字に該当する`char`型の文字を取得する。[`narrow()`](narrow.md)から呼び出される仮想関数である。 + + +## 効果 +`charT`型の値、もしくはその列から、対応する`char`型の値へ、最も単純で妥当な変換を適用する。 + +- (2) : 範囲`[low, high)`の各文字`*p`を変換し、結果(単純な変換が得られない場合は`dfault`)を`dest[p - low]`へ格納する + + +## 戻り値 +- (1) : 変換した値。単純な変換が得られない場合は`dfault` +- (2) : `high` + + +## 備考 +基本文字集合に含まれる任意の文字`c`について、変換は[`do_widen`](do_widen.md)`(do_narrow(c, 0)) == c`を満たす。 + +また、任意の数字文字`c`について、式`(do_narrow(c, dfault) - '0')`はその文字の数字としての値に評価される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::narrow`](narrow.md) +- [`ctype::do_widen`](do_widen.md) diff --git a/reference/locale/ctype/do_scan_is.md b/reference/locale/ctype/do_scan_is.md new file mode 100644 index 0000000000..f1dfd5bfe0 --- /dev/null +++ b/reference/locale/ctype/do_scan_is.md @@ -0,0 +1,33 @@ +# do_scan_is +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual const charT* + do_scan_is(mask m, + const charT* low, + const charT* high) const; // (1) C++98 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字列中の、指定した分類に該当する最初の文字を取得する。[`scan_is()`](scan_is.md)から呼び出される仮想関数である。 + + +## 効果 +バッファ内で、分類`m`に該当する文字を検索する。 + + +## 戻り値 +範囲`[low, high)`内で、[`is(m, *p)`](is.md)が`true`を返すような最小のポインタ`p`。そのような文字がない場合は`high`。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::scan_is`](scan_is.md) diff --git a/reference/locale/ctype/do_scan_not.md b/reference/locale/ctype/do_scan_not.md new file mode 100644 index 0000000000..d02dc91b2c --- /dev/null +++ b/reference/locale/ctype/do_scan_not.md @@ -0,0 +1,33 @@ +# do_scan_not +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual const charT* + do_scan_not(mask m, + const charT* low, + const charT* high) const; // (1) C++98 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字列中の、指定した分類に該当しない最初の文字を取得する。[`scan_not()`](scan_not.md)から呼び出される仮想関数である。 + + +## 効果 +バッファ内で、分類`m`に該当しない文字を検索する。 + + +## 戻り値 +範囲`[low, high)`内で、[`is(m, *p)`](is.md)が`false`を返すような最小のポインタ`p`。そのような文字がない場合は`high`。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::scan_not`](scan_not.md) diff --git a/reference/locale/ctype/do_tolower.md b/reference/locale/ctype/do_tolower.md new file mode 100644 index 0000000000..209ec3e675 --- /dev/null +++ b/reference/locale/ctype/do_tolower.md @@ -0,0 +1,37 @@ +# do_tolower +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual charT + do_tolower(charT c) const; // (1) C++98 + virtual const charT* + do_tolower(charT* low, + const charT* high) const; // (2) C++98 +``` + +## 概要 +小文字に変換する。[`tolower()`](tolower.md)から呼び出される仮想関数である。 + + +## 効果 +1文字、もしくは文字列を小文字に変換する。 + +- (2) : 範囲`[low, high)`の各文字`*p`のうち、対応する小文字が存在するものを、その文字で置き換える + + +## 戻り値 +- (1) : 対応する小文字が存在することが分かっている場合はその文字。そうでない場合は実引数`c` +- (2) : `high` + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::tolower`](tolower.md) diff --git a/reference/locale/ctype/do_toupper.md b/reference/locale/ctype/do_toupper.md new file mode 100644 index 0000000000..7dd955088a --- /dev/null +++ b/reference/locale/ctype/do_toupper.md @@ -0,0 +1,37 @@ +# do_toupper +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual charT + do_toupper(charT c) const; // (1) C++98 + + virtual const charT* + do_toupper(charT* low, const charT* high) const; // (2) C++98 +``` + +## 概要 +大文字に変換する。[`toupper()`](toupper.md)から呼び出される仮想関数である。 + + +## 効果 +1文字、もしくは文字列を大文字に変換する。 + +- (2) : 範囲`[low, high)`の各文字`*p`のうち、対応する大文字が存在するものを、その文字で置き換える + + +## 戻り値 +- (1) : 対応する大文字が存在することが分かっている場合はその文字。そうでない場合は実引数`c` +- (2) : `high` + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::toupper`](toupper.md) diff --git a/reference/locale/ctype/do_widen.md b/reference/locale/ctype/do_widen.md new file mode 100644 index 0000000000..c9b764bd65 --- /dev/null +++ b/reference/locale/ctype/do_widen.md @@ -0,0 +1,45 @@ +# do_widen +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + virtual charT + do_widen(char c) const; // (1) C++98 + + virtual const char* + do_widen(const char* low, + const char* high, + charT* dest) const; // (2) C++98 +``` + +## 概要 +指定された`char`型の文字に該当する`charT`型の文字を取得する。[`widen()`](widen.md)から呼び出される仮想関数である。 + + +## 効果 +`char`型の値、もしくはその列から、対応する`charT`型の値へ、最も単純で妥当な変換を適用する。 + +一意な変換が要求されるのは、基本文字集合に含まれる文字のみである。 + +- (2) : 範囲`[low, high)`の各文字`*p`を変換し、結果を`dest[p - low]`へ格納する + + +## 戻り値 +- (1) : 変換した値 +- (2) : `high` + + +## 備考 +名前付きの`ctype`カテゴリと、その`ctype`ファセット`ctc`、および妥当な[`ctype_base::mask`](/reference/locale/ctype_base.md)の値`M`について、`ctc.is(M, c) || !is(M, do_widen(c))`が`true`となる。すなわち、変換後の文字は、変換前の文字`c`が属さない分類には属さない。 + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::widen`](widen.md) diff --git a/reference/locale/ctype/is.md b/reference/locale/ctype/is.md new file mode 100644 index 0000000000..2694c508bc --- /dev/null +++ b/reference/locale/ctype/is.md @@ -0,0 +1,78 @@ +# is +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +bool + is(mask m, charT c) const; // (1) C++98 + +const charT* + is(const charT* low, + const charT* high, + mask* vec) const; // (2) C++98 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字の分類を判定する。 + +- (1) : 文字`c`が分類`m`に該当するかを判定する +- (2) : 範囲`[low, high)`の各文字の分類を`vec`へ格納する + + +## 戻り値 +- (1) : [`do_is(m, c)`](do_is.md) +- (2) : [`do_is(low, high, vec)`](do_is.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + std::cout << std::boolalpha; + + // (1) + std::cout << ct.is(std::ctype_base::digit, '5') << std::endl; + std::cout << ct.is(std::ctype_base::alpha, '5') << std::endl; + + // (2) + const char s[] = "a1"; + std::ctype_base::mask vec[2] = {}; + ct.is(s, s + 2, vec); + + std::cout << ((vec[0] & std::ctype_base::alpha) != 0) << std::endl; + std::cout << ((vec[1] & std::ctype_base::digit) != 0) << std::endl; +} +``` +* is[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::ctype_base::digit[link /reference/locale/ctype_base.md] +* std::ctype_base::alpha[link /reference/locale/ctype_base.md] +* std::ctype_base::mask[link /reference/locale/ctype_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +true +false +true +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_is`](do_is.md) +- [`ctype_base`](/reference/locale/ctype_base.md) +- [`ctype::scan_is`](scan_is.md) diff --git a/reference/locale/ctype/narrow.md b/reference/locale/ctype/narrow.md new file mode 100644 index 0000000000..6b5cbdd5f7 --- /dev/null +++ b/reference/locale/ctype/narrow.md @@ -0,0 +1,69 @@ +# narrow +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +char + narrow(charT c, + char dfault) const; // (1) C++98 + +const charT* + narrow(const charT* low, + const charT* high, + char dfault, + char* to) const; // (2) C++98 +``` + +## 概要 +指定された`charT`型の文字に該当する`char`型の文字を取得する。 + +- (1) : 文字`c`を`char`型へ変換する。変換できない場合は`dfault`を返す +- (2) : 範囲`[low, high)`の各文字を`char`型へ変換し、`to`が指す領域へ格納する + + +## 戻り値 +- (1) : [`do_narrow(c, dfault)`](do_narrow.md) +- (2) : [`do_narrow(low, high, dfault, to)`](do_narrow.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + // (1) + std::cout << ct.narrow(L'a', '?') << std::endl; + + // (2) + const wchar_t s[] = L"abc"; + char buf[4] = {}; + ct.narrow(s, s + 3, '?', buf); + + std::cout << buf << std::endl; +} +``` +* narrow[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +a +abc +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_narrow`](do_narrow.md) +- [`ctype::widen`](widen.md) diff --git a/reference/locale/ctype/op_constructor.md b/reference/locale/ctype/op_constructor.md new file mode 100644 index 0000000000..176f7b0889 --- /dev/null +++ b/reference/locale/ctype/op_constructor.md @@ -0,0 +1,50 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +// 主テンプレート +explicit ctype(size_t refs = 0); // (1) C++98 + +// ctypeの特殊化 +explicit ctype(const mask* tbl = nullptr, + bool del = false, + size_t refs = 0); // (2) C++98 +``` +* mask[link /reference/locale/ctype_base.md] +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`ctype`ファセットオブジェクトを構築する。 + +- (1) : 主テンプレートのコンストラクタ +- (2) : `ctype`の特殊化のコンストラクタ。文字の分類テーブル`tbl`を指定する + + +## 事前条件 +- (2) : `tbl == nullptr`であるか、`[tbl, tbl + table_size)`が妥当な範囲であること + + +## 効果 +- (1), (2) : 基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する +- (2) : `tbl`が非ヌルポインタの場合、[`table()`](table.md)はその値を返すようになる。ヌルポインタの場合、[`table()`](table.md)は[`classic_table()`](classic_table.md)を返す + + +## 備考 +- (2) : `del`が`true`であり、かつ`tbl`が非ヌルポインタである場合、[デストラクタ](op_destructor.md)で`delete[] `[`table()`](table.md)が実行される +- (1), (2) : `refs`は、このファセットの参照カウントの初期値である + - `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される + - `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`ctype_byname`](/reference/locale/ctype_byname.md) +- [`ctype::table`](table.md) diff --git a/reference/locale/ctype/op_destructor.md b/reference/locale/ctype/op_destructor.md new file mode 100644 index 0000000000..9b82e12cad --- /dev/null +++ b/reference/locale/ctype/op_destructor.md @@ -0,0 +1,32 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +protected: + ~ctype(); // (1) C++98 +``` + +## 概要 +`ctype`ファセットオブジェクトを破棄する。 + + +## 効果 +`ctype`の特殊化では、[コンストラクタ](op_constructor.md)の第1引数が非ヌルポインタであり、かつ第2引数が`true`であった場合、`delete[] `[`table()`](table.md)を実行する。 + + +## 備考 +このデストラクタは`protected`である。そのため`ctype`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/ctype/scan_is.md b/reference/locale/ctype/scan_is.md new file mode 100644 index 0000000000..a88dfb2f7a --- /dev/null +++ b/reference/locale/ctype/scan_is.md @@ -0,0 +1,55 @@ +# scan_is +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +const charT* scan_is(mask m, const charT* low, const charT* high) const; // (1) C++98 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字列中の、指定した分類に該当する最初の文字を取得する。 + + +## 戻り値 +[`do_scan_is(m, low, high)`](do_scan_is.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + const char s[] = "ab1c"; + + // 最初の数字の位置を得る + const char* p = ct.scan_is(std::ctype_base::digit, s, s + 4); + + std::cout << (p - s) << std::endl; +} +``` +* scan_is[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::ctype_base::digit[link /reference/locale/ctype_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +2 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_scan_is`](do_scan_is.md) +- [`ctype::scan_not`](scan_not.md) diff --git a/reference/locale/ctype/scan_not.md b/reference/locale/ctype/scan_not.md new file mode 100644 index 0000000000..a2f17968b7 --- /dev/null +++ b/reference/locale/ctype/scan_not.md @@ -0,0 +1,55 @@ +# scan_not +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +const charT* scan_not(mask m, const charT* low, const charT* high) const; // (1) C++98 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字列中の、指定した分類に該当しない最初の文字を取得する。 + + +## 戻り値 +[`do_scan_not(m, low, high)`](do_scan_not.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + const char s[] = "ab1c"; + + // 最初の英字ではない文字の位置を得る + const char* p = ct.scan_not(std::ctype_base::alpha, s, s + 4); + + std::cout << (p - s) << std::endl; +} +``` +* scan_not[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::ctype_base::alpha[link /reference/locale/ctype_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +2 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_scan_not`](do_scan_not.md) +- [`ctype::scan_is`](scan_is.md) diff --git a/reference/locale/ctype/table.md b/reference/locale/ctype/table.md new file mode 100644 index 0000000000..be00222e11 --- /dev/null +++ b/reference/locale/ctype/table.md @@ -0,0 +1,76 @@ +# table +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +const mask* table() const throw(); // (1) C++98 +const mask* table() const noexcept; // (1) C++11 +``` +* mask[link /reference/locale/ctype_base.md] + +## 概要 +文字の分類テーブルを取得する。 + +このメンバ関数は、`ctype`の特殊化にのみ存在する。 + + +## 戻り値 +コンストラクタの第1引数が非ヌルポインタであった場合はその値、そうでない場合は[`classic_table()`](classic_table.md)を返す。 + + +## 備考 +`ctype`のメンバ関数は、この配列を索くことで文字の分類を判定する。添字は`unsigned char`へキャストした文字の値である。 + +`v >= table_size`であるような`unsigned char`の値`v`について、`table()[v]`は配列の索引を行わずに処理系固有の値を持つものと仮定される。 + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + const std::ctype::mask* tbl = ct.table(); + + if (tbl == nullptr) { + std::cout << "no table" << std::endl; + } + else { + // '5'は数字に分類される + std::cout << std::boolalpha + << ((tbl[static_cast('5')] & std::ctype_base::digit) != 0) + << std::endl; + } +} +``` +* table[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::ctype_base::digit[link /reference/locale/ctype_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力例 +``` +true +``` + +- 規格上はテーブルへの有効なポインタが返るが、一部の環境ではヌルポインタが返り`no table`が出力される(下記の備考を参照) + +## バージョン +### 言語 +- C++98 + + +### 備考 +- macOS上のlibstdc++など、一部の環境では`table()`と[`classic_table()`](classic_table.md)がヌルポインタを返す + + +## 関連項目 +- [`ctype::classic_table`](classic_table.md) +- [`ctype_base`](/reference/locale/ctype_base.md) +- [`ctype::is`](is.md) diff --git a/reference/locale/ctype/tolower.md b/reference/locale/ctype/tolower.md new file mode 100644 index 0000000000..d15ad22877 --- /dev/null +++ b/reference/locale/ctype/tolower.md @@ -0,0 +1,65 @@ +# tolower +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +charT + tolower(charT c) const; // (1) C++98 + +const charT* + tolower(charT* low, + const charT* high) const; // (2) C++98 +``` + +## 概要 +小文字に変換する。 + +- (1) : 文字`c`を小文字に変換する +- (2) : 範囲`[low, high)`の各文字を小文字に変換する + + +## 戻り値 +- (1) : [`do_tolower(c)`](do_tolower.md) +- (2) : [`do_tolower(low, high)`](do_tolower.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + // (1) + std::cout << ct.tolower('A') << std::endl; + + // (2) + std::string s = "ABC"; + ct.tolower(&s[0], &s[0] + s.size()); + std::cout << s << std::endl; +} +``` +* tolower[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +a +abc +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_tolower`](do_tolower.md) +- [`ctype::toupper`](toupper.md) diff --git a/reference/locale/ctype/toupper.md b/reference/locale/ctype/toupper.md new file mode 100644 index 0000000000..7559d8444c --- /dev/null +++ b/reference/locale/ctype/toupper.md @@ -0,0 +1,64 @@ +# toupper +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +charT + toupper(charT c) const; // (1) C++98 +const charT* + toupper(charT* low, + const charT* high) const; // (2) C++98 +``` + +## 概要 +大文字に変換する。 + +- (1) : 文字`c`を大文字に変換する +- (2) : 範囲`[low, high)`の各文字を大文字に変換する + + +## 戻り値 +- (1) : [`do_toupper(c)`](do_toupper.md) +- (2) : [`do_toupper(low, high)`](do_toupper.md) + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + // (1) + std::cout << ct.toupper('a') << std::endl; + + // (2) + std::string s = "abc"; + ct.toupper(&s[0], &s[0] + s.size()); + std::cout << s << std::endl; +} +``` +* toupper[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +A +ABC +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_toupper`](do_toupper.md) +- [`ctype::tolower`](tolower.md) diff --git a/reference/locale/ctype/widen.md b/reference/locale/ctype/widen.md new file mode 100644 index 0000000000..259715a6a3 --- /dev/null +++ b/reference/locale/ctype/widen.md @@ -0,0 +1,67 @@ +# widen +* locale[meta header] +* std[meta namespace] +* ctype[meta class] +* function[meta id-type] + +```cpp +charT + widen(char c) const; // (1) C++98 + +const char* + widen(const char* low, + const char* high, + charT* to) const; // (2) C++98 +``` + +## 概要 +指定された`char`型の文字に該当する`charT`型の文字を取得する。 + +- (1) : 文字`c`を`charT`型へ変換する +- (2) : 範囲`[low, high)`の各文字を`charT`型へ変換し、`to`が指す領域へ格納する + + +## 戻り値 +- (1) : [`do_widen(c)`](do_widen.md) +- (2) : [`do_widen(low, high, to)`](do_widen.md) + + +## 例 +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + // (1) + std::wcout << ct.widen('a') << std::endl; + + // (2) + const char s[] = "abc"; + wchar_t buf[4] = {}; + ct.widen(s, s + 3, buf); + + std::wcout << buf << std::endl; +} +``` +* widen[color ff0000] +* std::ctype[link /reference/locale/ctype.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力 +``` +a +abc +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype::do_widen`](do_widen.md) +- [`ctype::narrow`](narrow.md) diff --git a/reference/locale/ctype_base.md b/reference/locale/ctype_base.md index 646d55b09f..2f8ac40ce4 100644 --- a/reference/locale/ctype_base.md +++ b/reference/locale/ctype_base.md @@ -10,7 +10,9 @@ namespace std { ``` ## 概要 -(ここに、クラスの概要を記載する) +`ctype_base`は、[`ctype`](ctype.md)が使用する文字分類のためのビットマスク型と、その定数を定義する基底クラスである。 + +[`ctype`](ctype.md)はこのクラスを継承しており、[`ctype::is()`](ctype/is.md)などのメンバ関数へ渡す分類の指定にこれらの定数を使用する。複数の分類は`|`で組み合わせられる。 ### メンバ型 @@ -37,13 +39,45 @@ namespace std { ## 例 -```cpp +```cpp example +#include +#include + +int main() +{ + const auto& ct = std::use_facet>(std::locale::classic()); + + std::cout << std::boolalpha; + + // 複数の分類を|で組み合わせて指定できる + std::cout << ct.is(std::ctype_base::alpha | std::ctype_base::digit, '5') << std::endl; + std::cout << ct.is(std::ctype_base::punct, '5') << std::endl; +} ``` +* std::ctype_base::alpha[color ff0000] +* std::ctype_base::digit[color ff0000] +* std::ctype_base::punct[color ff0000] +* std::ctype[link ctype.md] +* ct.is[link ctype/is.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +true +false ``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype`](ctype.md) +- [`ctype::is`](ctype/is.md) + ## 参照 - [LWG Issue 4037. Static data members of `ctype_base` are not yet required to be usable in constant expressions](https://cplusplus.github.io/LWG/issue4037) - C++26で、各メンバ定数が`static const`から`static constexpr`に変更され、定数式で使用できることが規定された diff --git a/reference/locale/ctype_byname.md b/reference/locale/ctype_byname.md index 8a8f2a00d8..90806bed8b 100644 --- a/reference/locale/ctype_byname.md +++ b/reference/locale/ctype_byname.md @@ -12,32 +12,64 @@ namespace std { * ctype[link /reference/locale/ctype.md] ## 概要 -(ここに、クラスの概要を記載する) +`ctype_byname`は、名前で指定したロケールの文字の分類を提供する、[`ctype`](/reference/locale/ctype.md)の派生クラスである。 + +[`ctype`](/reference/locale/ctype.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`ctype`](/reference/locale/ctype.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](ctype_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](ctype_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------|--------------------------------------------------------| | `mask` | ビットマスク型 `ctype::mask` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), new std::ctype_byname{"C"}}; + + std::cout << std::boolalpha + << std::has_facet>(loc) << std::endl; +} ``` +* std::ctype_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::ctype[link ctype.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype`](/reference/locale/ctype.md) +- [`locale`](locale.md) diff --git a/reference/locale/ctype_byname/op_constructor.md b/reference/locale/ctype_byname/op_constructor.md new file mode 100644 index 0000000000..c6fb494322 --- /dev/null +++ b/reference/locale/ctype_byname/op_constructor.md @@ -0,0 +1,81 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* ctype_byname[meta class] +* function[meta id-type] + +```cpp +explicit ctype_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit ctype_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、文字の分類ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`ctype`](/reference/locale/ctype.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `ctype_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), new std::ctype_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + const auto& fa = std::use_facet>(a); + const auto& fb = std::use_facet>(b); + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha + << (fa.is(std::ctype_base::digit, '5') == fb.is(std::ctype_base::digit, '5')) + << std::endl; +} +``` +* std::ctype_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::ctype[link /reference/locale/ctype.md] +* std::ctype_base::digit[link /reference/locale/ctype_base.md] +* fa.is[link /reference/locale/ctype/is.md] +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype`](/reference/locale/ctype.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/ctype_byname/op_destructor.md b/reference/locale/ctype_byname/op_destructor.md new file mode 100644 index 0000000000..a0bd6543c0 --- /dev/null +++ b/reference/locale/ctype_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* ctype_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~ctype_byname(); // (1) C++98 +``` + +## 概要 +`ctype_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`ctype_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`ctype_byname`のコンストラクタ](op_constructor.md) +- [`ctype`](/reference/locale/ctype.md) diff --git a/reference/locale/locale/op_call.md b/reference/locale/locale/op_call.md index 0f115b1d86..bb316a21a0 100644 --- a/reference/locale/locale/op_call.md +++ b/reference/locale/locale/op_call.md @@ -29,7 +29,7 @@ return std::use_facet>(*this).compare( ``` * std::use_facet[link ../use_facet.md] * std::collate[link ../collate.md] -* compare[link ../collate/compare.md.nolink] +* compare[link ../collate/compare.md] ## 例 diff --git a/reference/locale/messages.md b/reference/locale/messages.md index 5c1180069c..546fcd0ae8 100644 --- a/reference/locale/messages.md +++ b/reference/locale/messages.md @@ -13,45 +13,147 @@ namespace std { * messages_base[link /reference/locale/messages_base.md] ## 概要 -(ここに、クラスの概要を記載する) +`messages`は、メッセージカタログから翻訳済みメッセージを取得するためのロケールファセットである。 + +カタログの識別方法やメッセージの対応付けは処理系定義であり、POSIX環境では`catgets`や`gettext`のような仕組みに対応付けられる。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|--------------------------------------| -| `(constructor)` | コンストラクタ | -| `open` | 翻訳カタログを開く | -| `get` | 翻訳メッセージを取得する | -| `close` | 翻訳カタログを閉じる | +| [`(constructor)`](messages/op_constructor.md) | コンストラクタ | +| [`open`](messages/open.md) | 翻訳カタログを開く | +| [`get`](messages/get.md) | 翻訳メッセージを取得する | +| [`close`](messages/close.md) | 翻訳カタログを閉じる | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------------------------| -| `(destructor)` | デストラクタ | -| `do_open` | 翻訳カタログを開く | -| `do_get` | 翻訳メッセージを取得する | -| `do_close` | 翻訳カタログを閉じる | +| [`(destructor)`](messages/op_destructor.md) | デストラクタ | +| [`do_open`](messages/do_open.md) | 翻訳カタログを開く (virtual) | +| [`do_get`](messages/do_get.md) | 翻訳メッセージを取得する (virtual) | +| [`do_close`](messages/do_close.md) | 翻訳カタログを閉じる (virtual) | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | + +## 例 +### 基本的な使い方 +```cpp example +#include +#include + +int main() +{ + std::locale loc = std::locale::classic(); + const auto& msgs = std::use_facet>(loc); + + // メッセージカタログを開く + std::messages_base::catalog cat = msgs.open("hello", loc); + + if (cat < 0) { + std::cout << "cannot open" << std::endl; + } + else { + // 第2引数はセット番号、第3引数はメッセージ番号、 + // 第4引数はメッセージが見つからなかった場合の既定値 + std::cout << msgs.get(cat, 1, 1, "default message") << std::endl; + + msgs.close(cat); + } +} +``` +* std::messages[color ff0000] +* std::messages_base::catalog[link messages_base.md] +* msgs.open[link messages/open.md] +* msgs.get[link messages/get.md] +* msgs.close[link messages/close.md] +* std::use_facet[link use_facet.md] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] + +#### 出力例 +``` +default message +``` + +- カタログ名からカタログへの対応付け、およびメッセージの対応付けは処理系定義である +- カタログを用意していない場合、カタログを開けない処理系では`cannot open`が、開ける処理系では既定値`default message`が出力される + +### 用意したメッセージカタログから翻訳メッセージを取得する +カタログの形式と探索方法は処理系定義であるため、あらかじめ処理系が要求する形式でカタログを用意する必要がある。以下は、POSIXの`catgets`形式のカタログを使用する処理系(libc++等)での例である。 + +まず、メッセージのソースファイル`hello.msg`を用意する。 + +``` +$set 1 +1 Hello, world! +2 Goodbye +``` + +これをPOSIXの`gencat`コマンドでカタログファイルへ変換する。 + +``` +gencat hello.cat hello.msg +``` + +このカタログを開いて、セット番号`1`・メッセージ番号`1`のメッセージを取得する。 -### 例 ```cpp +#include +#include + +int main() +{ + std::locale loc = std::locale::classic(); + const auto& msgs = std::use_facet>(loc); + + std::messages_base::catalog cat = msgs.open("./hello.cat", loc); + + if (cat >= 0) { + // カタログに登録されているメッセージが返る + std::cout << msgs.get(cat, 1, 1, "default message") << std::endl; + + msgs.close(cat); + } +} ``` +* std::messages[color ff0000] +* std::messages_base::catalog[link messages_base.md] +* msgs.open[link messages/open.md] +* msgs.get[link messages/get.md] +* msgs.close[link messages/close.md] +* std::use_facet[link use_facet.md] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] -### 出力 +#### 出力例 ``` +Hello, world! ``` -### 参照 +- GNU gettext形式のカタログを使用する処理系(NLSを有効にしたlibstdc++等)では、`msgfmt`コマンドで作成した`.mo`ファイルを、`open()`にドメイン名を渡して使用する +- カタログ機構を持たない処理系(macOS上のlibstdc++等)では、`open()`は成功するが`get()`は常に既定値を返す + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages_base`](messages_base.md) +- [`messages_byname`](messages_byname.md) +- [`locale`](locale.md) diff --git a/reference/locale/messages/close.md b/reference/locale/messages/close.md new file mode 100644 index 0000000000..b0f049ff05 --- /dev/null +++ b/reference/locale/messages/close.md @@ -0,0 +1,86 @@ +# close +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +void close(catalog cat) const; // (1) C++98 +``` +* catalog[link /reference/locale/messages_base.md] + +## 概要 +メッセージカタログを閉じる。 + + +## 効果 +[`do_close(cat)`](do_close.md)を呼び出す。 + + +## 戻り値 +なし + +## 例 +メッセージカタログの形式と探索方法は処理系定義である。以下は、POSIXの`catgets`形式のカタログを使用する処理系での例である。 + +メッセージのソースファイル`hello.msg`を、 + +``` +$set 1 +1 Hello, world! +2 Goodbye +``` + +POSIXの`gencat`コマンドでカタログファイル`hello.cat`へ変換したものが存在するとする。 + +``` +gencat hello.cat hello.msg +``` + +```cpp +#include +#include + +int main() +{ + std::locale loc = std::locale::classic(); + const auto& msgs = std::use_facet>(loc); + + std::messages_base::catalog cat = msgs.open("./hello.cat", loc); + + if (cat >= 0) { + std::cout << msgs.get(cat, 1, 1, "default message") << std::endl; + + // 使い終わったカタログを閉じる + msgs.close(cat); + + std::cout << "closed" << std::endl; + } +} +``` +* close[color ff0000] +* msgs.open[link open.md] +* msgs.get[link get.md] +* std::messages[link /reference/locale/messages.md] +* std::messages_base::catalog[link /reference/locale/messages_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力例 +``` +Hello, world! +closed +``` + +- カタログを用意していない場合や、カタログ機構を持たない処理系では異なる結果となる。詳細は[`messages`](/reference/locale/messages.md)クラスのページを参照 + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages::do_close`](do_close.md) +- [`messages::open`](open.md) diff --git a/reference/locale/messages/do_close.md b/reference/locale/messages/do_close.md new file mode 100644 index 0000000000..da1d7cbeb4 --- /dev/null +++ b/reference/locale/messages/do_close.md @@ -0,0 +1,38 @@ +# do_close +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +protected: + virtual void do_close(catalog cat) const; // (1) C++98 +``` +* catalog[link /reference/locale/messages_base.md] + +## 概要 +メッセージカタログを閉じる。[`close()`](close.md)から呼び出される仮想関数である。 + + +## 事前条件 +`cat`が[`open()`](open.md)から取得され、まだ閉じられていないカタログであること。 + + +## 効果 +`cat`に関連付けられた未規定のリソースを解放する。 + + +## 戻り値 +なし + + +## 備考 +そのようなリソースの上限は、存在する場合、処理系定義である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages::close`](close.md) diff --git a/reference/locale/messages/do_get.md b/reference/locale/messages/do_get.md new file mode 100644 index 0000000000..16a86d72bc --- /dev/null +++ b/reference/locale/messages/do_get.md @@ -0,0 +1,36 @@ +# do_get +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type + do_get(catalog cat, + int set, + int msgid, + const string_type& dfault) const; // (1) C++98 +``` +* catalog[link /reference/locale/messages_base.md] + +## 概要 +メッセージカタログから、対応する翻訳メッセージを取得する。[`get()`](get.md)から呼び出される仮想関数である。 + + +## 事前条件 +`cat`が[`open()`](open.md)から取得され、まだ閉じられていないカタログであること。 + + +## 戻り値 +処理系定義の対応付けに従い、実引数`set`、`msgid`、`dfault`によって識別されるメッセージを返す。 + +そのようなメッセージが見つからない場合は、`dfault`を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages::get`](get.md) diff --git a/reference/locale/messages/do_open.md b/reference/locale/messages/do_open.md new file mode 100644 index 0000000000..a411b0ae06 --- /dev/null +++ b/reference/locale/messages/do_open.md @@ -0,0 +1,34 @@ +# do_open +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +protected: + virtual catalog do_open(const string& name, const locale& loc) const; // (1) C++98 +``` +* catalog[link /reference/locale/messages_base.md] +* locale[link /reference/locale/locale.md] +* string[link /reference/string/basic_string.md] + +## 概要 +メッセージカタログを開く。[`open()`](open.md)から呼び出される仮想関数である。 + + +## 戻り値 +処理系定義の対応付けに従い、文字列`name`が識別するメッセージカタログからメッセージを取得するために、[`get()`](get.md)へ渡せる値を返す。この値は[`close()`](close.md)へ渡されるまで使用できる。 + +そのようなカタログを開けない場合は、`0`より小さい値を返す。 + + +## 備考 +`loc`は、必要な場合にメッセージ取得時の文字集合の変換のために使用される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages::open`](open.md) diff --git a/reference/locale/messages/get.md b/reference/locale/messages/get.md new file mode 100644 index 0000000000..7871b02137 --- /dev/null +++ b/reference/locale/messages/get.md @@ -0,0 +1,87 @@ +# get +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +string_type + get(catalog cat, + int set, + int msgid, + const string_type& dfault) const; // (1) C++98 +``` +* catalog[link /reference/locale/messages_base.md] + +## 概要 +メッセージカタログから、対応する翻訳メッセージを取得する。 + + +## 戻り値 +[`do_get(cat, set, msgid, dfault)`](do_get.md) + +## 例 +メッセージカタログの形式と探索方法は処理系定義である。以下は、POSIXの`catgets`形式のカタログを使用する処理系での例である。 + +メッセージのソースファイル`hello.msg`を、 + +``` +$set 1 +1 Hello, world! +2 Goodbye +``` + +POSIXの`gencat`コマンドでカタログファイル`hello.cat`へ変換したものが存在するとする。 + +``` +gencat hello.cat hello.msg +``` + +```cpp +#include +#include + +int main() +{ + std::locale loc = std::locale::classic(); + const auto& msgs = std::use_facet>(loc); + + std::messages_base::catalog cat = msgs.open("./hello.cat", loc); + + if (cat >= 0) { + // セット番号1、メッセージ番号1のメッセージを取得する + std::cout << msgs.get(cat, 1, 1, "default message") << std::endl; + + // 存在しないメッセージ番号を指定した場合は、第4引数の既定値が返る + std::cout << msgs.get(cat, 1, 99, "default message") << std::endl; + + msgs.close(cat); + } +} +``` +* get[color ff0000] +* msgs.open[link open.md] +* msgs.close[link close.md] +* std::messages[link /reference/locale/messages.md] +* std::messages_base::catalog[link /reference/locale/messages_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力例 +``` +Hello, world! +default message +``` + +- カタログを用意していない場合や、カタログ機構を持たない処理系では異なる結果となる。詳細は[`messages`](/reference/locale/messages.md)クラスのページを参照 + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages::do_get`](do_get.md) +- [`messages::open`](open.md) diff --git a/reference/locale/messages/op_constructor.md b/reference/locale/messages/op_constructor.md new file mode 100644 index 0000000000..c4f82553f5 --- /dev/null +++ b/reference/locale/messages/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +explicit messages(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`messages`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`messages_byname`](/reference/locale/messages_byname.md) diff --git a/reference/locale/messages/op_destructor.md b/reference/locale/messages/op_destructor.md new file mode 100644 index 0000000000..c71470479c --- /dev/null +++ b/reference/locale/messages/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +protected: + ~messages(); // (1) C++98 +``` + +## 概要 +`messages`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`messages`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/messages/open.md b/reference/locale/messages/open.md new file mode 100644 index 0000000000..326e2efa5c --- /dev/null +++ b/reference/locale/messages/open.md @@ -0,0 +1,86 @@ +# open +* locale[meta header] +* std[meta namespace] +* messages[meta class] +* function[meta id-type] + +```cpp +catalog open(const string& name, const locale& loc) const; // (1) C++98 +``` +* catalog[link /reference/locale/messages_base.md] +* locale[link /reference/locale/locale.md] +* string[link /reference/string/basic_string.md] + +## 概要 +メッセージカタログを開く。 + + +## 戻り値 +[`do_open(name, loc)`](do_open.md) + + +## 備考 +[`get()`](get.md)と[`close()`](close.md)の実引数として使用できる`catalog`型の値は、このメンバ関数を呼び出すことによってのみ取得できる。 + +## 例 +メッセージカタログの形式と探索方法は処理系定義である。以下は、POSIXの`catgets`形式のカタログを使用する処理系での例である。 + +メッセージのソースファイル`hello.msg`を、 + +``` +$set 1 +1 Hello, world! +2 Goodbye +``` + +POSIXの`gencat`コマンドでカタログファイル`hello.cat`へ変換したものが存在するとする。 + +``` +gencat hello.cat hello.msg +``` + +```cpp +#include +#include + +int main() +{ + std::locale loc = std::locale::classic(); + const auto& msgs = std::use_facet>(loc); + + // カタログを開く + std::messages_base::catalog cat = msgs.open("./hello.cat", loc); + + // 開けた場合、0以上の値が返る + std::cout << std::boolalpha << (cat >= 0) << std::endl; + + if (cat >= 0) { + msgs.close(cat); + } +} +``` +* open[color ff0000] +* msgs.close[link close.md] +* std::messages[link /reference/locale/messages.md] +* std::messages_base::catalog[link /reference/locale/messages_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力例 +``` +true +``` + +- カタログを用意していない場合や、カタログ機構を持たない処理系では異なる結果となる。詳細は[`messages`](/reference/locale/messages.md)クラスのページを参照 + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages::do_open`](do_open.md) +- [`messages::get`](get.md) +- [`messages::close`](close.md) diff --git a/reference/locale/messages_base.md b/reference/locale/messages_base.md index 69cc0bbed6..ca2fef9592 100644 --- a/reference/locale/messages_base.md +++ b/reference/locale/messages_base.md @@ -10,7 +10,9 @@ namespace std { ``` ## 概要 -(ここに、クラスの概要を記載する) +`messages_base`は、メッセージカタログを識別するための型を定義する基底クラスである。 + +[`messages`](messages.md)はこのクラスを継承しており、[`messages::open()`](messages/open.md)が返し、[`messages::get()`](messages/get.md)と[`messages::close()`](messages/close.md)が受け取る値の型が`catalog`である。 ### メンバ型 @@ -18,12 +20,45 @@ namespace std { |----------------------|----------------------------------------| | `catalog` | 翻訳カタログ型 `int` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + std::locale loc = std::locale::classic(); + const auto& msgs = std::use_facet>(loc); + + // open()の戻り値の型がmessages_base::catalogである + std::messages_base::catalog cat = msgs.open("nonexistent_catalog", loc); + + if (cat >= 0) { + msgs.close(cat); + } + + std::cout << "done" << std::endl; +} ``` +* std::messages_base::catalog[color ff0000] +* std::messages[link messages.md] +* msgs.open[link messages/open.md] +* msgs.close[link messages/close.md] +* std::use_facet[link use_facet.md] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +done ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages`](messages.md) +- [`messages::open`](messages/open.md) diff --git a/reference/locale/messages_byname.md b/reference/locale/messages_byname.md index b2e8433815..9d6b38fd14 100644 --- a/reference/locale/messages_byname.md +++ b/reference/locale/messages_byname.md @@ -12,33 +12,101 @@ namespace std { * messages[link /reference/locale/messages.md] ## 概要 -(ここに、クラスの概要を記載する) +`messages_byname`は、名前で指定したロケールの翻訳メッセージの取得を提供する、[`messages`](/reference/locale/messages.md)の派生クラスである。 + +[`messages`](/reference/locale/messages.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`messages`](/reference/locale/messages.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](messages_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](messages_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------| | `catalog` | 翻訳カタログ型 [`messages_base`](/reference/locale/messages_base.md)`::catalog` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | + +## 例 +メッセージカタログの形式と探索方法は処理系定義である。以下は、POSIXの`catgets`形式のカタログを使用する処理系での例である。 + +日本語のメッセージのソースファイル`ja.msg`を、 + +``` +$set 1 +1 こんにちは、世界! +``` + +POSIXの`gencat`コマンドでカタログファイル`ja.cat`へ変換したものが存在するとする。 + +``` +gencat ja.cat ja.msg +``` -### 例 ```cpp +#include +#include + +int main() +{ + // メッセージのカテゴリだけを"ja_JP.UTF-8"ロケールのものにし、 + // 数値の書式などその他のカテゴリはCロケールのままにする + std::locale loc{std::locale::classic(), new std::messages_byname{"ja_JP.UTF-8"}}; + + const auto& msgs = std::use_facet>(loc); + + std::messages_base::catalog cat = msgs.open("./ja.cat", loc); + + if (cat >= 0) { + // 日本語のメッセージが取得できる + std::cout << msgs.get(cat, 1, 1, "Hello, world!") << std::endl; + msgs.close(cat); + } + + // 数値の小数点はCロケールのまま + std::cout << std::use_facet>(loc).decimal_point() << std::endl; +} ``` +* std::messages_byname[color ff0000] +* std::messages[link messages.md] +* std::messages_base::catalog[link messages_base.md] +* msgs.open[link messages/open.md] +* msgs.get[link messages/get.md] +* msgs.close[link messages/close.md] +* std::numpunct[link numpunct.md] +* decimal_point()[link numpunct/decimal_point.md] +* std::use_facet[link use_facet.md] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] -### 出力 +### 出力例 ``` +こんにちは、世界! +. ``` -### 参照 +- `messages_byname`を使うと、グローバルロケールを変更することなく、メッセージのカテゴリだけを特定の名前のロケールのものに固定できる +- カタログ名からカタログへの対応付けは処理系定義である。GNU gettextを使用する処理系では、`open()`にドメイン名を渡すことで、ロケール名に対応するカタログが選択される +- 妥当なロケール名は処理系定義である。指定した名前が妥当でない場合、コンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出する + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages`](/reference/locale/messages.md) +- [`locale`](locale.md) diff --git a/reference/locale/messages_byname/op_constructor.md b/reference/locale/messages_byname/op_constructor.md new file mode 100644 index 0000000000..ca8f71c46e --- /dev/null +++ b/reference/locale/messages_byname/op_constructor.md @@ -0,0 +1,110 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* messages_byname[meta class] +* function[meta id-type] + +```cpp +explicit messages_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit messages_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、翻訳メッセージの取得ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`messages`](/reference/locale/messages.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `messages_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +メッセージカタログの形式と探索方法は処理系定義である。以下は、POSIXの`catgets`形式のカタログを使用する処理系での例である。 + +日本語のメッセージのソースファイル`ja.msg`を、 + +``` +$set 1 +1 こんにちは、世界! +``` + +POSIXの`gencat`コマンドでカタログファイル`ja.cat`へ変換したものが存在するとする。 + +``` +gencat ja.cat ja.msg +``` + +```cpp +#include +#include +#include + +int main() +{ + std::string name = "ja_JP.UTF-8"; + + // (1) ロケール名をconst char*で渡す + std::locale loc1{std::locale::classic(), new std::messages_byname{"ja_JP.UTF-8"}}; + + // (2) ロケール名をstringで渡す + std::locale loc2{std::locale::classic(), new std::messages_byname{name}}; + + for (const std::locale& loc : {loc1, loc2}) { + const auto& msgs = std::use_facet>(loc); + + std::messages_base::catalog cat = msgs.open("./ja.cat", loc); + + if (cat >= 0) { + std::cout << msgs.get(cat, 1, 1, "Hello, world!") << std::endl; + msgs.close(cat); + } + } +} +``` +* std::messages_byname[color ff0000] +* std::messages[link /reference/locale/messages.md] +* std::messages_base::catalog[link /reference/locale/messages_base.md] +* msgs.open[link /reference/locale/messages/open.md] +* msgs.get[link /reference/locale/messages/get.md] +* msgs.close[link /reference/locale/messages/close.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] + +### 出力例 +``` +こんにちは、世界! +こんにちは、世界! +``` + +- `messages_byname`を使うと、グローバルロケールを変更することなく、メッセージのカテゴリだけを特定の名前のロケールのものに固定できる +- カタログ名からカタログへの対応付けは処理系定義である。GNU gettextを使用する処理系では、`open()`にドメイン名を渡すことで、ロケール名に対応するカタログが選択される +- 妥当なロケール名は処理系定義である。指定した名前が妥当でない場合、コンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出する + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages`](/reference/locale/messages.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/messages_byname/op_destructor.md b/reference/locale/messages_byname/op_destructor.md new file mode 100644 index 0000000000..468a3093cf --- /dev/null +++ b/reference/locale/messages_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* messages_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~messages_byname(); // (1) C++98 +``` + +## 概要 +`messages_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`messages_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`messages_byname`のコンストラクタ](op_constructor.md) +- [`messages`](/reference/locale/messages.md) diff --git a/reference/locale/money_base.md b/reference/locale/money_base.md index fac073a4d7..d9939a728c 100644 --- a/reference/locale/money_base.md +++ b/reference/locale/money_base.md @@ -14,7 +14,9 @@ namespace std { ``` ## 概要 -(ここに、クラスの概要を記載する) +`money_base`は、金額の書式を表現するための列挙型と構造体を定義する基底クラスである。 + +[`moneypunct`](moneypunct.md)はこのクラスを継承しており、[`moneypunct::pos_format()`](moneypunct/pos_format.md)と[`moneypunct::neg_format()`](moneypunct/neg_format.md)が`pattern`を返す。[`money_get`](money_get.md)と[`money_put`](money_put.md)は、そのパターンに従って金額の解析・書式化を行う。 ### メンバ型 @@ -42,11 +44,40 @@ namespace std { ## 例 -```cpp +```cpp example +#include +#include + +int main() +{ + const auto& mp = std::use_facet>(std::locale::classic()); + + // 規格が要求する特殊化では、{symbol, sign, none, value}の順となる + std::money_base::pattern p = mp.pos_format(); + + std::cout << std::boolalpha + << (p.field[0] == std::money_base::symbol) << std::endl; +} ``` +* std::money_base::pattern[color ff0000] +* std::money_base::symbol[color ff0000] +* std::moneypunct[link moneypunct.md] +* mp.pos_format()[link moneypunct/pos_format.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct`](moneypunct.md) +- [`money_get`](money_get.md) +- [`money_put`](money_put.md) diff --git a/reference/locale/money_get.md b/reference/locale/money_get.md index ef703b45dc..8a67d62b0b 100644 --- a/reference/locale/money_get.md +++ b/reference/locale/money_get.md @@ -13,42 +13,159 @@ namespace std { * locale::facet[link /reference/locale/locale/facet.md] ## 概要 -(ここに、クラスの概要を記載する) +`money_get`は、入力ストリームから金額を読み取り、解析するためのロケールファセットである。 + +書式は[`moneypunct`](moneypunct.md)ファセットから取得した情報によって決まる。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | -| `get` | 金額の解析 | +| [`(constructor)`](money_get/op_constructor.md) | コンストラクタ | +| [`get`](money_get/get.md) | 金額の解析 | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | -| `do_get` | 金額の解析 | +| [`(destructor)`](money_get/op_destructor.md) | デストラクタ | +| [`do_get`](money_get/do_get.md) | 金額の解析 (virtual) | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | | `iter_type` | 入力のイテレータ型 `InputIterator` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include + +int main() +{ + std::istringstream iss{"105623"}; + + // ストリームのロケールからmoney_getファセットを取得する + const auto& facet = std::use_facet>(iss.getloc()); + + std::ios_base::iostate err = std::ios_base::goodbit; + long double units = 0; + + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + false, iss, err, units); + + std::cout << units << std::endl; +} +``` +* std::money_get[color ff0000] +* std::use_facet[link use_facet.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* facet.get[link money_get/get.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] + +#### 出力 +``` +105623 +``` + +### ロケール依存の通貨フォーマットを解析する +金額の書式は、[`get()`](money_get/get.md)へ渡すストリームのロケールに設定された[`std::moneypunct`](/reference/locale/moneypunct.md)ファセットから取得される。そのため、名前付きロケールを指定するだけで、各国の通貨の書式で書かれた文字列を解析できる。 + +```cpp example +#include +#include +#include +#include +#include +#include + +// 解析の処理自体はロケールに依存しない +long double parse_money(const std::locale& loc, const std::string& text) +{ + std::istringstream iss{text}; + iss.imbue(loc); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::ios_base::iostate err = std::ios_base::goodbit; + long double units = 0; + + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + false, iss, err, units); + + if (err & std::ios_base::failbit) { + throw std::runtime_error("parse failed"); + } + return units; +} + +int main() +{ + const char* names[] = {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + const char* texts[] = {"$1,056.23", "¥105,623", "1.056,23 €"}; + + for (int i = 0; i < 3; ++i) { + try { + long double units = parse_money(std::locale{names[i]}, texts[i]); + + // ロケールごとの書式を解析しても、同じ最小単位の整数値が得られる + std::cout << names[i] << " : " << static_cast(units) << std::endl; + } + catch (const std::runtime_error&) { + std::cout << names[i] << " : not available" << std::endl; + } + } +} ``` +* std::money_get[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::failbit[link /reference/ios/ios_base/type-iostate.md] -### 出力 +#### 出力例 ``` +en_US.UTF-8 : 105623 +ja_JP.UTF-8 : 105623 +de_DE.UTF-8 : 105623 ``` -### 参照 +- 米ドルの`$1,056.23`とドイツのユーロの`1.056,23 €`は、桁区切りと小数点の文字も通貨記号の位置も異なるが、いずれも最小単位(セント)での`105623`として解析される +- 日本円の`¥105,623`は[`frac_digits()`](/reference/locale/moneypunct/frac_digits.md)が`0`であるため、`105623`がそのまま円単位の金額として解析される +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_put`](money_put.md) +- [`moneypunct`](moneypunct.md) +- [`money_base`](money_base.md) +- [`locale`](locale.md) diff --git a/reference/locale/money_get/do_get.md b/reference/locale/money_get/do_get.md new file mode 100644 index 0000000000..09137b3439 --- /dev/null +++ b/reference/locale/money_get/do_get.md @@ -0,0 +1,95 @@ +# do_get +* locale[meta header] +* std[meta namespace] +* money_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type + do_get(iter_type s, + iter_type end, + bool intl, + ios_base& str, + ios_base::iostate& err, + long double& units) const; // (1) C++98 + + virtual iter_type + do_get(iter_type s, + iter_type end, + bool intl, + ios_base& str, + ios_base::iostate& err, + string_type& digits) const; // (2) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] + +## 概要 +金額を解析する。[`get()`](get.md)から呼び出される、実際の解析を行う仮想関数である。 + +- (1) : 解析結果を整数値として`units`へ格納する +- (2) : 解析結果を数字の列として`digits`へ格納する + + +## 効果 +`s`から文字を読み取り、金額を解析して構築する。書式は`str.`[`getloc()`](/reference/ios/ios_base/getloc.md)から取得した[`moneypunct`](/reference/locale/moneypunct.md)``ファセット`mp`、文字の対応付けは同様に取得した[`ctype`](/reference/locale/ctype.md)``ファセット`ct`、および`str.`[`flags()`](/reference/ios/ios_base/flags.md)によって決まる。 + +妥当な列を認識した場合、`err`は変更しない。そうでない場合は`err`に[`failbit`](/reference/ios/ios_base/type-iostate.md)を設定し(読み取れる文字がもうない場合は[`eofbit`](/reference/ios/ios_base/type-iostate.md)も設定する)、`units`および`digits`は変更しない。 + +すべての値の解析には[`mp.neg_format()`](/reference/locale/moneypunct/neg_format.md)が返すパターンを使用する。 + +結果は、(1)では`units`に整数値として格納され、(2)では`digits`に数字の列(負の場合は先頭にマイナス符号)として格納される。たとえば米国の一般的なロケールにおける`$1,056.23`は、`units`では`105623`、`digits`では`"105623"`となる。 + +### 桁区切りの扱い +[`mp.grouping()`](/reference/locale/moneypunct/grouping.md)が桁区切りを許可しないことを示す場合、そのような文字は読み取られず、それが最初に現れた位置で解析が終了する。そうでない場合、桁区切りは省略可能であり、存在する場合は、すべての書式要素を読み取った後にのみ配置の正しさが検査される。 + +### 空白と通貨記号の扱い +- 書式パターンの最後の要素が[`money_base::space`](/reference/locale/money_base.md)もしくは[`money_base::none`](/reference/locale/money_base.md)である場合、空白は消費されない +- 書式パターンの先頭側の要素に[`money_base::space`](/reference/locale/money_base.md)が現れる場合、1文字以上の空白が必要である +- 書式パターンの先頭側の要素に[`money_base::none`](/reference/locale/money_base.md)が現れる場合、空白は許容されるが必須ではない +- `(str.flags() & `[`std::ios_base::showbase`](/reference/ios/ios_base/type-fmtflags.md)`)`が`false`である場合、通貨記号は省略可能であり、書式を完成させるために他の文字が必要な場合にのみ消費される。そうでない場合、通貨記号は必須である + +### 符号の扱い +[`mp.positive_sign()`](/reference/locale/moneypunct/positive_sign.md)が返す文字列`pos`、もしくは[`mp.negative_sign()`](/reference/locale/moneypunct/negative_sign.md)が返す文字列`neg`の最初の文字が、書式パターンの`sign`が示す位置で認識された場合、その文字は消費され、文字列の残りの文字は他のすべての書式要素の後に要求される。 + +`pos`または`neg`が空である場合、符号要素は省略可能であり、符号が検出されなかった場合は、空文字列であった側に対応する符号が結果に与えられる。そうでない場合、示された位置の文字は`pos`または`neg`の最初の文字と一致しなければならず、対応する符号が結果に与えられる。`pos`の最初の文字が`neg`の最初の文字と等しい場合、または両方が空である場合、結果には正の符号が与えられる。 + +### 数値部分の抽出と変換 +金額の数値部分の数字は、現れた順に抽出される。結果が負である場合に限り、先頭にマイナス符号が置かれる。抽出された数字は、(2)では`digits`へ直接格納され、(1)では`units`の値を求めるための変換用の文字バッファ`buf1`へ格納される。 + +`units`の値は、以下を行ったかのようにして求められる。 + +```cpp +for (int i = 0; i < n; ++i) + buf2[i] = src[find(atoms, atoms + sizeof(src), buf1[i]) - atoms]; +buf2[n] = 0; +sscanf(buf2, "%Lf", &units); +``` +* find[link /reference/algorithm/find.md] +* sscanf[link /reference/cstdio/sscanf.md.nolink] + +ここで`n`は`buf1`へ格納された文字数、`buf2`は文字バッファであり、`src`と`atoms`は以下のように定義される。 + +```cpp +static const char src[] = "0123456789-"; +charT atoms[sizeof(src)]; +ct.widen(src, src + sizeof(src) - 1, atoms); +``` +* ct.widen[link /reference/locale/ctype/widen.md] + +すなわち、ロケール依存の数字文字`atoms`から、対応する基本文字集合の数字`src`へ読み替えたうえで、[`std::sscanf`](/reference/cstdio/sscanf.md.nolink)によって数値化される。この読み替えは[`ctype::narrow`](/reference/locale/ctype/narrow.md)とは意味論が異なる。 + + +## 戻り値 +妥当な金額の一部として認識した最後の文字の直後を指すイテレータ。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_get::get`](get.md) +- [`moneypunct`](/reference/locale/moneypunct.md) +- [`money_base`](/reference/locale/money_base.md) diff --git a/reference/locale/money_get/get.md b/reference/locale/money_get/get.md new file mode 100644 index 0000000000..74dcdc9392 --- /dev/null +++ b/reference/locale/money_get/get.md @@ -0,0 +1,160 @@ +# get +* locale[meta header] +* std[meta namespace] +* money_get[meta class] +* function[meta id-type] + +```cpp +iter_type + get(iter_type s, + iter_type end, + bool intl, + ios_base& f, + ios_base::iostate& err, + long double& quant) const; // (1) C++98 + +iter_type + get(iter_type s, + iter_type end, + bool intl, + ios_base& f, + ios_base::iostate& err, + string_type& quant) const; // (2) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] + +## 概要 +入力イテレータ範囲`[s, end)`から金額を解析する。 + +- (1) : 解析結果を整数値として`quant`へ格納する +- (2) : 解析結果を数字の列(負の場合は先頭にマイナス符号)として`quant`へ格納する + +`intl`が`true`の場合、国際通貨表現([`moneypunct`](/reference/locale/moneypunct.md)``)の書式が使用される。 + + +## 戻り値 +- (1), (2) : [`do_get(s, end, intl, f, err, quant)`](do_get.md)の戻り値 + + +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include +#include + +int main() +{ + std::istringstream iss{"105623"}; + const auto& facet = std::use_facet>(iss.getloc()); + + std::ios_base::iostate err = std::ios_base::goodbit; + long double units = 0; + + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + false, iss, err, units); + + // 小数点以下の桁を含む整数値として解釈される + std::cout << units << std::endl; +} +``` +* std::money_get[link /reference/locale/money_get.md] +* get[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] + +#### 出力 +``` +105623 +``` + +### ロケール依存の通貨フォーマットを解析する +金額の書式は、[`get()`](get.md)へ渡すストリームのロケールに設定された[`std::moneypunct`](/reference/locale/moneypunct.md)ファセットから取得される。そのため、名前付きロケールを指定するだけで、各国の通貨の書式で書かれた文字列を解析できる。 + +```cpp example +#include +#include +#include +#include +#include +#include + +// 解析の処理自体はロケールに依存しない +long double parse_money(const std::locale& loc, const std::string& text) +{ + std::istringstream iss{text}; + iss.imbue(loc); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::ios_base::iostate err = std::ios_base::goodbit; + long double units = 0; + + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + false, iss, err, units); + + if (err & std::ios_base::failbit) { + throw std::runtime_error("parse failed"); + } + return units; +} + +int main() +{ + const char* names[] = {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + const char* texts[] = {"$1,056.23", "¥105,623", "1.056,23 €"}; + + for (int i = 0; i < 3; ++i) { + try { + long double units = parse_money(std::locale{names[i]}, texts[i]); + + // ロケールごとの書式を解析しても、同じ最小単位の整数値が得られる + std::cout << names[i] << " : " << static_cast(units) << std::endl; + } + catch (const std::runtime_error&) { + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get[color ff0000] +* std::money_get[link /reference/locale/money_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::failbit[link /reference/ios/ios_base/type-iostate.md] + +#### 出力例 +``` +en_US.UTF-8 : 105623 +ja_JP.UTF-8 : 105623 +de_DE.UTF-8 : 105623 +``` + +- 米ドルの`$1,056.23`とドイツのユーロの`1.056,23 €`は、桁区切りと小数点の文字も通貨記号の位置も異なるが、いずれも最小単位(セント)での`105623`として解析される +- 日本円の`¥105,623`は[`frac_digits()`](/reference/locale/moneypunct/frac_digits.md)が`0`であるため、`105623`がそのまま円単位の金額として解析される +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_get::do_get`](do_get.md) +- [`money_put`](/reference/locale/money_put.md) +- [`moneypunct`](/reference/locale/moneypunct.md) diff --git a/reference/locale/money_get/op_constructor.md b/reference/locale/money_get/op_constructor.md new file mode 100644 index 0000000000..9e7ef43c45 --- /dev/null +++ b/reference/locale/money_get/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* money_get[meta class] +* function[meta id-type] + +```cpp +explicit money_get(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`money_get`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`money_get::get`](get.md) diff --git a/reference/locale/money_get/op_destructor.md b/reference/locale/money_get/op_destructor.md new file mode 100644 index 0000000000..6a64ffde35 --- /dev/null +++ b/reference/locale/money_get/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* money_get[meta class] +* function[meta id-type] + +```cpp +protected: + ~money_get(); // (1) C++98 +``` + +## 概要 +`money_get`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`money_get`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_get`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/money_put.md b/reference/locale/money_put.md index dc7b6e19ae..867bff6beb 100644 --- a/reference/locale/money_put.md +++ b/reference/locale/money_put.md @@ -13,42 +13,287 @@ namespace std { * locale::facet[link /reference/locale/locale/facet.md] ## 概要 -(ここに、クラスの概要を記載する) +`money_put`は、金額を書式化して出力ストリームへ出力するためのロケールファセットである。 -### メンバ関数 +書式は[`moneypunct`](moneypunct.md)ファセットから取得した情報によって決まる。 + +## メンバ関数 + +### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | -| `put` | 金額の出力 | +| [`(constructor)`](money_put/op_constructor.md) | コンストラクタ | +| [`put`](money_put/put.md) | 金額の出力 | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | -| `do_put` | 金額の出力 | +| [`(destructor)`](money_put/op_destructor.md) | デストラクタ | +| [`do_put`](money_put/do_put.md) | 金額の出力 (virtual) | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | | `iter_type` | 出力のイテレータ型 `OutputIterator` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include + +int main() +{ + std::ostringstream oss; + + // ストリームのロケールからmoney_putファセットを取得する + const auto& facet = std::use_facet>(oss.getloc()); + + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + + std::cout << oss.str() << std::endl; +} +``` +* std::money_put[color ff0000] +* std::use_facet[link use_facet.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* facet.put[link money_put/put.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力例 +``` +105623 +``` + +- `"C"`ロケールでは通貨記号も桁区切りも設定されていないため、数字のみが出力される + +### 通貨記号と桁区切りを指定する +書式は[`std::moneypunct`](/reference/locale/moneypunct.md)ファセットから取得される。`"C"`ロケールでは通貨記号も桁区切りも設定されていないため、これらを持つファセットをロケールへ組み込む。 + +```cpp example +#include +#include +#include +#include +#include + +// 通貨記号と桁区切りを持つmoneypunctファセット +struct my_moneypunct : std::moneypunct { +protected: + char_type do_decimal_point() const override { return '.'; } + char_type do_thousands_sep() const override { return ','; } + std::string do_grouping() const override { return "\3"; } // 3桁ごとに区切る + string_type do_curr_symbol() const override { return "$"; } + string_type do_negative_sign() const override { return "-"; } + int do_frac_digits() const override { return 2; } // 小数点以下2桁 + + pattern do_pos_format() const override { return pattern{{symbol, sign, none, value}}; } + pattern do_neg_format() const override { return pattern{{symbol, sign, none, value}}; } +}; + +int main() +{ + std::ostringstream oss; + oss.imbue(std::locale{std::locale::classic(), new my_moneypunct{}}); + + const auto& facet = std::use_facet>(oss.getloc()); + + // showbaseを設定すると通貨記号が出力される + oss.setf(std::ios_base::showbase); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + oss << '\n'; + + // showbaseを設定しない場合、通貨記号は出力されない + oss.unsetf(std::ios_base::showbase); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + oss << '\n'; + + // 負の値にはdo_neg_format()のパターンが使用される + oss.setf(std::ios_base::showbase); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', -105623.0L); + + std::cout << oss.str() << std::endl; +} ``` +* std::money_put[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* do_decimal_point[link /reference/locale/moneypunct/do_decimal_point.md] +* do_thousands_sep[link /reference/locale/moneypunct/do_thousands_sep.md] +* do_grouping[link /reference/locale/moneypunct/do_grouping.md] +* do_curr_symbol[link /reference/locale/moneypunct/do_curr_symbol.md] +* do_negative_sign[link /reference/locale/moneypunct/do_negative_sign.md] +* do_frac_digits[link /reference/locale/moneypunct/do_frac_digits.md] +* do_pos_format[link /reference/locale/moneypunct/do_pos_format.md] +* do_neg_format[link /reference/locale/moneypunct/do_neg_format.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.setf[link /reference/ios/ios_base/setf.md] +* oss.unsetf[link /reference/ios/ios_base/unsetf.md] +* std::ios_base::showbase[link /reference/ios/ios_base/type-fmtflags.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] -### 出力 +#### 出力 ``` +$1,056.23 +1,056.23 +$-1,056.23 ``` -### 参照 +- 引数の`105623`は最小単位(この例ではセント)での金額であり、[`do_frac_digits()`](/reference/locale/moneypunct/do_frac_digits.md)が`2`であるため`1,056.23`と表示される + +### 通貨記号を末尾に置く(日本円の例) +通貨記号の位置は[`do_pos_format()`](/reference/locale/moneypunct/do_pos_format.md)・[`do_neg_format()`](/reference/locale/moneypunct/do_neg_format.md)が返すパターンで決まる。`value`より後ろに`symbol`を置くことで、「1,000円」のように値の後ろへ通貨記号を出力できる。 + +```cpp example +#include +#include +#include +#include +#include + +// 日本円のmoneypunctファセット +struct jpy_moneypunct : std::moneypunct { +protected: + char_type do_thousands_sep() const override { return ','; } + std::string do_grouping() const override { return "\3"; } + string_type do_curr_symbol() const override { return "円"; } + string_type do_negative_sign() const override { return "-"; } + int do_frac_digits() const override { return 0; } // 円に補助単位はない + + // 値の後ろに通貨記号を置く + pattern do_pos_format() const override { return pattern{{sign, value, none, symbol}}; } + pattern do_neg_format() const override { return pattern{{sign, value, none, symbol}}; } +}; + +int main() +{ + std::ostringstream oss; + oss.imbue(std::locale{std::locale::classic(), new jpy_moneypunct{}}); + oss.setf(std::ios_base::showbase); + + const auto& facet = std::use_facet>(oss.getloc()); + + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + oss << '\n'; + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', -105623.0L); + + std::cout << oss.str() << std::endl; +} +``` +* std::money_put[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* do_thousands_sep[link /reference/locale/moneypunct/do_thousands_sep.md] +* do_grouping[link /reference/locale/moneypunct/do_grouping.md] +* do_curr_symbol[link /reference/locale/moneypunct/do_curr_symbol.md] +* do_negative_sign[link /reference/locale/moneypunct/do_negative_sign.md] +* do_frac_digits[link /reference/locale/moneypunct/do_frac_digits.md] +* do_pos_format[link /reference/locale/moneypunct/do_pos_format.md] +* do_neg_format[link /reference/locale/moneypunct/do_neg_format.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.setf[link /reference/ios/ios_base/setf.md] +* std::ios_base::showbase[link /reference/ios/ios_base/type-fmtflags.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力 +``` +105,623円 +-105,623円 +``` + +- [`do_frac_digits()`](/reference/locale/moneypunct/do_frac_digits.md)が`0`であるため、引数の値がそのまま円単位の金額として扱われる + +### ロケールによって通貨を切り替える +金額の書式は、[`put()`](money_put/put.md)へ渡すストリームのロケールに設定された[`std::moneypunct`](/reference/locale/moneypunct.md)ファセットから取得される。そのため、名前付きロケールを指定するだけで、同じ値を各国の通貨の書式で出力できる。 + +```cpp example +#include +#include +#include +#include +#include +#include + +// 書式化の処理自体はロケールに依存しない +std::string format_money(const std::locale& loc, long double units) +{ + std::ostringstream oss; + oss.imbue(loc); + oss.setf(std::ios_base::showbase); + + const auto& facet = std::use_facet>(oss.getloc()); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', units); + + return oss.str(); +} + +int main() +{ + for (const char* name : {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + // 同じ値を、ロケールごとの通貨の書式で出力する + std::string s = format_money(std::locale{name}, 105623.0L); + std::cout << name << " : " << s << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* std::money_put[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.setf[link /reference/ios/ios_base/setf.md] +* std::ios_base::showbase[link /reference/ios/ios_base/type-fmtflags.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力例 +``` +en_US.UTF-8 : $1,056.23 +ja_JP.UTF-8 : ¥105,623 +de_DE.UTF-8 : 1.056,23 € +``` + +- 米ドルとユーロは補助単位を持つため小数点以下2桁で表示され、日本円は[`frac_digits()`](/reference/locale/moneypunct/frac_digits.md)が`0`であるため`105623`がそのまま円単位の金額として表示される +- ドイツのロケールでは桁区切りと小数点が米国と逆であり、通貨記号は値の後ろに置かれる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_get`](money_get.md) +- [`moneypunct`](moneypunct.md) +- [`money_base`](money_base.md) +- [`locale`](locale.md) diff --git a/reference/locale/money_put/do_put.md b/reference/locale/money_put/do_put.md new file mode 100644 index 0000000000..e27ee73d90 --- /dev/null +++ b/reference/locale/money_put/do_put.md @@ -0,0 +1,74 @@ +# do_put +* locale[meta header] +* std[meta namespace] +* money_put[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type + do_put(iter_type s, + bool intl, + ios_base& str, + char_type fill, + long double units) const; // (1) C++98 + + virtual iter_type + do_put(iter_type s, + bool intl, + ios_base& str, + char_type fill, + const string_type& digits) const; // (2) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] + +## 概要 +金額を書式化して出力する。[`put()`](put.md)から呼び出される、実際の書式化を行う仮想関数である。 + +- (1) : 整数値として与えられた金額を出力する +- (2) : 数字の列として与えられた金額を出力する + + +## 効果 +`s`へ文字を書き込む。書式は`str.`[`getloc()`](/reference/ios/ios_base/getloc.md)から取得した[`moneypunct`](/reference/locale/moneypunct.md)``ファセット`mp`、文字の対応付けは同様に取得した[`ctype`](/reference/locale/ctype.md)``ファセット`ct`、および`str.`[`flags()`](/reference/ios/ios_base/flags.md)によって決まる。 + +(1)の実引数`units`は、文字バッファ`buf1`、`buf2`に対して以下を行ったかのように、文字の列へ変換される。 + +```cpp +ct.widen(buf1, buf1 + sprintf(buf1, "%.0Lf", units), buf2) +``` +* ct.widen[link /reference/locale/ctype/widen.md] + +`digits`もしくは`buf2`の最初の文字が`ct.`[`widen`](/reference/locale/ctype/widen.md)`('-')`と等しい場合、書式化に使用されるパターンは[`mp.neg_format()`](/reference/locale/moneypunct/neg_format.md)の結果である。そうでない場合は[`mp.pos_format()`](/reference/locale/moneypunct/pos_format.md)の結果である。 + +数字文字は、`digits`もしくは`buf2`に現れる順(省略可能な先頭のマイナス符号の後)に、書式が指定する桁区切りと小数点を交えて書き込まれる。 + +(2)の`digits`では、省略可能な先頭のマイナス符号と、それに続く数字文字(`ct`による分類に従う)のみが使用される。それ以降の文字(非数字文字の後に現れる数字を含む)は無視される。 + +最後に`str.`[`width`](/reference/ios/ios_base/width.md)`(0)`を呼び出す。 + + +## 戻り値 +生成した最後の文字の直後を指すイテレータ。 + + +## 備考 +通貨記号は、`(str.flags() & `[`std::ios_base::showbase`](/reference/ios/ios_base/type-fmtflags.md)`)`が非`0`である場合にのみ生成される。 + +指定された書式に対して生成された文字数が、関数開始時の`str.`[`width()`](/reference/ios/ios_base/width.md)より少ない場合、指定された幅になるまで必要な数の`fill`が挿入される。`af = (str.flags() & `[`std::ios_base::adjustfield`](/reference/ios/ios_base/type-fmtflags.md)`)`として、 + +- `af == `[`std::ios_base::internal`](/reference/ios/ios_base/type-fmtflags.md)である場合、埋め文字は書式パターン内の`none`もしくは`space`が現れる位置に置かれる +- `af == `[`std::ios_base::left`](/reference/ios/ios_base/type-fmtflags.md)である場合、他の文字の後ろに置かれる +- そうでない場合、他の文字の前に置かれる + +書式パターンとフラグの組み合わせによっては、[`num_get::get`](/reference/locale/num_get/get.md)で解析できない出力が生成されることがある。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_put::put`](put.md) +- [`moneypunct`](/reference/locale/moneypunct.md) +- [`money_base`](/reference/locale/money_base.md) diff --git a/reference/locale/money_put/op_constructor.md b/reference/locale/money_put/op_constructor.md new file mode 100644 index 0000000000..f193204a34 --- /dev/null +++ b/reference/locale/money_put/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* money_put[meta class] +* function[meta id-type] + +```cpp +explicit money_put(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`money_put`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`money_put::put`](put.md) diff --git a/reference/locale/money_put/op_destructor.md b/reference/locale/money_put/op_destructor.md new file mode 100644 index 0000000000..5a127649d3 --- /dev/null +++ b/reference/locale/money_put/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* money_put[meta class] +* function[meta id-type] + +```cpp +protected: + ~money_put(); // (1) C++98 +``` + +## 概要 +`money_put`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`money_put`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_put`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/money_put/put.md b/reference/locale/money_put/put.md new file mode 100644 index 0000000000..e5238a40af --- /dev/null +++ b/reference/locale/money_put/put.md @@ -0,0 +1,286 @@ +# put +* locale[meta header] +* std[meta namespace] +* money_put[meta class] +* function[meta id-type] + +```cpp +iter_type + put(iter_type s, + bool intl, + ios_base& f, + char_type fill, + long double quant) const; // (1) C++98 + +iter_type + put(iter_type s, + bool intl, + ios_base& f, + char_type fill, + const string_type& quant) const; // (2) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] + +## 概要 +金額を書式化して、出力イテレータ`s`へ出力する。 + +- (1) : 整数値として与えられた金額を出力する +- (2) : 数字の列として与えられた金額を出力する + +`intl`が`true`の場合、国際通貨表現([`moneypunct`](/reference/locale/moneypunct.md)``)の書式が使用される。 + + +## 戻り値 +- (1), (2) : [`do_put(s, intl, f, fill, quant)`](do_put.md)の戻り値 + + +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include + +int main() +{ + std::ostringstream oss; + const auto& facet = std::use_facet>(oss.getloc()); + + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + + std::cout << oss.str() << std::endl; +} +``` +* std::money_put[link /reference/locale/money_put.md] +* put[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力例 +``` +105623 +``` + +- `"C"`ロケールでは通貨記号も桁区切りも設定されていないため、数字のみが出力される + +### 通貨記号と桁区切りを指定する +書式は[`std::moneypunct`](/reference/locale/moneypunct.md)ファセットから取得される。`"C"`ロケールでは通貨記号も桁区切りも設定されていないため、これらを持つファセットをロケールへ組み込む。 + +```cpp example +#include +#include +#include +#include +#include + +// 通貨記号と桁区切りを持つmoneypunctファセット +struct my_moneypunct : std::moneypunct { +protected: + char_type do_decimal_point() const override { return '.'; } + char_type do_thousands_sep() const override { return ','; } + std::string do_grouping() const override { return "\3"; } // 3桁ごとに区切る + string_type do_curr_symbol() const override { return "$"; } + string_type do_negative_sign() const override { return "-"; } + int do_frac_digits() const override { return 2; } // 小数点以下2桁 + + pattern do_pos_format() const override { return pattern{{symbol, sign, none, value}}; } + pattern do_neg_format() const override { return pattern{{symbol, sign, none, value}}; } +}; + +int main() +{ + std::ostringstream oss; + oss.imbue(std::locale{std::locale::classic(), new my_moneypunct{}}); + + const auto& facet = std::use_facet>(oss.getloc()); + + // showbaseを設定すると通貨記号が出力される + oss.setf(std::ios_base::showbase); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + oss << '\n'; + + // showbaseを設定しない場合、通貨記号は出力されない + oss.unsetf(std::ios_base::showbase); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + oss << '\n'; + + // 負の値にはdo_neg_format()のパターンが使用される + oss.setf(std::ios_base::showbase); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', -105623.0L); + + std::cout << oss.str() << std::endl; +} +``` +* put[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* do_decimal_point[link /reference/locale/moneypunct/do_decimal_point.md] +* do_thousands_sep[link /reference/locale/moneypunct/do_thousands_sep.md] +* do_grouping[link /reference/locale/moneypunct/do_grouping.md] +* do_curr_symbol[link /reference/locale/moneypunct/do_curr_symbol.md] +* do_negative_sign[link /reference/locale/moneypunct/do_negative_sign.md] +* do_frac_digits[link /reference/locale/moneypunct/do_frac_digits.md] +* do_pos_format[link /reference/locale/moneypunct/do_pos_format.md] +* do_neg_format[link /reference/locale/moneypunct/do_neg_format.md] +* std::money_put[link /reference/locale/money_put.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.setf[link /reference/ios/ios_base/setf.md] +* oss.unsetf[link /reference/ios/ios_base/unsetf.md] +* std::ios_base::showbase[link /reference/ios/ios_base/type-fmtflags.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力 +``` +$1,056.23 +1,056.23 +$-1,056.23 +``` + +- 引数の`105623`は最小単位(この例ではセント)での金額であり、[`do_frac_digits()`](/reference/locale/moneypunct/do_frac_digits.md)が`2`であるため`1,056.23`と表示される + +### 通貨記号を末尾に置く(日本円の例) +通貨記号の位置は[`do_pos_format()`](/reference/locale/moneypunct/do_pos_format.md)・[`do_neg_format()`](/reference/locale/moneypunct/do_neg_format.md)が返すパターンで決まる。`value`より後ろに`symbol`を置くことで、「1,000円」のように値の後ろへ通貨記号を出力できる。 + +```cpp example +#include +#include +#include +#include +#include + +// 日本円のmoneypunctファセット +struct jpy_moneypunct : std::moneypunct { +protected: + char_type do_thousands_sep() const override { return ','; } + std::string do_grouping() const override { return "\3"; } + string_type do_curr_symbol() const override { return "円"; } + string_type do_negative_sign() const override { return "-"; } + int do_frac_digits() const override { return 0; } // 円に補助単位はない + + // 値の後ろに通貨記号を置く + pattern do_pos_format() const override { return pattern{{sign, value, none, symbol}}; } + pattern do_neg_format() const override { return pattern{{sign, value, none, symbol}}; } +}; + +int main() +{ + std::ostringstream oss; + oss.imbue(std::locale{std::locale::classic(), new jpy_moneypunct{}}); + oss.setf(std::ios_base::showbase); + + const auto& facet = std::use_facet>(oss.getloc()); + + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', 105623.0L); + oss << '\n'; + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', -105623.0L); + + std::cout << oss.str() << std::endl; +} +``` +* put[color ff0000] +* std::money_put[link /reference/locale/money_put.md] +* std::moneypunct[link /reference/locale/moneypunct.md] +* do_thousands_sep[link /reference/locale/moneypunct/do_thousands_sep.md] +* do_grouping[link /reference/locale/moneypunct/do_grouping.md] +* do_curr_symbol[link /reference/locale/moneypunct/do_curr_symbol.md] +* do_negative_sign[link /reference/locale/moneypunct/do_negative_sign.md] +* do_frac_digits[link /reference/locale/moneypunct/do_frac_digits.md] +* do_pos_format[link /reference/locale/moneypunct/do_pos_format.md] +* do_neg_format[link /reference/locale/moneypunct/do_neg_format.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.setf[link /reference/ios/ios_base/setf.md] +* std::ios_base::showbase[link /reference/ios/ios_base/type-fmtflags.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力 +``` +105,623円 +-105,623円 +``` + +- [`do_frac_digits()`](/reference/locale/moneypunct/do_frac_digits.md)が`0`であるため、引数の値がそのまま円単位の金額として扱われる + +### ロケールによって通貨を切り替える +金額の書式は、[`put()`](put.md)へ渡すストリームのロケールに設定された[`std::moneypunct`](/reference/locale/moneypunct.md)ファセットから取得される。そのため、名前付きロケールを指定するだけで、同じ値を各国の通貨の書式で出力できる。 + +```cpp example +#include +#include +#include +#include +#include +#include + +// 書式化の処理自体はロケールに依存しない +std::string format_money(const std::locale& loc, long double units) +{ + std::ostringstream oss; + oss.imbue(loc); + oss.setf(std::ios_base::showbase); + + const auto& facet = std::use_facet>(oss.getloc()); + facet.put(std::ostreambuf_iterator{oss}, false, oss, ' ', units); + + return oss.str(); +} + +int main() +{ + for (const char* name : {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + // 同じ値を、ロケールごとの通貨の書式で出力する + std::string s = format_money(std::locale{name}, 105623.0L); + std::cout << name << " : " << s << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* put[color ff0000] +* std::money_put[link /reference/locale/money_put.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.setf[link /reference/ios/ios_base/setf.md] +* std::ios_base::showbase[link /reference/ios/ios_base/type-fmtflags.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +#### 出力例 +``` +en_US.UTF-8 : $1,056.23 +ja_JP.UTF-8 : ¥105,623 +de_DE.UTF-8 : 1.056,23 € +``` + +- 米ドルとユーロは補助単位を持つため小数点以下2桁で表示され、日本円は[`frac_digits()`](/reference/locale/moneypunct/frac_digits.md)が`0`であるため`105623`がそのまま円単位の金額として表示される +- ドイツのロケールでは桁区切りと小数点が米国と逆であり、通貨記号は値の後ろに置かれる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`money_put::do_put`](do_put.md) +- [`money_get`](/reference/locale/money_get.md) +- [`moneypunct`](/reference/locale/moneypunct.md) diff --git a/reference/locale/moneypunct.md b/reference/locale/moneypunct.md index 87c53349fc..67601b47d1 100644 --- a/reference/locale/moneypunct.md +++ b/reference/locale/moneypunct.md @@ -13,58 +13,196 @@ namespace std { * money_base[link /reference/locale/money_base.md] ## 概要 -(ここに、クラスの概要を記載する) +`moneypunct`は、金額の入出力における書式(通貨記号、小数点、桁区切り、符号、出力順序)に関する情報を提供するロケールファセットである。 + +[`money_get`](money_get.md)と[`money_put`](money_put.md)は、このファセットから取得した情報を使って金額の解析・書式化を行う。 + +2つめのテンプレートパラメータ`International`が`true`である特殊化は、国際通貨表現(ISO 4217の3文字コード)の書式を提供する。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |---------------------------------------------------------------------------|-----------------------------------------------------------------------| -| `(constructor)` | コンストラクタ | -| `decimal_point` | 小数点の文字を取得する | -| `thousands_sep` | 桁区切りの文字を取得する | -| `grouping` | 何桁で区切るかの、桁数のシーケンスを取得する | -| `curr_symbol` | 通貨記号を取得する | -| `positive_sign` | 正の金額を表す記号を取得する | -| `negative_sign` | 負の金額を表す記号を取得する | -| `frac_digits` | 金額の小数桁数 | -| `pos_format` | 正の金額を出力するためのフォーマットを取得する | -| `neg_format` | 負の金額を出力するためのフォーマットを取得する | +| [`(constructor)`](moneypunct/op_constructor.md) | コンストラクタ | +| [`decimal_point`](moneypunct/decimal_point.md) | 小数点の文字を取得する | +| [`thousands_sep`](moneypunct/thousands_sep.md) | 桁区切りの文字を取得する | +| [`grouping`](moneypunct/grouping.md) | 何桁で区切るかの、桁数のシーケンスを取得する | +| [`curr_symbol`](moneypunct/curr_symbol.md) | 通貨記号を取得する | +| [`positive_sign`](moneypunct/positive_sign.md) | 正の金額を表す記号を取得する | +| [`negative_sign`](moneypunct/negative_sign.md) | 負の金額を表す記号を取得する | +| [`frac_digits`](moneypunct/frac_digits.md) | 金額の小数桁数 | +| [`pos_format`](moneypunct/pos_format.md) | 正の金額を出力するためのフォーマットを取得する | +| [`neg_format`](moneypunct/neg_format.md) | 負の金額を出力するためのフォーマットを取得する | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | -| `static const bool intl = International;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | +| `static const bool intl = International;` | テンプレートパラメータ`International`の値 | ### protectedメンバ関数 | 名前 | 説明 | |-------------------------------|-----------------------------------------------------------------------| -| `(destructor)` | デストラクタ | -| `do_decimal_point` | 小数点の文字を取得する | -| `do_thousands_sep` | 桁区切りの文字を取得する | -| `do_grouping` | 何桁で区切るかの、桁数のシーケンスを取得する | -| `do_curr_symbol` | 通貨記号を取得する | -| `do_positive_sign` | 正の金額を表す記号を取得する | -| `do_negative_sign` | 負の金額を表す記号を取得する | -| `do_frac_digits` | 金額の小数桁数 | -| `do_pos_format` | 正の金額を出力するためのフォーマットを取得する | -| `do_neg_format` | 負の金額を出力するためのフォーマットを取得する | - -### メンバ型 +| [`(destructor)`](moneypunct/op_destructor.md) | デストラクタ | +| [`do_decimal_point`](moneypunct/do_decimal_point.md) | 小数点の文字を取得する (virtual) | +| [`do_thousands_sep`](moneypunct/do_thousands_sep.md) | 桁区切りの文字を取得する (virtual) | +| [`do_grouping`](moneypunct/do_grouping.md) | 何桁で区切るかの、桁数のシーケンスを取得する (virtual) | +| [`do_curr_symbol`](moneypunct/do_curr_symbol.md) | 通貨記号を取得する (virtual) | +| [`do_positive_sign`](moneypunct/do_positive_sign.md) | 正の金額を表す記号を取得する (virtual) | +| [`do_negative_sign`](moneypunct/do_negative_sign.md) | 負の金額を表す記号を取得する (virtual) | +| [`do_frac_digits`](moneypunct/do_frac_digits.md) | 金額の小数桁数 (virtual) | +| [`do_pos_format`](moneypunct/do_pos_format.md) | 正の金額を出力するためのフォーマットを取得する (virtual) | +| [`do_neg_format`](moneypunct/do_neg_format.md) | 負の金額を出力するためのフォーマットを取得する (virtual) | + +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +### 基本的な使い方 +```cpp example +#include +#include + +int main() +{ + const auto& mp = std::use_facet>(std::locale::classic()); + + std::cout << "decimal_point : [" << mp.decimal_point() << "]" << std::endl; + std::cout << "thousands_sep : [" << mp.thousands_sep() << "]" << std::endl; + std::cout << "curr_symbol : [" << mp.curr_symbol() << "]" << std::endl; + std::cout << "frac_digits : " << mp.frac_digits() << std::endl; +} ``` +* std::moneypunct[color ff0000] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] +* mp.decimal_point()[link moneypunct/decimal_point.md] +* mp.thousands_sep()[link moneypunct/thousands_sep.md] +* mp.curr_symbol()[link moneypunct/curr_symbol.md] +* mp.frac_digits()[link moneypunct/frac_digits.md] -### 出力 +#### 出力例 ``` +decimal_point : [] +thousands_sep : [] +curr_symbol : [] +frac_digits : 0 ``` -### 参照 +- `"C"`ロケールにおける`moneypunct`の各値は規格に規定がないため、出力は処理系によって異なる + +### ロケールによる違い +```cpp example +#include +#include +#include +#include + +std::string to_string(std::money_base::pattern p) +{ + std::string result; + for (int i = 0; i < 4; ++i) { + if (i != 0) { + result += ' '; + } + switch (p.field[i]) { + case std::money_base::none: result += "none"; break; + case std::money_base::space: result += "space"; break; + case std::money_base::symbol: result += "symbol"; break; + case std::money_base::sign: result += "sign"; break; + case std::money_base::value: result += "value"; break; + } + } + return result; +} + +void print_moneypunct(const char* name) +{ + std::cout << name << std::endl; + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << " curr_symbol : [" << mp.curr_symbol() << "]" << std::endl; + std::cout << " decimal_point : [" << mp.decimal_point() << "]" << std::endl; + std::cout << " thousands_sep : [" << mp.thousands_sep() << "]" << std::endl; + std::cout << " frac_digits : " << mp.frac_digits() << std::endl; + std::cout << " pos_format : " << to_string(mp.pos_format()) << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << " not available" << std::endl; + } +} + +int main() +{ + print_moneypunct("en_US.UTF-8"); + print_moneypunct("ja_JP.UTF-8"); + print_moneypunct("de_DE.UTF-8"); +} +``` +* std::moneypunct[color ff0000] +* std::money_base::pattern[link money_base.md] +* std::money_base::none[link money_base.md] +* std::money_base::space[link money_base.md] +* std::money_base::symbol[link money_base.md] +* std::money_base::sign[link money_base.md] +* std::money_base::value[link money_base.md] +* std::use_facet[link use_facet.md] +* std::locale[link locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.decimal_point()[link moneypunct/decimal_point.md] +* mp.thousands_sep()[link moneypunct/thousands_sep.md] +* mp.curr_symbol()[link moneypunct/curr_symbol.md] +* mp.frac_digits()[link moneypunct/frac_digits.md] +* mp.pos_format()[link moneypunct/pos_format.md] + +#### 出力例 +``` +en_US.UTF-8 + curr_symbol : [$] + decimal_point : [.] + thousands_sep : [,] + frac_digits : 2 + pos_format : sign symbol none value +ja_JP.UTF-8 + curr_symbol : [¥] + decimal_point : [.] + thousands_sep : [,] + frac_digits : 0 + pos_format : sign symbol none value +de_DE.UTF-8 + curr_symbol : [ €] + decimal_point : [,] + thousands_sep : [.] + frac_digits : 2 + pos_format : sign value none symbol +``` + +- 日本円は補助単位を持たないため[`frac_digits()`](moneypunct/frac_digits.md)が`0`であり、米ドルとユーロは`2`となる +- ドイツのロケールでは小数点と桁区切りの文字が米国と逆になっている +- [`pos_format()`](moneypunct/pos_format.md)のパターンでは、米国と日本は`value`より前に`symbol`があるため通貨記号が値の前に置かれ、ドイツは`value`より後ろにあるため値の後ろに置かれる +- ドイツの通貨記号`" €"`のように、記号自体が空白を含むことがある +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct_byname`](moneypunct_byname.md) +- [`money_base`](money_base.md) +- [`money_get`](money_get.md) +- [`money_put`](money_put.md) +- [`locale`](locale.md) diff --git a/reference/locale/moneypunct/curr_symbol.md b/reference/locale/moneypunct/curr_symbol.md new file mode 100644 index 0000000000..def35cf980 --- /dev/null +++ b/reference/locale/moneypunct/curr_symbol.md @@ -0,0 +1,66 @@ +# curr_symbol +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +string_type curr_symbol() const; // (1) C++98 +``` + +## 概要 +通貨記号を取得する。 + + +## 戻り値 +[`do_curr_symbol()`](do_curr_symbol.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << name << " : [" << mp.curr_symbol() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* curr_symbol[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.curr_symbol()[link /reference/locale/moneypunct/curr_symbol.md] + +### 出力例 +``` +C : [] +en_US.UTF-8 : [$] +ja_JP.UTF-8 : [¥] +de_DE.UTF-8 : [ €] +``` + +- ドイツのロケールの`" €"`のように、通貨記号自体が空白を含むことがある +- 記号を値の前後どちらに置くかは[`pos_format()`](pos_format.md)・[`neg_format()`](neg_format.md)のパターンで決まる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_curr_symbol`](do_curr_symbol.md) diff --git a/reference/locale/moneypunct/decimal_point.md b/reference/locale/moneypunct/decimal_point.md new file mode 100644 index 0000000000..8aae18cfa6 --- /dev/null +++ b/reference/locale/moneypunct/decimal_point.md @@ -0,0 +1,65 @@ +# decimal_point +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +charT decimal_point() const; // (1) C++98 +``` + +## 概要 +小数点の文字を取得する。 + + +## 戻り値 +[`do_decimal_point()`](do_decimal_point.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << name << " : [" << mp.decimal_point() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* decimal_point[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.decimal_point()[link /reference/locale/moneypunct/decimal_point.md] + +### 出力例 +``` +en_US.UTF-8 : [.] +ja_JP.UTF-8 : [.] +de_DE.UTF-8 : [,] +``` + +- ドイツのロケールでは小数点にカンマが使われる +- `"C"`ロケールにおける`moneypunct`の小数点の値は規格に規定がなく、印字できない文字が返る処理系もあるため、上記の例では扱っていない +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_decimal_point`](do_decimal_point.md) diff --git a/reference/locale/moneypunct/do_curr_symbol.md b/reference/locale/moneypunct/do_curr_symbol.md new file mode 100644 index 0000000000..b1f6490464 --- /dev/null +++ b/reference/locale/moneypunct/do_curr_symbol.md @@ -0,0 +1,27 @@ +# do_curr_symbol +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type do_curr_symbol() const; // (1) C++98 +``` + +## 概要 +通貨記号を取得する。[`curr_symbol()`](curr_symbol.md)から呼び出される仮想関数である。 + + +## 戻り値 +通貨を識別する記号として使用する文字列を返す。 + +2つめのテンプレートパラメータが`true`である特殊化では、通常これは4文字である(ISO 4217で規定される3文字のコードと、それに続く空白)。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::curr_symbol`](curr_symbol.md) diff --git a/reference/locale/moneypunct/do_decimal_point.md b/reference/locale/moneypunct/do_decimal_point.md new file mode 100644 index 0000000000..9d2307599f --- /dev/null +++ b/reference/locale/moneypunct/do_decimal_point.md @@ -0,0 +1,27 @@ +# do_decimal_point +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual charT do_decimal_point() const; // (1) C++98 +``` + +## 概要 +小数点の文字を取得する。[`decimal_point()`](decimal_point.md)から呼び出される仮想関数である。 + + +## 戻り値 +[`do_frac_digits()`](do_frac_digits.md)が`0`より大きい場合に使用する基数区切り文字を返す。 + +米国の一般的なロケールでは`'.'`である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::decimal_point`](decimal_point.md) diff --git a/reference/locale/moneypunct/do_frac_digits.md b/reference/locale/moneypunct/do_frac_digits.md new file mode 100644 index 0000000000..74f3de0f04 --- /dev/null +++ b/reference/locale/moneypunct/do_frac_digits.md @@ -0,0 +1,27 @@ +# do_frac_digits +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual int do_frac_digits() const; // (1) C++98 +``` + +## 概要 +金額の小数桁数を取得する。[`frac_digits()`](frac_digits.md)から呼び出される仮想関数である。 + + +## 戻り値 +小数の基数区切りより後ろの桁数を返す。 + +米国の一般的なロケールでは`2`である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::frac_digits`](frac_digits.md) diff --git a/reference/locale/moneypunct/do_grouping.md b/reference/locale/moneypunct/do_grouping.md new file mode 100644 index 0000000000..ee2037df41 --- /dev/null +++ b/reference/locale/moneypunct/do_grouping.md @@ -0,0 +1,28 @@ +# do_grouping +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string do_grouping() const; // (1) C++98 +``` +* string[link /reference/string/basic_string.md] + +## 概要 +何桁で区切るかの、桁数のシーケンスを取得する。[`grouping()`](grouping.md)から呼び出される仮想関数である。 + + +## 戻り値 +[`numpunct::do_grouping()`](/reference/locale/numpunct/do_grouping.md)と同一に定義されるパターンを返す(値が等しいとは限らない)。 + +3桁ごとの区切りを指定する場合、値は`"3"`ではなく`"\003"`である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::grouping`](grouping.md) diff --git a/reference/locale/moneypunct/do_neg_format.md b/reference/locale/moneypunct/do_neg_format.md new file mode 100644 index 0000000000..154a6cc28d --- /dev/null +++ b/reference/locale/moneypunct/do_neg_format.md @@ -0,0 +1,33 @@ +# do_neg_format +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual pattern do_neg_format() const; // (1) C++98 +``` +* pattern[link /reference/locale/money_base.md] + +## 概要 +負の金額を出力するためのフォーマットを取得する。[`neg_format()`](neg_format.md)から呼び出される仮想関数である。 + + +## 戻り値 +[`money_base::pattern`](/reference/locale/money_base.md)型のオブジェクト。 + +規格が要求する特殊化(`moneypunct`、`moneypunct`、`moneypunct`、`moneypunct`)は、`{ symbol, sign, none, value }`で初期化されたオブジェクトを返す。 + + +## 備考 +[`do_curr_symbol()`](do_curr_symbol.md)が返す国際通貨記号は、通常それ自体に空白を含む(たとえば`"USD "`)。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::neg_format`](neg_format.md) +- [`money_base`](/reference/locale/money_base.md) diff --git a/reference/locale/moneypunct/do_negative_sign.md b/reference/locale/moneypunct/do_negative_sign.md new file mode 100644 index 0000000000..38fbe7527d --- /dev/null +++ b/reference/locale/moneypunct/do_negative_sign.md @@ -0,0 +1,25 @@ +# do_negative_sign +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type do_negative_sign() const; // (1) C++98 +``` + +## 概要 +負の金額を表す記号を取得する。[`negative_sign()`](negative_sign.md)から呼び出される仮想関数である。 + + +## 戻り値 +負の金額を示すために使用する文字列を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::negative_sign`](negative_sign.md) diff --git a/reference/locale/moneypunct/do_pos_format.md b/reference/locale/moneypunct/do_pos_format.md new file mode 100644 index 0000000000..3545343b60 --- /dev/null +++ b/reference/locale/moneypunct/do_pos_format.md @@ -0,0 +1,33 @@ +# do_pos_format +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual pattern do_pos_format() const; // (1) C++98 +``` +* pattern[link /reference/locale/money_base.md] + +## 概要 +正の金額を出力するためのフォーマットを取得する。[`pos_format()`](pos_format.md)から呼び出される仮想関数である。 + + +## 戻り値 +[`money_base::pattern`](/reference/locale/money_base.md)型のオブジェクト。 + +規格が要求する特殊化(`moneypunct`、`moneypunct`、`moneypunct`、`moneypunct`)は、`{ symbol, sign, none, value }`で初期化されたオブジェクトを返す。 + + +## 備考 +[`do_curr_symbol()`](do_curr_symbol.md)が返す国際通貨記号は、通常それ自体に空白を含む(たとえば`"USD "`)。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::pos_format`](pos_format.md) +- [`money_base`](/reference/locale/money_base.md) diff --git a/reference/locale/moneypunct/do_positive_sign.md b/reference/locale/moneypunct/do_positive_sign.md new file mode 100644 index 0000000000..a44258c306 --- /dev/null +++ b/reference/locale/moneypunct/do_positive_sign.md @@ -0,0 +1,25 @@ +# do_positive_sign +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type do_positive_sign() const; // (1) C++98 +``` + +## 概要 +正の金額を表す記号を取得する。[`positive_sign()`](positive_sign.md)から呼び出される仮想関数である。 + + +## 戻り値 +正の金額を示すために使用する文字列を返す。通常これは空文字列である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::positive_sign`](positive_sign.md) diff --git a/reference/locale/moneypunct/do_thousands_sep.md b/reference/locale/moneypunct/do_thousands_sep.md new file mode 100644 index 0000000000..1f82ad59f9 --- /dev/null +++ b/reference/locale/moneypunct/do_thousands_sep.md @@ -0,0 +1,27 @@ +# do_thousands_sep +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual charT do_thousands_sep() const; // (1) C++98 +``` + +## 概要 +桁区切りの文字を取得する。[`thousands_sep()`](thousands_sep.md)から呼び出される仮想関数である。 + + +## 戻り値 +[`do_grouping()`](do_grouping.md)が桁区切りのパターンを指定する場合に使用する、桁グループの区切り文字を返す。 + +米国の一般的なロケールでは`','`である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::thousands_sep`](thousands_sep.md) diff --git a/reference/locale/moneypunct/frac_digits.md b/reference/locale/moneypunct/frac_digits.md new file mode 100644 index 0000000000..601553f34f --- /dev/null +++ b/reference/locale/moneypunct/frac_digits.md @@ -0,0 +1,68 @@ +# frac_digits +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +int frac_digits() const; // (1) C++98 +``` + +## 概要 +金額の小数桁数を取得する。 + + +## 戻り値 +[`do_frac_digits()`](do_frac_digits.md)の呼び出し結果を返す。 + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << name << " : " << mp.frac_digits() << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* frac_digits[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.frac_digits()[link /reference/locale/moneypunct/frac_digits.md] + +### 出力例 +``` +C : 0 +en_US.UTF-8 : 2 +ja_JP.UTF-8 : 0 +de_DE.UTF-8 : 2 +``` + +- 日本円は補助単位を持たないため`0`であり、米ドルとユーロはセントを持つため`2`となる +- この値は、金額の入出力で扱う整数値が最小単位のいくつ分にあたるかを決める。`2`の場合、`105623`は`1056.23`として表示される +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_frac_digits`](do_frac_digits.md) +- [`moneypunct::decimal_point`](decimal_point.md) diff --git a/reference/locale/moneypunct/grouping.md b/reference/locale/moneypunct/grouping.md new file mode 100644 index 0000000000..cdfad262d5 --- /dev/null +++ b/reference/locale/moneypunct/grouping.md @@ -0,0 +1,75 @@ +# grouping +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +string grouping() const; // (1) C++98 +``` +* string[link /reference/string/basic_string.md] + +## 概要 +何桁で区切るかの、桁数のシーケンスを取得する。 + + +## 戻り値 +[`do_grouping()`](do_grouping.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::string g = mp.grouping(); + + if (g.empty()) { + std::cout << name << " : (no grouping)" << std::endl; + } + else { + // 各要素は文字ではなく桁数を表す数値である + std::cout << name << " : " << static_cast(g[0]) << std::endl; + } + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* grouping[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.grouping()[link /reference/locale/moneypunct/grouping.md] + +### 出力例 +``` +C : (no grouping) +en_US.UTF-8 : 3 +ja_JP.UTF-8 : 3 +de_DE.UTF-8 : 3 +``` + +- 戻り値の各要素は文字ではなく数値として解釈される。3桁ごとの区切りは`'3'`(文字)ではなく`3`(数値)である +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_grouping`](do_grouping.md) diff --git a/reference/locale/moneypunct/neg_format.md b/reference/locale/moneypunct/neg_format.md new file mode 100644 index 0000000000..0816693624 --- /dev/null +++ b/reference/locale/moneypunct/neg_format.md @@ -0,0 +1,87 @@ +# neg_format +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +pattern neg_format() const; // (1) C++98 +``` +* pattern[link /reference/locale/money_base.md] + +## 概要 +負の金額を出力するためのフォーマットを取得する。 + + +## 戻り値 +[`do_neg_format()`](do_neg_format.md)の呼び出し結果を返す。 + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::money_base::pattern p = mp.neg_format(); + + std::cout << name << " : "; + for (int i = 0; i < 4; ++i) { + switch (p.field[i]) { + case std::money_base::none: std::cout << "none "; break; + case std::money_base::space: std::cout << "space "; break; + case std::money_base::symbol: std::cout << "symbol "; break; + case std::money_base::sign: std::cout << "sign "; break; + case std::money_base::value: std::cout << "value "; break; + } + } + std::cout << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* neg_format[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.neg_format()[link /reference/locale/moneypunct/neg_format.md] +* std::money_base::pattern[link /reference/locale/money_base.md] +* std::money_base::none[link /reference/locale/money_base.md] +* std::money_base::space[link /reference/locale/money_base.md] +* std::money_base::symbol[link /reference/locale/money_base.md] +* std::money_base::sign[link /reference/locale/money_base.md] +* std::money_base::value[link /reference/locale/money_base.md] + +### 出力例 +``` +C : symbol sign none value +en_US.UTF-8 : sign symbol none value +ja_JP.UTF-8 : sign symbol none value +de_DE.UTF-8 : sign value none symbol +``` + +- 米国と日本のロケールでは`symbol`が`value`より前にあるため、通貨記号は値の前に置かれる。ドイツのロケールでは`value`より後ろにあるため、値の後ろに置かれる +- 規格が要求する特殊化は`{symbol, sign, none, value}`を返す +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_neg_format`](do_neg_format.md) +- [`money_base`](/reference/locale/money_base.md) diff --git a/reference/locale/moneypunct/negative_sign.md b/reference/locale/moneypunct/negative_sign.md new file mode 100644 index 0000000000..b2371e0260 --- /dev/null +++ b/reference/locale/moneypunct/negative_sign.md @@ -0,0 +1,66 @@ +# negative_sign +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +string_type negative_sign() const; // (1) C++98 +``` + +## 概要 +負の金額を表す記号を取得する。 + + +## 戻り値 +[`do_negative_sign()`](do_negative_sign.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << name << " : [" << mp.negative_sign() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* negative_sign[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.negative_sign()[link /reference/locale/moneypunct/negative_sign.md] + +### 出力例 +``` +C : [] +en_US.UTF-8 : [-] +ja_JP.UTF-8 : [-] +de_DE.UTF-8 : [-] +``` + +- `"()"`のように2文字以上の文字列を返すロケールもある。その場合、1文字目が符号の位置に置かれ、残りの文字は他のすべての書式要素の後ろに置かれる +- `"C"`ロケールにおける値は規格に規定がないため、処理系によって異なる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_negative_sign`](do_negative_sign.md) diff --git a/reference/locale/moneypunct/op_constructor.md b/reference/locale/moneypunct/op_constructor.md new file mode 100644 index 0000000000..3aa74a3fda --- /dev/null +++ b/reference/locale/moneypunct/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +explicit moneypunct(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`moneypunct`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`moneypunct_byname`](/reference/locale/moneypunct_byname.md) diff --git a/reference/locale/moneypunct/op_destructor.md b/reference/locale/moneypunct/op_destructor.md new file mode 100644 index 0000000000..4fb174a37d --- /dev/null +++ b/reference/locale/moneypunct/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +protected: + ~moneypunct(); // (1) C++98 +``` + +## 概要 +`moneypunct`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`moneypunct`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/moneypunct/pos_format.md b/reference/locale/moneypunct/pos_format.md new file mode 100644 index 0000000000..ad301a0c56 --- /dev/null +++ b/reference/locale/moneypunct/pos_format.md @@ -0,0 +1,87 @@ +# pos_format +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +pattern pos_format() const; // (1) C++98 +``` +* pattern[link /reference/locale/money_base.md] + +## 概要 +正の金額を出力するためのフォーマットを取得する。 + + +## 戻り値 +[`do_pos_format()`](do_pos_format.md)の呼び出し結果を返す。 + + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::money_base::pattern p = mp.pos_format(); + + std::cout << name << " : "; + for (int i = 0; i < 4; ++i) { + switch (p.field[i]) { + case std::money_base::none: std::cout << "none "; break; + case std::money_base::space: std::cout << "space "; break; + case std::money_base::symbol: std::cout << "symbol "; break; + case std::money_base::sign: std::cout << "sign "; break; + case std::money_base::value: std::cout << "value "; break; + } + } + std::cout << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* pos_format[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.pos_format()[link /reference/locale/moneypunct/pos_format.md] +* std::money_base::pattern[link /reference/locale/money_base.md] +* std::money_base::none[link /reference/locale/money_base.md] +* std::money_base::space[link /reference/locale/money_base.md] +* std::money_base::symbol[link /reference/locale/money_base.md] +* std::money_base::sign[link /reference/locale/money_base.md] +* std::money_base::value[link /reference/locale/money_base.md] + +### 出力例 +``` +C : symbol sign none value +en_US.UTF-8 : sign symbol none value +ja_JP.UTF-8 : sign symbol none value +de_DE.UTF-8 : sign value none symbol +``` + +- 米国と日本のロケールでは`symbol`が`value`より前にあるため、通貨記号は値の前に置かれる。ドイツのロケールでは`value`より後ろにあるため、値の後ろに置かれる +- 規格が要求する特殊化は`{symbol, sign, none, value}`を返す +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_pos_format`](do_pos_format.md) +- [`money_base`](/reference/locale/money_base.md) diff --git a/reference/locale/moneypunct/positive_sign.md b/reference/locale/moneypunct/positive_sign.md new file mode 100644 index 0000000000..1df48647ed --- /dev/null +++ b/reference/locale/moneypunct/positive_sign.md @@ -0,0 +1,66 @@ +# positive_sign +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +string_type positive_sign() const; // (1) C++98 +``` + +## 概要 +正の金額を表す記号を取得する。 + + +## 戻り値 +[`do_positive_sign()`](do_positive_sign.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << name << " : [" << mp.positive_sign() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* positive_sign[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.positive_sign()[link /reference/locale/moneypunct/positive_sign.md] + +### 出力例 +``` +C : [] +en_US.UTF-8 : [] +ja_JP.UTF-8 : [] +de_DE.UTF-8 : [] +``` + +- 正の符号は通常空文字列である +- 空文字列である場合、解析時に符号要素は省略可能となる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_positive_sign`](do_positive_sign.md) diff --git a/reference/locale/moneypunct/thousands_sep.md b/reference/locale/moneypunct/thousands_sep.md new file mode 100644 index 0000000000..cbe752aeb5 --- /dev/null +++ b/reference/locale/moneypunct/thousands_sep.md @@ -0,0 +1,65 @@ +# thousands_sep +* locale[meta header] +* std[meta namespace] +* moneypunct[meta class] +* function[meta id-type] + +```cpp +charT thousands_sep() const; // (1) C++98 +``` + +## 概要 +桁区切りの文字を取得する。 + + +## 戻り値 +[`do_thousands_sep()`](do_thousands_sep.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& mp = std::use_facet>(loc); + + std::cout << name << " : [" << mp.thousands_sep() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* thousands_sep[color ff0000] +* std::moneypunct[link /reference/locale/moneypunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* mp.thousands_sep()[link /reference/locale/moneypunct/thousands_sep.md] + +### 出力例 +``` +en_US.UTF-8 : [,] +ja_JP.UTF-8 : [,] +de_DE.UTF-8 : [.] +``` + +- ドイツのロケールでは桁区切りにピリオドが使われる +- `"C"`ロケールにおける`moneypunct`の桁区切りの値は規格に規定がなく、印字できない文字が返る処理系もあるため、上記の例では扱っていない +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct::do_thousands_sep`](do_thousands_sep.md) diff --git a/reference/locale/moneypunct_byname.md b/reference/locale/moneypunct_byname.md index 74ebb768c6..07ce1c8ce9 100644 --- a/reference/locale/moneypunct_byname.md +++ b/reference/locale/moneypunct_byname.md @@ -12,33 +12,65 @@ namespace std { * moneypunct[link /reference/locale/moneypunct.md] ## 概要 -(ここに、クラスの概要を記載する) +`moneypunct_byname`は、名前で指定したロケールの金額のフォーマットを提供する、[`moneypunct`](/reference/locale/moneypunct.md)の派生クラスである。 -### メンバ関数 +[`moneypunct`](/reference/locale/moneypunct.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`moneypunct`](/reference/locale/moneypunct.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 + +### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](moneypunct_byname/op_constructor.md) | コンストラクタ | -### 静的メンバ関数 +### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](moneypunct_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------| | `pattern` | 金額のフォーマット型 [`money_base`](/reference/locale/money_base.md)`::pattern` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), new std::moneypunct_byname{"C"}}; + + std::cout << std::boolalpha + << std::has_facet>(loc) << std::endl; +} ``` +* std::moneypunct_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::moneypunct[link moneypunct.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct`](/reference/locale/moneypunct.md) +- [`locale`](locale.md) diff --git a/reference/locale/moneypunct_byname/op_constructor.md b/reference/locale/moneypunct_byname/op_constructor.md new file mode 100644 index 0000000000..a23a13db46 --- /dev/null +++ b/reference/locale/moneypunct_byname/op_constructor.md @@ -0,0 +1,81 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* moneypunct_byname[meta class] +* function[meta id-type] + +```cpp +explicit moneypunct_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit moneypunct_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、金額のフォーマットファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`moneypunct`](/reference/locale/moneypunct.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `moneypunct_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), new std::moneypunct_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + const auto& fa = std::use_facet>(a); + const auto& fb = std::use_facet>(b); + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha + << (fa.frac_digits() == fb.frac_digits()) << std::endl; +} +``` +* std::moneypunct_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::moneypunct[link /reference/locale/moneypunct.md] +* fa.frac_digits()[link /reference/locale/moneypunct/frac_digits.md] + +### 出力 +``` +true +``` + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct`](/reference/locale/moneypunct.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/moneypunct_byname/op_destructor.md b/reference/locale/moneypunct_byname/op_destructor.md new file mode 100644 index 0000000000..80e98ed087 --- /dev/null +++ b/reference/locale/moneypunct_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* moneypunct_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~moneypunct_byname(); // (1) C++98 +``` + +## 概要 +`moneypunct_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`moneypunct_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`moneypunct_byname`のコンストラクタ](op_constructor.md) +- [`moneypunct`](/reference/locale/moneypunct.md) diff --git a/reference/locale/num_get/do_get.md b/reference/locale/num_get/do_get.md index 04c4bcdaf7..9332eebfca 100644 --- a/reference/locale/num_get/do_get.md +++ b/reference/locale/num_get/do_get.md @@ -52,8 +52,8 @@ protected: | 状態 | `stdio`の変換指定に相当 | |------|-------------------------| - | `basefield == `[`ios_base::oct`](/reference/ios/ios_base/type-fmtflags.md) | `%o` | - | `basefield == `[`ios_base::hex`](/reference/ios/ios_base/type-fmtflags.md) | `%X` | + | `basefield == `[`std::ios_base::oct`](/reference/ios/ios_base/type-fmtflags.md) | `%o` | + | `basefield == `[`std::ios_base::hex`](/reference/ios/ios_base/type-fmtflags.md) | `%X` | | `basefield == 0` | `%i` | | 符号付き整数型 | `%d` | | 符号なし整数型 | `%u` | @@ -62,7 +62,7 @@ protected: - (11) : `%p` ### Stage 2 : 文字の抽出 -`[in, end)`から、変換指定に合致する文字を順次抽出する。`str.`[`getloc()`](/reference/ios/ios_base/getloc.md)から取得した[`numpunct`](/reference/locale/numpunct.md)ファセットにより、[`numpunct::grouping()`](/reference/locale/numpunct/grouping.md.nolink)が空でない場合は桁区切り文字([`numpunct::thousands_sep()`](/reference/locale/numpunct/thousands_sep.md.nolink))を取り除き、小数点文字([`numpunct::decimal_point()`](/reference/locale/numpunct/decimal_point.md.nolink))は`'.'`に置き換える。 +`[in, end)`から、変換指定に合致する文字を順次抽出する。`str.`[`getloc()`](/reference/ios/ios_base/getloc.md)から取得した[`numpunct`](/reference/locale/numpunct.md)ファセットにより、[`numpunct::grouping()`](/reference/locale/numpunct/grouping.md)が空でない場合は桁区切り文字([`numpunct::thousands_sep()`](/reference/locale/numpunct/thousands_sep.md))を取り除き、小数点文字([`numpunct::decimal_point()`](/reference/locale/numpunct/decimal_point.md))は`'.'`に置き換える。 ### Stage 3 : 数値への変換と格納 Stage 2で蓄積した文字列(フィールド)を、[``](/reference/cstdlib.md)で宣言される以下の関数の規則に従って数値へ変換する。 @@ -86,14 +86,14 @@ Stage 2で蓄積した文字列(フィールド)を、[``](/referen 変換関数がフィールド全体を変換しなかった場合、または表現可能な範囲外の値を表す場合、`err`に[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)が設定される。 ### 桁区切りの検査 -(2)〜(10)では、取り除いた桁区切り文字の位置が[`numpunct::grouping()`](/reference/locale/numpunct/grouping.md.nolink)と整合しているかが検査される。整合していない場合、`err`に[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)が設定される。 +(2)〜(10)では、取り除いた桁区切り文字の位置が[`numpunct::grouping()`](/reference/locale/numpunct/grouping.md)と整合しているかが検査される。整合していない場合、`err`に[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)が設定される。 ### 入力終端の扱い いずれの場合も、Stage 2の処理が`in == end`の判定によって終了した場合は、`err |= `[`std::ios_base::eofbit`](/reference/ios/ios_base/type-iostate.md)が行われる。 ### (1) `bool`版の処理 - `(str.`[`flags()`](/reference/ios/ios_base/flags.md)` & `[`std::ios_base::boolalpha`](/reference/ios/ios_base/type-fmtflags.md)`) == 0`の場合 : `long`と同様に入力を読み取り、格納しようとする値が`0`なら`false`、`1`なら`true`を格納する。それ以外の場合は`true`を格納し、`err`に[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を設定する -- そうでない場合 : [`numpunct::truename()`](/reference/locale/numpunct/truename.md.nolink)と[`numpunct::falsename()`](/reference/locale/numpunct/falsename.md.nolink)を対象列として、一意に定まるまで文字を照合する。一意にマッチした場合は対応する値を`val`へ格納する。そうでない場合は`false`を格納し、`err`に[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を設定する +- そうでない場合 : [`numpunct::truename()`](/reference/locale/numpunct/truename.md)と[`numpunct::falsename()`](/reference/locale/numpunct/falsename.md)を対象列として、一意に定まるまで文字を照合する。一意にマッチした場合は対応する値を`val`へ格納する。そうでない場合は`false`を格納し、`err`に[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を設定する ## 戻り値 diff --git a/reference/locale/num_put.md b/reference/locale/num_put.md index 924202cb8a..4cef848e62 100644 --- a/reference/locale/num_put.md +++ b/reference/locale/num_put.md @@ -13,28 +13,33 @@ namespace std { * locale::facet[link /reference/locale/locale/facet.md] ## 概要 +`num_put`は、数値・真偽値・ポインタを書式化して出力ストリームへ出力するためのロケールファセットである。[`basic_ostream`](/reference/ostream/basic_ostream.md)の数値出力演算子[`operator<<`](/reference/ostream/basic_ostream/op_ostream.md)は、このファセットを介して出力の書式化を行う。 -(ここに、クラスの概要を記載する) +テンプレートパラメータ`OutputIterator`は、出力に使用するイテレータの型を表し、既定では[`std::ostreambuf_iterator`](/reference/iterator/ostreambuf_iterator.md)``である。 + +書式化処理は`protected`な仮想関数[`do_put`](num_put/do_put.md)に実装されており、`public`メンバ関数[`put`](num_put/put.md)から呼び出される。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | -| `put` | 数値を出力する | +| [`(constructor)`](num_put/op_constructor.md) | コンストラクタ | +| [`put`](num_put/put.md) | 数値を出力する | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|-----------------------| -| `(destructor)` | デストラクタ | -| `do_put` | 数値を出力する | +| [`(destructor)`](num_put/op_destructor.md) | デストラクタ | +| [`do_put`](num_put/do_put.md) | 数値を出力する (virtual) | ### 浮動小数点数の書式変換 @@ -51,21 +56,61 @@ namespace std { | `!uppercase`(上記以外) | `%g` | | (それ以外) | `%G` | -### メンバ型 +## メンバ型 | 名前 | 説明 | |------------------------|---------------------------------------------------------| | `char_type` | 文字型 `charT` | | `iter_type` | 出力のイテレータ型 `OutputIterator` | -### 例 -```cpp +## 例 +```cpp example +#include +#include +#include +#include + +int main() +{ + std::ostringstream oss; + + // ストリームのロケールからnum_putファセットを取得する + const auto& facet = std::use_facet>(oss.getloc()); + + // 幅8で右詰め、埋め文字は'*' + oss.width(8); + facet.put(std::ostreambuf_iterator{oss}, oss, '*', 42L); + + std::cout << oss.str() << std::endl; +} ``` +* std::num_put[color ff0000] +* std::use_facet[link use_facet.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* oss.width[link /reference/ios/ios_base/width.md] +* facet.put[link num_put/put.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] ### 出力 ``` +******42 ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`num_get`](num_get.md) +- [`numpunct`](numpunct.md) +- [`locale`](locale.md) +- [`use_facet`](use_facet.md) +- [`basic_ostream`の`operator<<`](/reference/ostream/basic_ostream/op_ostream.md) + + +## 参照 - [LWG Issue 4084. `std::fixed` ignores `std::uppercase`](https://cplusplus.github.io/LWG/issue4084) - C++26で、`floatfield == ios_base::fixed`のときに`uppercase`が設定されていれば`%F`(大文字)が使われることが明確化された(従来は`fixed`が常に`%f`で`uppercase`が無視されていた) diff --git a/reference/locale/num_put/do_put.md b/reference/locale/num_put/do_put.md new file mode 100644 index 0000000000..37da3e8099 --- /dev/null +++ b/reference/locale/num_put/do_put.md @@ -0,0 +1,124 @@ +# do_put +* locale[meta header] +* std[meta namespace] +* num_put[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, bool val) const; // (1) C++98 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, long val) const; // (2) C++98 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, long long val) const; // (3) C++11 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, unsigned long val) const; // (4) C++98 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, unsigned long long val) const; // (5) C++11 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, double val) const; // (6) C++98 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, long double val) const; // (7) C++98 + virtual iter_type do_put(iter_type out, ios_base& str, char_type fill, const void* val) const; // (8) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] + +## 概要 +数値・真偽値・ポインタを書式化して出力する。[`put()`](put.md)から呼び出される、実際の書式化を行う仮想関数である。 + +- (1) : `bool`を出力する +- (2), (3) : 符号付き整数型 (`long`, `long long`) を出力する +- (4), (5) : 符号なし整数型 (`unsigned long`, `unsigned long long`) を出力する +- (6), (7) : 浮動小数点数型 (`double`, `long double`) を出力する +- (8) : ポインタ (`const void*`) を出力する + + +## 効果 +(2)〜(8)は、`val`を書式化して文字列`out`へ書き込む。以下の説明で`loc`は`locale loc = str.`[`getloc()`](/reference/ios/ios_base/getloc.md)`;`で初期化されるローカル変数である。処理は以下の4段階(Stage 1〜4)で行われる。 + +### Stage 1 : 変換指定の決定 +`str.`[`flags()`](/reference/ios/ios_base/flags.md)から`basefield`・`uppercase`・`floatfield`・`showpos`・`showbase`・`showpoint`を取り出し、`printf`の変換指定を決定する。各表は上から順に評価され、最初に真となった行が適用される。 + +- (2), (3), (4), (5) : 整数型からの変換 + + | 状態 | `stdio`の変換指定に相当 | + |------|-------------------------| + | `basefield == `[`std::ios_base::oct`](/reference/ios/ios_base/type-fmtflags.md) | `%o` | + | `basefield == `[`std::ios_base::hex`](/reference/ios/ios_base/type-fmtflags.md)` && !uppercase` | `%x` | + | `basefield == `[`std::ios_base::hex`](/reference/ios/ios_base/type-fmtflags.md) | `%X` | + | 符号付き整数型 | `%d` | + | 符号なし整数型 | `%u` | + +- (6), (7) : 浮動小数点数型からの変換 + + | 状態 | `stdio`の変換指定に相当 | + |------|-------------------------| + | `floatfield == `[`std::ios_base::fixed`](/reference/ios/ios_base/type-fmtflags.md)` && !uppercase` | `%f` | + | `floatfield == `[`std::ios_base::fixed`](/reference/ios/ios_base/type-fmtflags.md) | `%F` | + | `floatfield == `[`std::ios_base::scientific`](/reference/ios/ios_base/type-fmtflags.md)` && !uppercase` | `%e` | + | `floatfield == `[`std::ios_base::scientific`](/reference/ios/ios_base/type-fmtflags.md) | `%E` | + | floatfield == (ios_base::fixed | ios_base::scientific) && !uppercase | `%a` | + | floatfield == (ios_base::fixed | ios_base::scientific) | `%A` | + | `!uppercase` | `%g` | + | それ以外 | `%G` | + +- (8) : `%p` + +さらに、型に応じて長さ修飾子が付加される。 + +| 型 | 長さ修飾子 | +|----|-----------| +| `long` | `l` | +| `long long` | `ll` | +| `unsigned long` | `l` | +| `unsigned long long` | `ll` | +| `long double` | `L` | +| それ以外 | なし | + +また、以下の修飾子が変換指定の前に付加される。 + +| 型 | 状態 | `stdio`の変換指定に相当 | +|----|------|-------------------------| +| 整数型 | `showpos` | `+` | +| 整数型 | `showbase` | `#` | +| 浮動小数点数型 | `showpos` | `+` | +| 浮動小数点数型 | `showpoint` | `#` | + +浮動小数点数型からの変換では、`floatfield != (fixed | scientific)`である場合に`str.`[`precision()`](/reference/ios/ios_base/precision.md)が精度として指定される。そうでない場合、精度は指定されない。 + +Stage 1の終了時点での表現は、上記で決定した変換指定`s`を用いて`printf(s, val)`を呼び出した場合に出力される`char`の列である(現在のロケールが`"C"`ロケールであると仮定する)。 + +### Stage 2 : 文字の変換と桁区切りの挿入 +小数点`'.'`以外の各文字`c`は、[`use_facet`](/reference/locale/use_facet.md)`<`[`ctype`](/reference/locale/ctype.md)`>(loc).`[`widen`](/reference/locale/ctype/widen.md)`(c)`によって`charT`へ変換される。 + +算術型については、[`numpunct::do_grouping()`](/reference/locale/numpunct/do_grouping.md)が返す値に従って、[`numpunct::thousands_sep()`](/reference/locale/numpunct/thousands_sep.md)の文字が列に挿入される。 + +小数点`'.'`は[`numpunct::decimal_point()`](/reference/locale/numpunct/decimal_point.md)に置き換えられる。 + +### Stage 3 : 埋め文字の位置の決定 +`adjustfield = (flags & `[`std::ios_base::adjustfield`](/reference/ios/ios_base/type-fmtflags.md)`)`として、埋め文字の位置は以下のように決まる。 + +| 状態 | 位置 | +|------|------| +| `adjustfield == `[`std::ios_base::left`](/reference/ios/ios_base/type-fmtflags.md) | 後ろに詰める | +| `adjustfield == `[`std::ios_base::right`](/reference/ios/ios_base/type-fmtflags.md) | 前に詰める | +| `adjustfield == `[`std::ios_base::internal`](/reference/ios/ios_base/type-fmtflags.md)で、表現に符号が現れる場合 | 符号の後ろに詰める | +| `adjustfield == `[`std::ios_base::internal`](/reference/ios/ios_base/type-fmtflags.md)で、Stage 1の表現が`0x`もしくは`0X`で始まる場合 | `x`または`X`の後ろに詰める | +| それ以外 | 前に詰める | + +`str.`[`width()`](/reference/ios/ios_base/width.md)が非`0`で、Stage 2の後の列の`charT`の数が`str.width()`より少ない場合、列の長さが`str.width()`になるまで、上記の位置に`fill`が追加される。その後、`str.width(0)`が呼び出される。 + +### Stage 4 : 出力 +Stage 3の終了時点での`charT`の列が、`*out++ = c`によって出力される。 + +### (1) `bool`版の処理 +- `(str.`[`flags()`](/reference/ios/ios_base/flags.md)` & `[`std::ios_base::boolalpha`](/reference/ios/ios_base/type-fmtflags.md)`) == 0`の場合 : `do_put(out, str, fill, (int)val)`の結果を返す +- そうでない場合 : `val`が`true`なら[`numpunct::truename()`](/reference/locale/numpunct/truename.md)、`false`なら[`numpunct::falsename()`](/reference/locale/numpunct/falsename.md)から文字列`s`を取得し、`s`の各文字`c`を`*out++ = c`によって出力する + + +## 戻り値 +- (1)〜(8) : `out` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`num_put::put`](put.md) +- [`numpunct`](/reference/locale/numpunct.md) +- [`num_get::do_get`](/reference/locale/num_get/do_get.md) diff --git a/reference/locale/num_put/op_constructor.md b/reference/locale/num_put/op_constructor.md new file mode 100644 index 0000000000..8ce557f6a4 --- /dev/null +++ b/reference/locale/num_put/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* num_put[meta class] +* function[meta id-type] + +```cpp +explicit num_put(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`num_put`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`num_put::put`](put.md) diff --git a/reference/locale/num_put/op_destructor.md b/reference/locale/num_put/op_destructor.md new file mode 100644 index 0000000000..0a05e2821e --- /dev/null +++ b/reference/locale/num_put/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* num_put[meta class] +* function[meta id-type] + +```cpp +protected: + ~num_put(); // (1) C++98 +``` + +## 概要 +`num_put`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`num_put`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`num_put`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/num_put/put.md b/reference/locale/num_put/put.md new file mode 100644 index 0000000000..6a5cea0d51 --- /dev/null +++ b/reference/locale/num_put/put.md @@ -0,0 +1,75 @@ +# put +* locale[meta header] +* std[meta namespace] +* num_put[meta class] +* function[meta id-type] + +```cpp +public: + iter_type put(iter_type out, ios_base& str, char_type fill, bool val) const; // (1) C++98 + iter_type put(iter_type out, ios_base& str, char_type fill, long val) const; // (2) C++98 + iter_type put(iter_type out, ios_base& str, char_type fill, long long val) const; // (3) C++11 + iter_type put(iter_type out, ios_base& str, char_type fill, unsigned long val) const; // (4) C++98 + iter_type put(iter_type out, ios_base& str, char_type fill, unsigned long long val) const; // (5) C++11 + iter_type put(iter_type out, ios_base& str, char_type fill, double val) const; // (6) C++98 + iter_type put(iter_type out, ios_base& str, char_type fill, long double val) const; // (7) C++98 + iter_type put(iter_type out, ios_base& str, char_type fill, const void* val) const; // (8) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] + +## 概要 +数値・真偽値・ポインタを書式化して、出力イテレータ`out`へ出力する。 + +- (1) : `bool`を出力する +- (2), (3) : 符号付き整数型 (`long`, `long long`) を出力する +- (4), (5) : 符号なし整数型 (`unsigned long`, `unsigned long long`) を出力する +- (6), (7) : 浮動小数点数型 (`double`, `long double`) を出力する +- (8) : ポインタ (`const void*`) を出力する + +`fill`は、`str.`[`width()`](/reference/ios/ios_base/width.md)による幅指定を満たすために使用される埋め文字である。 + + +## 戻り値 +- (1)〜(8) : [`do_put(out, str, fill, val)`](do_put.md)の戻り値 + + +## 例 +```cpp example +#include +#include +#include +#include + +int main() +{ + std::ostringstream oss; + const auto& facet = std::use_facet>(oss.getloc()); + + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', 42L); + oss << ' '; + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', 3.14); + + std::cout << oss.str() << std::endl; +} +``` +* std::num_put[link /reference/locale/num_put.md] +* put[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] + +### 出力 +``` +42 3.14 +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`num_put::do_put`](do_put.md) +- [`num_get`](/reference/locale/num_get.md) +- [`numpunct`](/reference/locale/numpunct.md) diff --git a/reference/locale/numpunct.md b/reference/locale/numpunct.md index 8939b1923d..cfc155c753 100644 --- a/reference/locale/numpunct.md +++ b/reference/locale/numpunct.md @@ -12,44 +12,46 @@ namespace std { * locale::facet[link /reference/locale/locale/facet.md] ## 概要 -(ここに、クラスの概要を記載する) +`numpunct`は、数値の入出力における区切り文字や真偽値の名前といった、句読点に関する情報を提供するロケールファセットである。 -### メンバ関数 +[`num_get`](num_get.md)と[`num_put`](num_put.md)は、このファセットから取得した情報を使って数値の解析・書式化を行う。 + +## メンバ関数 | 名前 | 説明 | |----------------------------|--------------------------------------------------------------------| -| `(constructor)` | コンストラクタ | -| `decimal_point` | 小数点の文字を取得する | -| `thousands_sep` | 桁区切りの文字を取得する | -| `grouping` | 何桁で区切るかの、桁数のシーケンスを取得する | -| `truename` | `true`を表す文字列を取得する | -| `falsename` | `false`を表す文字列を取得する | +| [`(constructor)`](numpunct/op_constructor.md) | コンストラクタ | +| [`decimal_point`](numpunct/decimal_point.md) | 小数点の文字を取得する | +| [`thousands_sep`](numpunct/thousands_sep.md) | 桁区切りの文字を取得する | +| [`grouping`](numpunct/grouping.md) | 何桁で区切るかの、桁数のシーケンスを取得する | +| [`truename`](numpunct/truename.md) | `true`を表す文字列を取得する | +| [`falsename`](numpunct/falsename.md) | `false`を表す文字列を取得する | -### 静的メンバ関数 +### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |-------------------------------|--------------------------------------------------------------------| -| `(destructor)` | デストラクタ | -| `do_decima_point` | 小数点の文字を取得する | -| `do_thousands_sep` | 桁区切りの文字を取得する | -| `do_grouping` | 何桁で区切るかの、桁数のシーケンスを取得する | -| `do_truename` | `true`を表す文字列を取得する | -| `do_falsename` | `false`を表す文字列を取得する | +| [`(destructor)`](numpunct/op_destructor.md) | デストラクタ | +| [`do_decimal_point`](numpunct/do_decimal_point.md) | 小数点の文字を取得する | +| [`do_thousands_sep`](numpunct/do_thousands_sep.md) | 桁区切りの文字を取得する | +| [`do_grouping`](numpunct/do_grouping.md) | 何桁で区切るかの、桁数のシーケンスを取得する | +| [`do_truename`](numpunct/do_truename.md) | `true`を表す文字列を取得する | +| [`do_falsename`](numpunct/do_falsename.md) | `false`を表す文字列を取得する | -### メンバ型 +## メンバ型 | 名前 | 説明 | |--------------------------|----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 +## 例 ```cpp example #include @@ -86,9 +88,9 @@ int main() * std::locale[link locale.md] * loc.name()[link locale/name.md] * std::use_facet[link use_facet.md] -* punct.decimal_point()[link numpunct/decimal_point.md.nolink] -* punct.thousands_sep()[link numpunct/thousands_sep.md.nolink] -* punct.grouping()[link numpunct/grouping.md.nolink] +* punct.decimal_point()[link numpunct/decimal_point.md] +* punct.thousands_sep()[link numpunct/thousands_sep.md] +* punct.grouping()[link numpunct/grouping.md] ### 出力例 ``` @@ -103,4 +105,13 @@ German_Germany.1252 3 ``` -### 参照 +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct_byname`](numpunct_byname.md) +- [`num_get`](num_get.md) +- [`num_put`](num_put.md) +- [`locale`](locale.md) diff --git a/reference/locale/numpunct/decimal_point.md b/reference/locale/numpunct/decimal_point.md new file mode 100644 index 0000000000..12c53521c6 --- /dev/null +++ b/reference/locale/numpunct/decimal_point.md @@ -0,0 +1,65 @@ +# decimal_point +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +char_type decimal_point() const; // (1) C++98 +``` + +## 概要 +小数点の文字を取得する。 + + +## 戻り値 +[`do_decimal_point()`](do_decimal_point.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& np = std::use_facet>(loc); + + std::cout << name << " : [" << np.decimal_point() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* decimal_point[color ff0000] +* std::numpunct[link /reference/locale/numpunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* np.decimal_point()[link /reference/locale/numpunct/decimal_point.md] + +### 出力例 +``` +C : [.] +en_US.UTF-8 : [.] +ja_JP.UTF-8 : [.] +de_DE.UTF-8 : [,] +``` + +- ドイツのロケールでは小数点にカンマが使われる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::do_decimal_point`](do_decimal_point.md) diff --git a/reference/locale/numpunct/do_decimal_point.md b/reference/locale/numpunct/do_decimal_point.md new file mode 100644 index 0000000000..30dbca1a97 --- /dev/null +++ b/reference/locale/numpunct/do_decimal_point.md @@ -0,0 +1,27 @@ +# do_decimal_point +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual char_type do_decimal_point() const; // (1) C++98 +``` + +## 概要 +小数点として使用する文字を取得する。[`decimal_point()`](decimal_point.md)から呼び出される仮想関数である。 + + +## 戻り値 +小数点の基数区切りとして使用する文字を返す。 + +規格が要求する特殊化(`numpunct`と`numpunct`)は、`'.'`もしくは`L'.'`を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::decimal_point`](decimal_point.md) diff --git a/reference/locale/numpunct/do_falsename.md b/reference/locale/numpunct/do_falsename.md new file mode 100644 index 0000000000..6f85b221b2 --- /dev/null +++ b/reference/locale/numpunct/do_falsename.md @@ -0,0 +1,30 @@ +# do_falsename +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type do_falsename() const; // (1) C++98 +``` + +## 概要 +`false`を表す文字列を取得する。[`falsename()`](falsename.md)から呼び出される仮想関数である。 + +この文字列は、[`std::ios_base::boolalpha`](/reference/ios/ios_base/type-fmtflags.md)が設定されている場合の`bool`値の入出力で使用される。 + + +## 戻り値 +真偽値`false`の名前を表す文字列を返す。 + +基底クラスの実装では、`"false"`もしくは`L"false"`である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::falsename`](falsename.md) +- [`numpunct::do_truename`](do_truename.md) diff --git a/reference/locale/numpunct/do_grouping.md b/reference/locale/numpunct/do_grouping.md new file mode 100644 index 0000000000..309225d2a5 --- /dev/null +++ b/reference/locale/numpunct/do_grouping.md @@ -0,0 +1,35 @@ +# do_grouping +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string do_grouping() const; // (1) C++98 +``` +* string[link /reference/string/basic_string.md] + +## 概要 +何桁で区切るかの、桁数のシーケンスを取得する。[`grouping()`](grouping.md)から呼び出される仮想関数である。 + + +## 戻り値 +整数値のベクタとして使用される[`string`](/reference/string/basic_string.md)オブジェクト`vec`を返す。各要素`vec[i]`は、位置`i`のグループに含まれる桁数を表す。位置`0`が最も右のグループである。 + +- `vec.size() <= i`である場合、桁数はグループ`(i - 1)`と同じである +- `i < 0 || vec[i] <= 0 || vec[i] == CHAR_MAX`である場合、その桁グループのサイズは無制限である + +規格が要求する特殊化(`numpunct`と`numpunct`)は、桁区切りを行わないことを示す空文字列を返す。 + + +## 備考 +戻り値の各要素は文字ではなく数値として解釈される。3桁ごとの区切りを表す場合、`"3"`ではなく`"\003"`を返す必要がある(`'3'`のASCII値は51であるため、`"3"`は51桁ごとの区切りを意味してしまう)。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::grouping`](grouping.md) diff --git a/reference/locale/numpunct/do_thousands_sep.md b/reference/locale/numpunct/do_thousands_sep.md new file mode 100644 index 0000000000..0c04d3a9fa --- /dev/null +++ b/reference/locale/numpunct/do_thousands_sep.md @@ -0,0 +1,27 @@ +# do_thousands_sep +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual char_type do_thousands_sep() const; // (1) C++98 +``` + +## 概要 +桁区切りとして使用する文字を取得する。[`thousands_sep()`](thousands_sep.md)から呼び出される仮想関数である。 + + +## 戻り値 +桁のグループを区切る文字として使用する文字を返す。 + +規格が要求する特殊化(`numpunct`と`numpunct`)は、`','`もしくは`L','`を返す。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::thousands_sep`](thousands_sep.md) diff --git a/reference/locale/numpunct/do_truename.md b/reference/locale/numpunct/do_truename.md new file mode 100644 index 0000000000..fe28812b30 --- /dev/null +++ b/reference/locale/numpunct/do_truename.md @@ -0,0 +1,30 @@ +# do_truename +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +protected: + virtual string_type do_truename() const; // (1) C++98 +``` + +## 概要 +`true`を表す文字列を取得する。[`truename()`](truename.md)から呼び出される仮想関数である。 + +この文字列は、[`std::ios_base::boolalpha`](/reference/ios/ios_base/type-fmtflags.md)が設定されている場合の`bool`値の入出力で使用される。 + + +## 戻り値 +真偽値`true`の名前を表す文字列を返す。 + +基底クラスの実装では、`"true"`もしくは`L"true"`である。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::truename`](truename.md) +- [`numpunct::do_falsename`](do_falsename.md) diff --git a/reference/locale/numpunct/falsename.md b/reference/locale/numpunct/falsename.md new file mode 100644 index 0000000000..fa976e59f0 --- /dev/null +++ b/reference/locale/numpunct/falsename.md @@ -0,0 +1,66 @@ +# falsename +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +string_type falsename() const; // (1) C++98 +``` + +## 概要 +`false`を表す文字列を取得する。 + + +## 戻り値 +[`do_falsename()`](do_falsename.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& np = std::use_facet>(loc); + + std::cout << name << " : [" << np.falsename() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* falsename[color ff0000] +* std::numpunct[link /reference/locale/numpunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* np.falsename()[link /reference/locale/numpunct/falsename.md] + +### 出力例 +``` +C : [false] +en_US.UTF-8 : [false] +ja_JP.UTF-8 : [false] +de_DE.UTF-8 : [false] +``` + +- この文字列は[`std::ios_base::boolalpha`](/reference/ios/ios_base/type-fmtflags.md)が設定されている場合の`bool`値の入出力で使用される +- 主要な処理系では、いずれのロケールでも`false`を表す英語の名前が返る +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::do_falsename`](do_falsename.md) diff --git a/reference/locale/numpunct/grouping.md b/reference/locale/numpunct/grouping.md new file mode 100644 index 0000000000..3c334db30f --- /dev/null +++ b/reference/locale/numpunct/grouping.md @@ -0,0 +1,76 @@ +# grouping +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +string grouping() const; // (1) C++98 +``` +* string[link /reference/string/basic_string.md] + +## 概要 +何桁で区切るかの、桁数のシーケンスを取得する。 + + +## 戻り値 +[`do_grouping()`](do_grouping.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& np = std::use_facet>(loc); + + std::string g = np.grouping(); + + if (g.empty()) { + std::cout << name << " : (no grouping)" << std::endl; + } + else { + // 各要素は文字ではなく桁数を表す数値である + std::cout << name << " : " << static_cast(g[0]) << std::endl; + } + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* grouping[color ff0000] +* std::numpunct[link /reference/locale/numpunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* np.grouping()[link /reference/locale/numpunct/grouping.md] + +### 出力例 +``` +C : (no grouping) +en_US.UTF-8 : 3 +ja_JP.UTF-8 : 3 +de_DE.UTF-8 : 3 +``` + +- `"C"`ロケールでは桁区切りを行わないため、空文字列が返る +- 戻り値の各要素は文字ではなく数値として解釈される。3桁ごとの区切りは`'3'`(文字)ではなく`3`(数値)である +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::do_grouping`](do_grouping.md) diff --git a/reference/locale/numpunct/op_constructor.md b/reference/locale/numpunct/op_constructor.md new file mode 100644 index 0000000000..96451c63d0 --- /dev/null +++ b/reference/locale/numpunct/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +explicit numpunct(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`numpunct`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`numpunct_byname`](/reference/locale/numpunct_byname.md) diff --git a/reference/locale/numpunct/op_destructor.md b/reference/locale/numpunct/op_destructor.md new file mode 100644 index 0000000000..3f36dd2b74 --- /dev/null +++ b/reference/locale/numpunct/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +protected: + ~numpunct(); // (1) C++98 +``` + +## 概要 +`numpunct`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`numpunct`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/numpunct/thousands_sep.md b/reference/locale/numpunct/thousands_sep.md new file mode 100644 index 0000000000..e2665bf2f6 --- /dev/null +++ b/reference/locale/numpunct/thousands_sep.md @@ -0,0 +1,66 @@ +# thousands_sep +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +char_type thousands_sep() const; // (1) C++98 +``` + +## 概要 +桁区切りの文字を取得する。 + + +## 戻り値 +[`do_thousands_sep()`](do_thousands_sep.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& np = std::use_facet>(loc); + + std::cout << name << " : [" << np.thousands_sep() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* thousands_sep[color ff0000] +* std::numpunct[link /reference/locale/numpunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* np.thousands_sep()[link /reference/locale/numpunct/thousands_sep.md] + +### 出力例 +``` +C : [,] +en_US.UTF-8 : [,] +ja_JP.UTF-8 : [,] +de_DE.UTF-8 : [.] +``` + +- ドイツのロケールでは桁区切りにピリオドが使われる +- 桁区切りが実際に使用されるかどうかは[`grouping()`](grouping.md)が返す値による +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::do_thousands_sep`](do_thousands_sep.md) diff --git a/reference/locale/numpunct/truename.md b/reference/locale/numpunct/truename.md new file mode 100644 index 0000000000..c9a1d3a9c8 --- /dev/null +++ b/reference/locale/numpunct/truename.md @@ -0,0 +1,66 @@ +# truename +* locale[meta header] +* std[meta namespace] +* numpunct[meta class] +* function[meta id-type] + +```cpp +string_type truename() const; // (1) C++98 +``` + +## 概要 +`true`を表す文字列を取得する。 + + +## 戻り値 +[`do_truename()`](do_truename.md)の呼び出し結果を返す。 + +## 例 +```cpp example +#include +#include +#include + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& np = std::use_facet>(loc); + + std::cout << name << " : [" << np.truename() << "]" << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* truename[color ff0000] +* std::numpunct[link /reference/locale/numpunct.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* np.truename()[link /reference/locale/numpunct/truename.md] + +### 出力例 +``` +C : [true] +en_US.UTF-8 : [true] +ja_JP.UTF-8 : [true] +de_DE.UTF-8 : [true] +``` + +- この文字列は[`std::ios_base::boolalpha`](/reference/ios/ios_base/type-fmtflags.md)が設定されている場合の`bool`値の入出力で使用される +- 主要な処理系では、いずれのロケールでも`true`を表す英語の名前が返る +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct::do_truename`](do_truename.md) diff --git a/reference/locale/numpunct_byname.md b/reference/locale/numpunct_byname.md index 7bf9d56ff9..8dfa25b907 100644 --- a/reference/locale/numpunct_byname.md +++ b/reference/locale/numpunct_byname.md @@ -12,33 +12,65 @@ namespace std { * numpunct[link /reference/locale/numpunct.md] ## 概要 -(ここに、クラスの概要を記載する) +`numpunct_byname`は、名前で指定したロケールの数値の区切り文字に関する情報を提供する、[`numpunct`](/reference/locale/numpunct.md)の派生クラスである。 -### メンバ関数 +[`numpunct`](/reference/locale/numpunct.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`numpunct`](/reference/locale/numpunct.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 + +### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](numpunct_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](numpunct_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `char_type` | 文字型 `charT` | -| `string_type` | 文字列型 [`basic_string`](/reference/string/basic_string.md)`` | +| `string_type` | 文字列型 [`std::basic_string`](/reference/string/basic_string.md)`` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), new std::numpunct_byname{"C"}}; + + std::cout << std::boolalpha + << std::has_facet>(loc) << std::endl; +} ``` +* std::numpunct_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::numpunct[link numpunct.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct`](/reference/locale/numpunct.md) +- [`locale`](locale.md) diff --git a/reference/locale/numpunct_byname/op_constructor.md b/reference/locale/numpunct_byname/op_constructor.md new file mode 100644 index 0000000000..b182d1f7bd --- /dev/null +++ b/reference/locale/numpunct_byname/op_constructor.md @@ -0,0 +1,79 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* numpunct_byname[meta class] +* function[meta id-type] + +```cpp +explicit numpunct_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit numpunct_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、数値の区切り文字に関する情報ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`numpunct`](/reference/locale/numpunct.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `numpunct_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), new std::numpunct_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + const auto& fa = std::use_facet>(a); + const auto& fb = std::use_facet>(b); + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha + << (fa.decimal_point() == fb.decimal_point()) << std::endl; +} +``` +* std::numpunct_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::numpunct[link /reference/locale/numpunct.md] +* fa.decimal_point()[link /reference/locale/numpunct/decimal_point.md] +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct`](/reference/locale/numpunct.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/numpunct_byname/op_destructor.md b/reference/locale/numpunct_byname/op_destructor.md new file mode 100644 index 0000000000..2940e8cf9d --- /dev/null +++ b/reference/locale/numpunct_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* numpunct_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~numpunct_byname(); // (1) C++98 +``` + +## 概要 +`numpunct_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`numpunct_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`numpunct_byname`のコンストラクタ](op_constructor.md) +- [`numpunct`](/reference/locale/numpunct.md) diff --git a/reference/locale/time_base.md b/reference/locale/time_base.md index 3634d7ba92..beddc80a4c 100644 --- a/reference/locale/time_base.md +++ b/reference/locale/time_base.md @@ -10,7 +10,9 @@ namespace std { ``` ## 概要 -(ここに、クラスの概要を記載する) +`time_base`は、日付の要素(日・月・年)の並び順を表す列挙型を定義する基底クラスである。 + +[`time_get`](time_get.md)はこのクラスを継承しており、[`time_get::date_order()`](time_get/date_order.md)がこの列挙値を返す。 ### メンバ型 @@ -30,11 +32,37 @@ namespace std { ## 例 -```cpp +```cpp example +#include +#include + +int main() +{ + const auto& facet = std::use_facet>(std::locale::classic()); + + std::cout << std::boolalpha + << (facet.date_order() == std::time_base::no_order) << std::endl; +} ``` +* std::time_base::no_order[color ff0000] +* std::time_get[link time_get.md] +* facet.date_order()[link time_get/date_order.md] +* std::use_facet[link use_facet.md] +* std::locale::classic()[link locale/classic.md] -### 出力 +### 出力例 ``` +false ``` -### 参照 +- 返る値はロケールおよび処理系に依存する。`"C"`ロケールに対して`no_order`を返す処理系もあれば、`mdy`を返す処理系もある + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get`](time_get.md) +- [`time_get::date_order`](time_get/date_order.md) diff --git a/reference/locale/time_get.md b/reference/locale/time_get.md index b381abc149..0d3276fbd5 100644 --- a/reference/locale/time_get.md +++ b/reference/locale/time_get.md @@ -14,54 +14,198 @@ namespace std { * time_base[link /reference/locale/time_base.md] ## 概要 +`time_get`は、文字列を解析して日時の要素を[`std::tm`](/reference/ctime/tm.md)オブジェクトへ取り出すためのロケールファセットである。 -(ここに、クラスの概要を記載する) +各`get`メンバ関数は、[`time_put::put`](/reference/locale/time_put/put.md)の対応する書式指定子が生成する書式を解析する。解析対象の列が正しい書式に一致した場合、`tm`引数の対応するメンバにはその列を生成した値が設定される。そうでない場合は、エラーが報告されるか、未規定の値が代入される。 + +いずれかの`get()`メンバ関数の解析中に終端イテレータへ到達した場合、`err`に[`std::ios_base::eofbit`](/reference/ios/ios_base/type-iostate.md)が設定される。 + +## メンバ関数 ### publicメンバ関数 -| 名前 | 説明 | -|----------------------------|-----------------------------------| -| `(constructor)` | コンストラクタ | -| `date_order` | 日付の表記順を取得する | -| `get_time` | 時間の解析 | -| `get_date` | 日付の解析 | -| `get_weekday` | 曜日の解析 | -| `get_monthname` | 月名の解析 | -| `get_year` | 年の解析 | -| `get` | 日時の解析 | +| 名前 | 説明 | 対応バージョン | +|----------------------------|-----------------------------------|---| +| [`(constructor)`](time_get/op_constructor.md) | コンストラクタ | | +| [`date_order`](time_get/date_order.md) | 日付の表記順を取得する | | +| [`get_time`](time_get/get_time.md) | 時間の解析 | | +| [`get_date`](time_get/get_date.md) | 日付の解析 | | +| [`get_weekday`](time_get/get_weekday.md) | 曜日の解析 | | +| [`get_monthname`](time_get/get_monthname.md) | 月名の解析 | | +| [`get_year`](time_get/get_year.md) | 年の解析 | | +| [`get`](time_get/get.md) | 日時の解析 | C++11 | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 -| 名前 | 説明 | -|-------------------------------|-----------------------------------| -| `(destructor)` | デストラクタ | -| `do_date_order` | 日付の表記順を取得する | -| `do_get_time` | 時間の解析 | -| `do_get_date` | 日付の解析 | -| `do_get_weekday` | 曜日の解析 | -| `do_get_monthname` | 月名の解析 | -| `do_get_year` | 年の解析 | -| `do_get` | 日時の解析 | - -### メンバ型 +| 名前 | 説明 | 対応バージョン | +|-------------------------------|-----------------------------------|---| +| [`(destructor)`](time_get/op_destructor.md) | デストラクタ | | +| [`do_date_order`](time_get/do_date_order.md) | 日付の表記順を取得する (virtual) | | +| [`do_get_time`](time_get/do_get_time.md) | 時間の解析 (virtual) | | +| [`do_get_date`](time_get/do_get_date.md) | 日付の解析 (virtual) | | +| [`do_get_weekday`](time_get/do_get_weekday.md) | 曜日の解析 (virtual) | | +| [`do_get_monthname`](time_get/do_get_monthname.md) | 月名の解析 (virtual) | | +| [`do_get_year`](time_get/do_get_year.md) | 年の解析 (virtual) | | +| [`do_get`](time_get/do_get.md) | 日時の解析 (virtual) | C++11 | + +## メンバ型 | 名前 | 説明 | |-----------------------------------------------------------------------|---------------------------------------------------------| | `char_type` | 文字型 `charT` | | `iter_type` | 入力のイテレータ型 `InputIterator` | -### 例 -```cpp +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include +#include + +int main() +{ + std::istringstream iss{"2026-08-25"}; + + // ストリームのロケールからtime_getファセットを取得する + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + const char fmt[] = "%Y-%m-%d"; + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t, fmt, fmt + 8); + + // tm_yearは1900年からの経過年数、tm_monは1月を0とする月番号 + std::cout << t.tm_year << ' ' << t.tm_mon << ' ' << t.tm_mday << std::endl; +} ``` +* std::time_get[color ff0000] +* std::use_facet[link use_facet.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* facet.get[link time_get/get.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] -### 出力 +#### 出力 ``` +126 7 25 ``` -### 参照 +### ロケールによる違い +`%x`(日付)のようにCロケールに依存すると規定されている書式指定子は、ストリームのロケールによって解析される書式が変わる。 + +```cpp example +#include +#include +#include +#include +#include +#include + +const char* to_string(std::time_base::dateorder order) +{ + switch (order) { + case std::time_base::no_order: return "no_order"; + case std::time_base::dmy: return "dmy"; + case std::time_base::mdy: return "mdy"; + case std::time_base::ymd: return "ymd"; + case std::time_base::ydm: return "ydm"; + } + return ""; +} + +int main() +{ + const char* names[] = {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + // 各ロケールの%xの書式で書かれた、同じ日付 + const char* texts[] = {"08/25/2026", "2026/08/25", "25.08.2026"}; + + for (int i = 0; i < 3; ++i) { + try { + std::istringstream iss{texts[i]}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + const char fmt[] = "%x"; + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t, fmt, fmt + 2); + + std::cout << names[i] << std::endl; + std::cout << " date_order : " << to_string(facet.date_order()) << std::endl; + std::cout << " " << texts[i] << " -> " + << (t.tm_year + 1900) << '/' << (t.tm_mon + 1) << '/' << t.tm_mday + << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* std::time_get[color ff0000] +* facet.get[link time_get/get.md] +* facet.date_order()[link time_get/date_order.md] +* std::time_base::no_order[link /reference/locale/time_base.md] +* std::time_base::dmy[link /reference/locale/time_base.md] +* std::time_base::mdy[link /reference/locale/time_base.md] +* std::time_base::ymd[link /reference/locale/time_base.md] +* std::time_base::ydm[link /reference/locale/time_base.md] +* std::time_base::dateorder[link /reference/locale/time_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +#### 出力例 +``` +en_US.UTF-8 + date_order : mdy + 08/25/2026 -> 2026/8/25 +ja_JP.UTF-8 + date_order : ymd + 2026/08/25 -> 2026/8/25 +de_DE.UTF-8 + date_order : dmy + 25.08.2026 -> 2026/8/25 +``` + +- 書かれ方が異なる3つの日付文字列が、いずれも同じ日付として解析される +- 各ロケールにおける日付の要素の並び順は[`date_order()`](time_get/date_order.md)で取得できる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get_byname`](time_get_byname.md) +- [`time_base`](time_base.md) +- [`time_put`](time_put.md) +- [`locale`](locale.md) diff --git a/reference/locale/time_get/date_order.md b/reference/locale/time_get/date_order.md new file mode 100644 index 0000000000..db93666fff --- /dev/null +++ b/reference/locale/time_get/date_order.md @@ -0,0 +1,87 @@ +# date_order +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +dateorder date_order() const; // (1) C++98 +``` +* dateorder[link /reference/locale/time_base.md] + +## 概要 +日付の要素(日・月・年)の並び順を取得する。 + + +## 戻り値 +[`do_date_order()`](do_date_order.md) + + +## 例 +```cpp example +#include +#include +#include + +const char* to_string(std::time_base::dateorder order) +{ + switch (order) { + case std::time_base::no_order: return "no_order"; + case std::time_base::dmy: return "dmy"; + case std::time_base::mdy: return "mdy"; + case std::time_base::ymd: return "ymd"; + case std::time_base::ydm: return "ydm"; + } + return ""; +} + +int main() +{ + for (const char* name : {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + const auto& facet = std::use_facet>(loc); + + std::cout << name << " : " << to_string(facet.date_order()) << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* date_order[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::time_base::dateorder[link /reference/locale/time_base.md] +* std::time_base::no_order[link /reference/locale/time_base.md] +* std::time_base::dmy[link /reference/locale/time_base.md] +* std::time_base::mdy[link /reference/locale/time_base.md] +* std::time_base::ymd[link /reference/locale/time_base.md] +* std::time_base::ydm[link /reference/locale/time_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] + +### 出力例 +``` +C : mdy +en_US.UTF-8 : mdy +ja_JP.UTF-8 : ymd +de_DE.UTF-8 : dmy +``` + +- 米国では月・日・年、日本では年・月・日、ドイツでは日・月・年の順である。この順序は[`get_date()`](get_date.md)が解析する書式を決める +- 日付書式が日・月・年以外の可変要素(週番号や曜日など)を含む場合は`no_order`が返る。`"C"`ロケールに対して何を返すかは処理系によって異なる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::do_date_order`](do_date_order.md) +- [`time_base`](/reference/locale/time_base.md) +- [`time_get::get_date`](get_date.md) diff --git a/reference/locale/time_get/do_date_order.md b/reference/locale/time_get/do_date_order.md new file mode 100644 index 0000000000..85af98e93f --- /dev/null +++ b/reference/locale/time_get/do_date_order.md @@ -0,0 +1,33 @@ +# do_date_order +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual dateorder do_date_order() const; // (1) C++98 +``` +* dateorder[link /reference/locale/time_base.md] + +## 概要 +日付の要素(日・月・年)の並び順を取得する。[`date_order()`](date_order.md)から呼び出される仮想関数である。 + + +## 戻り値 +日・月・年で構成される日付書式について、要素の推奨される並び順を示す列挙値。 + +書式指定子`'x'`が指定する日付書式が、それ以外の可変要素(ユリウス日、週番号、曜日など)を含む場合は`no_order`を返す。 + + +## 備考 +この関数は一般的な書式に対する利便性のためだけのものであり、妥当なロケールに対しても`no_order`を返しうる。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::date_order`](date_order.md) +- [`time_base`](/reference/locale/time_base.md) diff --git a/reference/locale/time_get/do_get.md b/reference/locale/time_get/do_get.md new file mode 100644 index 0000000000..eb177b537c --- /dev/null +++ b/reference/locale/time_get/do_get.md @@ -0,0 +1,49 @@ +# do_get +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] +* cpp11[meta cpp] + +```cpp +protected: + virtual iter_type do_get(iter_type s, iter_type end, ios_base& f, + ios_base::iostate& err, tm* t, + char format, char modifier) const; // (1) C++11 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +書式指定子を指定して日時を解析する。[`get()`](get.md)から呼び出される仮想関数である。 + + +## 事前条件 +`t`がオブジェクトを指していること。 + + +## 効果 +`err = `[`std::ios_base::goodbit`](/reference/ios/ios_base/type-iostate.md)を評価したのち、`s`から文字を読み取る。エラーに遭遇するか、`'%'`・`modifier`(非NULの場合)・`format`を連結して形成される、POSIX関数`strptime`にとって適切な変換指定に対応する`tm`のメンバと残りの書式文字を抽出して代入し終えるまで、処理を続ける。 + +連結が完全かつ妥当な指定を与えない場合、`t`が指すオブジェクトは変更せず、`err |= `[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を評価する。 + +文字を読み取った後に`s == end`が`true`となる場合、`err |= `[`std::ios_base::eofbit`](/reference/ios/ios_base/type-iostate.md)を評価する。 + +`%c`・`%x`・`%X`のような複雑な変換指定、もしくは省略可能な修飾子`E`や`O`を伴う変換指定において、入力列`[s, end)`から一部またはすべての`tm`のメンバを曖昧さなく決定できない場合、`err |= `[`std::ios_base::eofbit`](/reference/ios/ios_base/type-iostate.md)を評価する。この場合、それらの`tm`のメンバの値は未規定であり、妥当な範囲の外にある可能性がある。 + + +## 戻り値 +与えられた`format`と`modifier`に対する妥当な入力列の一部でありうると認識した、最後の文字の直後を指すイテレータ。 + + +## 備考 +同じ`tm`オブジェクトのアドレスに対して`do_get()`を複数回呼び出したとき、オブジェクトの現在の内容が更新されるのか、単にメンバが上書きされるのかは未規定である。移植性のあるプログラムでは、この関数を呼び出す前にオブジェクトをゼロクリアすべきである。 + +## バージョン +### 言語 +- C++11 + + +## 関連項目 +- [`time_get::get`](get.md) diff --git a/reference/locale/time_get/do_get_date.md b/reference/locale/time_get/do_get_date.md new file mode 100644 index 0000000000..cd44689627 --- /dev/null +++ b/reference/locale/time_get/do_get_date.md @@ -0,0 +1,47 @@ +# do_get_date +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_get_date(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +日付を解析する。[`get_date()`](get_date.md)から呼び出される仮想関数である。 + + +## 効果 +`s`から文字を読み取り、[`time_put::put`](/reference/locale/time_put/put.md)が以下のいずれかの書式を生成するために使用する`tm`のメンバと残りの書式文字を抽出するまで、もしくはエラーに遭遇するまで処理を続ける。 + +書式は[`date_order()`](date_order.md)が返す値によって決まる。 + +| [`date_order()`](date_order.md) | 書式 | +|---------------------------------|------| +| `no_order` | `"%m%d%y"` | +| `dmy` | `"%d%m%y"` | +| `mdy` | `"%m%d%y"` | +| `ymd` | `"%y%m%d"` | +| `ydm` | `"%y%d%m"` | + +処理系は、これら以外の書式を追加で受け付けてもよい(処理系定義)。 + + +## 戻り値 +妥当な日付の一部でありうると認識した最後の文字の直後を指すイテレータ。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::get_date`](get_date.md) +- [`time_get::date_order`](date_order.md) +- [`time_base`](/reference/locale/time_base.md) diff --git a/reference/locale/time_get/do_get_monthname.md b/reference/locale/time_get/do_get_monthname.md new file mode 100644 index 0000000000..1251c7915c --- /dev/null +++ b/reference/locale/time_get/do_get_monthname.md @@ -0,0 +1,37 @@ +# do_get_monthname +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_get_monthname(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +月名を解析する。[`get_monthname()`](get_monthname.md)から呼び出される仮想関数である。 + + +## 効果 +`s`から文字を読み取り、(省略形かもしれない)月名を抽出するまで処理を続ける。 + +省略形を見つけ、その後ろにフルネームと一致しうる文字が続く場合は、フルネームと一致するか失敗するまで読み取りを続ける。 + +結果に応じて`t->tm_mon`メンバを設定する。 + + +## 戻り値 +妥当な名前の一部と認識した最後の文字の直後を指すイテレータ。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::get_monthname`](get_monthname.md) diff --git a/reference/locale/time_get/do_get_time.md b/reference/locale/time_get/do_get_time.md new file mode 100644 index 0000000000..84bbb524b4 --- /dev/null +++ b/reference/locale/time_get/do_get_time.md @@ -0,0 +1,34 @@ +# do_get_time +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_get_time(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +時刻を解析する。[`get_time()`](get_time.md)から呼び出される仮想関数である。 + + +## 効果 +`s`から文字を読み取り、[`time_put::put`](/reference/locale/time_put/put.md)が書式`"%H:%M:%S"`を生成するために使用する`tm`のメンバと残りの書式文字を抽出するまで、もしくはエラーか列の終端に遭遇するまで処理を続ける。 + + +## 戻り値 +妥当な時刻の一部でありうると認識した最後の文字の直後を指すイテレータ。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::get_time`](get_time.md) +- [`time_put::put`](/reference/locale/time_put/put.md) diff --git a/reference/locale/time_get/do_get_weekday.md b/reference/locale/time_get/do_get_weekday.md new file mode 100644 index 0000000000..020fef33a1 --- /dev/null +++ b/reference/locale/time_get/do_get_weekday.md @@ -0,0 +1,37 @@ +# do_get_weekday +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_get_weekday(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +曜日名を解析する。[`get_weekday()`](get_weekday.md)から呼び出される仮想関数である。 + + +## 効果 +`s`から文字を読み取り、(省略形かもしれない)曜日名を抽出するまで処理を続ける。 + +省略形を見つけ、その後ろにフルネームと一致しうる文字が続く場合は、フルネームと一致するか失敗するまで読み取りを続ける。 + +結果に応じて`t->tm_wday`メンバを設定する。 + + +## 戻り値 +妥当な名前の一部と認識した最後の文字の直後を指すイテレータ。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::get_weekday`](get_weekday.md) diff --git a/reference/locale/time_get/do_get_year.md b/reference/locale/time_get/do_get_year.md new file mode 100644 index 0000000000..8925cd74de --- /dev/null +++ b/reference/locale/time_get/do_get_year.md @@ -0,0 +1,35 @@ +# do_get_year +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_get_year(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +年を解析する。[`get_year()`](get_year.md)から呼び出される仮想関数である。 + + +## 効果 +`s`から文字を読み取り、曖昧さのない年の識別子を抽出するまで処理を続ける。結果に応じて`t->tm_year`メンバを設定する。 + +2桁の年を受け付けるかどうか、受け付ける場合にどの世紀にあると仮定するかは、処理系定義である。 + + +## 戻り値 +妥当な年の識別子の一部と認識した最後の文字の直後を指すイテレータ。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::get_year`](get_year.md) diff --git a/reference/locale/time_get/get.md b/reference/locale/time_get/get.md new file mode 100644 index 0000000000..c96e78855b --- /dev/null +++ b/reference/locale/time_get/get.md @@ -0,0 +1,203 @@ +# get +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] +* cpp11[meta cpp] + +```cpp +iter_type + get(iter_type s, + iter_type end, + ios_base& f, + ios_base::iostate& err, + tm* t, + char format, + char modifier = 0) const; // (1) C++11 + +iter_type + get(iter_type s, + iter_type end, + ios_base& f, + ios_base::iostate& err, + tm* t, + const char_type* fmt, + const char_type* fmtend) const; // (2) C++11 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +入力イテレータ範囲`[s, end)`から、書式を指定して日時を解析する。 + +- (1) : 単一の書式指定子`format`(と修飾子`modifier`)に従って解析する +- (2) : 範囲`[fmt, fmtend)`を書式文字列として解析する + + +## 事前条件 +- (2) : `[fmt, fmtend)`が妥当な範囲であること + + +## 効果 +- (2) : `err = `[`std::ios_base::goodbit`](/reference/ios/ios_base/type-iostate.md)を評価したのち、各反復で`s`から0個以上の文字を読み取るループに入る。ループは以下のいずれかが最初に成立したときに終了する + - `fmt == fmtend`が`true`である + - `err == `[`std::ios_base::goodbit`](/reference/ios/ios_base/type-iostate.md)が`false`である + - `s == end`が`true`である。この場合、`err = `[`std::ios_base::eofbit`](/reference/ios/ios_base/type-iostate.md)` | `[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を評価する + - `fmt`の次の要素が`'%'`であり、省略可能な修飾子文字と変換指定子文字`format`が続いて、POSIX関数`strptime`にとって妥当な変換指定を形成する場合。範囲`[fmt, fmtend)`の要素数が、変換指定が完全かつ妥当であるかを曖昧さなく判定するのに不足している場合は`err = `[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を評価する。そうでない場合は`s = `[`do_get`](do_get.md)`(s, end, f, err, t, format, modifier)`を評価する(修飾子がない場合、`modifier`の値は`'\0'`である)。評価後に`err == `[`std::ios_base::goodbit`](/reference/ios/ios_base/type-iostate.md)であれば、`fmt`を変換指定の終端の直後まで進めてループを継続する + - `isspace(*fmt, f.`[`getloc()`](/reference/ios/ios_base/getloc.md)`)`が`true`である場合。この場合、まず`fmt == fmtend || !isspace(*fmt, f.getloc())`が`true`になるまで`fmt`を進め、次に`s == end || !isspace(*s, f.getloc())`が`true`になるまで`s`を進めて、ループを再開する + - `s`から読み取った次の文字が、`fmt`が指す要素と大文字小文字を区別しない比較で一致する場合。この場合`++fmt, ++s`を評価してループを継続する。一致しない場合は`err = `[`std::ios_base::failbit`](/reference/ios/ios_base/type-iostate.md)を評価する + + +## 戻り値 +- (1) : [`do_get(s, end, f, err, t, format, modifier)`](do_get.md) +- (2) : `s` + + +## 備考 +- (2) : 妥当な空白文字の判定には、`f`のロケールに設定された[`ctype`](/reference/locale/ctype.md)``ファセットが使用される。大文字小文字を区別しない比較をどのような手段で行うか、およびその際に複数文字の並びを考慮するかは未規定である + + +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include +#include + +int main() +{ + std::istringstream iss{"2026-08-25"}; + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + // (2) 書式文字列を指定する + const char fmt[] = "%Y-%m-%d"; + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t, fmt, fmt + 8); + + std::cout << t.tm_year << ' ' << t.tm_mon << ' ' << t.tm_mday << std::endl; +} +``` +* get[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +#### 出力 +``` +126 7 25 +``` + +### ロケールによる違い +`%x`(日付)のようにCロケールに依存すると規定されている書式指定子は、ストリームのロケールによって解析される書式が変わる。 + +```cpp example +#include +#include +#include +#include +#include +#include + +const char* to_string(std::time_base::dateorder order) +{ + switch (order) { + case std::time_base::no_order: return "no_order"; + case std::time_base::dmy: return "dmy"; + case std::time_base::mdy: return "mdy"; + case std::time_base::ymd: return "ymd"; + case std::time_base::ydm: return "ydm"; + } + return ""; +} + +int main() +{ + const char* names[] = {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + // 各ロケールの%xの書式で書かれた、同じ日付 + const char* texts[] = {"08/25/2026", "2026/08/25", "25.08.2026"}; + + for (int i = 0; i < 3; ++i) { + try { + std::istringstream iss{texts[i]}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + const char fmt[] = "%x"; + facet.get(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t, fmt, fmt + 2); + + std::cout << names[i] << std::endl; + std::cout << " date_order : " << to_string(facet.date_order()) << std::endl; + std::cout << " " << texts[i] << " -> " + << (t.tm_year + 1900) << '/' << (t.tm_mon + 1) << '/' << t.tm_mday + << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* facet.date_order()[link date_order.md] +* std::time_base::no_order[link /reference/locale/time_base.md] +* std::time_base::dmy[link /reference/locale/time_base.md] +* std::time_base::mdy[link /reference/locale/time_base.md] +* std::time_base::ymd[link /reference/locale/time_base.md] +* std::time_base::ydm[link /reference/locale/time_base.md] +* std::time_base::dateorder[link /reference/locale/time_base.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +#### 出力例 +``` +en_US.UTF-8 + date_order : mdy + 08/25/2026 -> 2026/8/25 +ja_JP.UTF-8 + date_order : ymd + 2026/08/25 -> 2026/8/25 +de_DE.UTF-8 + date_order : dmy + 25.08.2026 -> 2026/8/25 +``` + +- 書かれ方が異なる3つの日付文字列が、いずれも同じ日付として解析される +- 各ロケールにおける日付の要素の並び順は[`date_order()`](date_order.md)で取得できる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++11 + + +## 関連項目 +- [`time_get::do_get`](do_get.md) +- [`time_put::put`](/reference/locale/time_put/put.md) diff --git a/reference/locale/time_get/get_date.md b/reference/locale/time_get/get_date.md new file mode 100644 index 0000000000..d5e1958b47 --- /dev/null +++ b/reference/locale/time_get/get_date.md @@ -0,0 +1,93 @@ +# get_date +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +iter_type get_date(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +入力イテレータ範囲`[s, end)`から日付を解析する。解析結果は`*t`の対応するメンバへ格納される。 + + +## 戻り値 +[`do_get_date(s, end, str, err, t)`](do_get_date.md) + + +## 例 +```cpp example +#include +#include +#include +#include +#include +#include + +int main() +{ + const char* names[] = {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + // 各ロケールでの日付の書式 + const char* texts[] = {"08/25/26", "08/25/2026", "2026/08/25", "25.08.2026"}; + + for (int i = 0; i < 4; ++i) { + try { + std::istringstream iss{texts[i]}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + facet.get_date(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t); + + std::cout << names[i] << " : " << texts[i] << " -> " << (t.tm_year + 1900) << '/' << (t.tm_mon + 1) << '/' << t.tm_mday << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get_date[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +### 出力例 +``` +C : 08/25/26 -> 2026/8/25 +en_US.UTF-8 : 08/25/2026 -> 2026/8/25 +ja_JP.UTF-8 : 2026/08/25 -> 2026/8/25 +de_DE.UTF-8 : 25.08.2026 -> 2026/8/25 +``` + +- 解析される日付の要素の並び順は[`date_order()`](date_order.md)が返す値によって決まり、米国では月・日・年、日本では年・月・日、ドイツでは日・月・年となる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::do_get_date`](do_get_date.md) +- [`time_put`](/reference/locale/time_put.md) diff --git a/reference/locale/time_get/get_monthname.md b/reference/locale/time_get/get_monthname.md new file mode 100644 index 0000000000..0d210d0064 --- /dev/null +++ b/reference/locale/time_get/get_monthname.md @@ -0,0 +1,94 @@ +# get_monthname +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +iter_type get_monthname(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +入力イテレータ範囲`[s, end)`から月名を解析する。解析結果は`*t`の対応するメンバへ格納される。 + + +## 戻り値 +[`do_get_monthname(s, end, str, err, t)`](do_get_monthname.md) + + +## 例 +```cpp example +#include +#include +#include +#include +#include +#include + +int main() +{ + const char* names[] = {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + // 各ロケールでの月名 + const char* texts[] = {"August", "August", "8月", "August"}; + + for (int i = 0; i < 4; ++i) { + try { + std::istringstream iss{texts[i]}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + facet.get_monthname(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t); + + std::cout << names[i] << " : " << texts[i] << " -> " << t.tm_mon << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get_monthname[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +### 出力例 +``` +C : August -> 7 +en_US.UTF-8 : August -> 7 +ja_JP.UTF-8 : 8月 -> 7 +de_DE.UTF-8 : August -> 7 +``` + +- ロケールごとに異なる月名を解析しても、`tm_mon`には同じ値(1月を`0`とする月番号)が設定される +- 省略形(`Aug`など)も解析できる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::do_get_monthname`](do_get_monthname.md) +- [`time_put`](/reference/locale/time_put.md) diff --git a/reference/locale/time_get/get_time.md b/reference/locale/time_get/get_time.md new file mode 100644 index 0000000000..120ef45d4f --- /dev/null +++ b/reference/locale/time_get/get_time.md @@ -0,0 +1,90 @@ +# get_time +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +iter_type get_time(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +入力イテレータ範囲`[s, end)`から時刻を解析する。解析結果は`*t`の対応するメンバへ格納される。 + + +## 戻り値 +[`do_get_time(s, end, str, err, t)`](do_get_time.md) + + +## 例 +```cpp example +#include +#include +#include +#include +#include +#include + +int main() +{ + const char* names[] = {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + for (int i = 0; i < 4; ++i) { + try { + std::istringstream iss{"13:05:30"}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + facet.get_time(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t); + + std::cout << names[i] << " : 13:05:30 -> " << t.tm_hour << ':' << t.tm_min << ':' << t.tm_sec << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get_time[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +### 出力例 +``` +C : 13:05:30 -> 13:5:30 +en_US.UTF-8 : 13:05:30 -> 13:5:30 +ja_JP.UTF-8 : 13:05:30 -> 13:5:30 +de_DE.UTF-8 : 13:05:30 -> 13:5:30 +``` + +- 時刻の書式は規格により`"%H:%M:%S"`と定められているため、いずれのロケールでも同じ結果となる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::do_get_time`](do_get_time.md) +- [`time_put`](/reference/locale/time_put.md) diff --git a/reference/locale/time_get/get_weekday.md b/reference/locale/time_get/get_weekday.md new file mode 100644 index 0000000000..fb208d2fae --- /dev/null +++ b/reference/locale/time_get/get_weekday.md @@ -0,0 +1,94 @@ +# get_weekday +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +iter_type get_weekday(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +入力イテレータ範囲`[s, end)`から曜日名を解析する。解析結果は`*t`の対応するメンバへ格納される。 + + +## 戻り値 +[`do_get_weekday(s, end, str, err, t)`](do_get_weekday.md) + + +## 例 +```cpp example +#include +#include +#include +#include +#include +#include + +int main() +{ + const char* names[] = {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + // 各ロケールでの曜日名 + const char* texts[] = {"Tuesday", "Tuesday", "火曜日", "Dienstag"}; + + for (int i = 0; i < 4; ++i) { + try { + std::istringstream iss{texts[i]}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + facet.get_weekday(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t); + + std::cout << names[i] << " : " << texts[i] << " -> " << t.tm_wday << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get_weekday[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +### 出力例 +``` +C : Tuesday -> 2 +en_US.UTF-8 : Tuesday -> 2 +ja_JP.UTF-8 : 火曜日 -> 2 +de_DE.UTF-8 : Dienstag -> 2 +``` + +- ロケールごとに異なる曜日名を解析しても、`tm_wday`には同じ値(日曜日を`0`とする曜日番号)が設定される +- 省略形(`Tue`など)も解析できる +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::do_get_weekday`](do_get_weekday.md) +- [`time_put`](/reference/locale/time_put.md) diff --git a/reference/locale/time_get/get_year.md b/reference/locale/time_get/get_year.md new file mode 100644 index 0000000000..7274848f07 --- /dev/null +++ b/reference/locale/time_get/get_year.md @@ -0,0 +1,92 @@ +# get_year +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +iter_type get_year(iter_type s, iter_type end, ios_base& str, + ios_base::iostate& err, tm* t) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +入力イテレータ範囲`[s, end)`から年を解析する。解析結果は`*t`の対応するメンバへ格納される。 + + +## 戻り値 +[`do_get_year(s, end, str, err, t)`](do_get_year.md) + + +## 例 +```cpp example +#include +#include +#include +#include +#include +#include + +int main() +{ + const char* names[] = {"C", "en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}; + + for (int i = 0; i < 4; ++i) { + try { + std::istringstream iss{"2026"}; + iss.imbue(std::locale{names[i]}); + + const auto& facet = std::use_facet>(iss.getloc()); + + std::tm t{}; + std::ios_base::iostate err = std::ios_base::goodbit; + + facet.get_year(std::istreambuf_iterator{iss}, + std::istreambuf_iterator{}, + iss, err, &t); + + std::cout << names[i] << " : 2026 -> " << t.tm_year << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << names[i] << " : not available" << std::endl; + } + } +} +``` +* get_year[color ff0000] +* std::time_get[link /reference/locale/time_get.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* iss.imbue[link /reference/ios/basic_ios/imbue.md] +* iss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::istreambuf_iterator[link /reference/iterator/istreambuf_iterator.md] +* std::ios_base::iostate[link /reference/ios/ios_base/type-iostate.md] +* std::ios_base::goodbit[link /reference/ios/ios_base/type-iostate.md] +* std::tm[link /reference/ctime/tm.md] + +### 出力例 +``` +C : 2026 -> 126 +en_US.UTF-8 : 2026 -> 126 +ja_JP.UTF-8 : 2026 -> 126 +de_DE.UTF-8 : 2026 -> 126 +``` + +- `tm_year`には1900年からの経過年数が設定される +- 年の表記はロケールによらず数字であるため、いずれのロケールでも同じ結果となる +- 2桁の年を受け付けるかどうか、受け付ける場合にどの世紀にあると仮定するかは処理系定義である +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get::do_get_year`](do_get_year.md) +- [`time_put`](/reference/locale/time_put.md) diff --git a/reference/locale/time_get/op_constructor.md b/reference/locale/time_get/op_constructor.md new file mode 100644 index 0000000000..37ee345e2f --- /dev/null +++ b/reference/locale/time_get/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +explicit time_get(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`time_get`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`time_get_byname`](/reference/locale/time_get_byname.md) diff --git a/reference/locale/time_get/op_destructor.md b/reference/locale/time_get/op_destructor.md new file mode 100644 index 0000000000..28c464644f --- /dev/null +++ b/reference/locale/time_get/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* time_get[meta class] +* function[meta id-type] + +```cpp +protected: + ~time_get(); // (1) C++98 +``` + +## 概要 +`time_get`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`time_get`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/time_get_byname.md b/reference/locale/time_get_byname.md index 9d714f3ec0..b8c369f98a 100644 --- a/reference/locale/time_get_byname.md +++ b/reference/locale/time_get_byname.md @@ -13,33 +13,65 @@ namespace std { * time_get[link /reference/locale/time_get.md] ## 概要 -(ここに、クラスの概要を記載する) +`time_get_byname`は、名前で指定したロケールの日時の解析を提供する、[`time_get`](/reference/locale/time_get.md)の派生クラスである。 + +[`time_get`](/reference/locale/time_get.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`time_get`](/reference/locale/time_get.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](time_get_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](time_get_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------| | `dateorder` | 日付の表記順を表す列挙型 [`time_base`](/reference/locale/time_base.md)`::dateorder` | | `iter_type` | 入力のイテレータ型 `InputIterator` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), new std::time_get_byname{"C"}}; + + std::cout << std::boolalpha + << std::has_facet>(loc) << std::endl; +} ``` +* std::time_get_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::time_get[link time_get.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get`](/reference/locale/time_get.md) +- [`locale`](locale.md) diff --git a/reference/locale/time_get_byname/op_constructor.md b/reference/locale/time_get_byname/op_constructor.md new file mode 100644 index 0000000000..4cbf297d2b --- /dev/null +++ b/reference/locale/time_get_byname/op_constructor.md @@ -0,0 +1,79 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* time_get_byname[meta class] +* function[meta id-type] + +```cpp +explicit time_get_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit time_get_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、日時の解析ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`time_get`](/reference/locale/time_get.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `time_get_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), new std::time_get_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + const auto& fa = std::use_facet>(a); + const auto& fb = std::use_facet>(b); + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha + << (fa.date_order() == fb.date_order()) << std::endl; +} +``` +* std::time_get_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::time_get[link /reference/locale/time_get.md] +* fa.date_order()[link /reference/locale/time_get/date_order.md] +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get`](/reference/locale/time_get.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/time_get_byname/op_destructor.md b/reference/locale/time_get_byname/op_destructor.md new file mode 100644 index 0000000000..9d96c01da1 --- /dev/null +++ b/reference/locale/time_get_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* time_get_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~time_get_byname(); // (1) C++98 +``` + +## 概要 +`time_get_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`time_get_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_get_byname`のコンストラクタ](op_constructor.md) +- [`time_get`](/reference/locale/time_get.md) diff --git a/reference/locale/time_put.md b/reference/locale/time_put.md index da36af1ccb..61e8807fa2 100644 --- a/reference/locale/time_put.md +++ b/reference/locale/time_put.md @@ -13,41 +13,169 @@ namespace std { * locale::facet[link /reference/locale/locale/facet.md] ## 概要 -(ここに、クラスの概要を記載する) +`time_put`は、[`std::tm`](/reference/ctime/tm.md)の内容を書式化して出力するためのロケールファセットである。書式指定子は[`std::strftime()`](/reference/ctime/strftime.md)と同一に解釈される。 + +テンプレートパラメータ`OutputIterator`は、出力に使用するイテレータの型を表し、既定では[`std::ostreambuf_iterator`](/reference/iterator/ostreambuf_iterator.md)``である。 + +[`std::put_time`](/reference/iomanip/put_time.md)マニピュレータは、このファセットを介して日時の書式化を行う。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |---------------------------------------------------------------------------|-----------------------| -| (constructor) | コンストラクタ | -| `put` | 日時を出力する | +| [`(constructor)`](time_put/op_constructor.md) | コンストラクタ | +| [`put`](time_put/put.md) | 日時を出力する | ### 静的メンバ変数 | 名前 | 説明 | |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--| -| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | | +| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|-----------------------| -| `(destructor)` | デストラクタ | -| `do_put` | 日時を出力する | +| [`(destructor)`](time_put/op_destructor.md) | デストラクタ | +| [`do_put`](time_put/do_put.md) | 日時を出力する (virtual) | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-----------------------------------------------------------------------|----------------------------------------------------------| | `char_type` | 文字型 `charT` | | `iter_type` | 出力のイテレータ型 `OutputIterator` | -### 例 -```cpp +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include +#include + +int main() +{ + std::tm t{}; + t.tm_year = 126; // 2026年 + t.tm_mon = 7; // 8月 + t.tm_mday = 25; + + std::ostringstream oss; + + // ストリームのロケールからtime_putファセットを取得する + const auto& facet = std::use_facet>(oss.getloc()); + + const char pattern[] = "%Y/%m/%d"; + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', &t, pattern, pattern + 8); + + std::cout << oss.str() << std::endl; +} ``` +* std::time_put[color ff0000] +* std::use_facet[link use_facet.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* facet.put[link time_put/put.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] +* std::tm[link /reference/ctime/tm.md] -### 出力 +#### 出力 ``` +2026/08/25 ``` -### 参照 +### ロケールによる違い +`%x`(日付)・`%A`(曜日名)・`%B`(月名)のように、Cロケールに依存すると規定されている書式指定子は、ストリームのロケールによって生成される文字列が変わる。 + +```cpp example +#include +#include +#include +#include +#include +#include +#include + +// 書式化の処理自体はロケールに依存しない +std::string format_time(const std::locale& loc, const std::tm& t, const std::string& pattern) +{ + std::ostringstream oss; + oss.imbue(loc); + + const auto& facet = std::use_facet>(oss.getloc()); + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', &t, + pattern.data(), pattern.data() + pattern.size()); + + return oss.str(); +} + +int main() +{ + std::tm t{}; + t.tm_year = 126; // 2026年 + t.tm_mon = 7; // 8月 + t.tm_mday = 25; + t.tm_wday = 2; // 火曜日 + + for (const char* name : {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + + std::cout << name << std::endl; + std::cout << " %x : " << format_time(loc, t, "%x") << std::endl; + std::cout << " %A : " << format_time(loc, t, "%A") << std::endl; + std::cout << " %B : " << format_time(loc, t, "%B") << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* std::time_put[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] +* std::tm[link /reference/ctime/tm.md] + +#### 出力例 +``` +en_US.UTF-8 + %x : 08/25/2026 + %A : Tuesday + %B : August +ja_JP.UTF-8 + %x : 2026/08/25 + %A : 火曜日 + %B : 8月 +de_DE.UTF-8 + %x : 25.08.2026 + %A : Dienstag + %B : August +``` + +- `%x`が生成する日付の書式は、米国では月・日・年、日本では年・月・日、ドイツでは日・月・年の順となる。この順序は[`std::time_get::date_order()`](/reference/locale/time_get/date_order.md)で取得できる +- Cロケールに依存すると規定されている書式指定子について生成される文字列は、処理系定義である +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put_byname`](time_put_byname.md) +- [`time_get`](time_get.md) +- [`std::put_time`](/reference/iomanip/put_time.md) +- [`std::strftime`](/reference/ctime/strftime.md) diff --git a/reference/locale/time_put/do_put.md b/reference/locale/time_put/do_put.md new file mode 100644 index 0000000000..82a38d0f62 --- /dev/null +++ b/reference/locale/time_put/do_put.md @@ -0,0 +1,43 @@ +# do_put +* locale[meta header] +* std[meta namespace] +* time_put[meta class] +* function[meta id-type] + +```cpp +protected: + virtual iter_type do_put(iter_type s, ios_base& str, char_type fill, const tm* t, + char format, char modifier) const; // (1) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +日時を書式化して出力する。[`put()`](put.md)から呼び出される、実際の書式化を行う仮想関数である。 + + +## 効果 +引数`t`の内容を書式化し、出力列`s`へ文字を格納する。 + +書式化は引数`format`と`modifier`によって制御される。これらは標準ライブラリ関数[`std::strftime()`](/reference/ctime/strftime.md)の書式文字列における書式指定子と同一に解釈される。ただし、Cロケールに依存すると規定されている指定子について生成される文字列は、処理系定義である。 + +`modifier`引数の解釈は処理系定義である。 + + +## 戻り値 +生成した最後の文字の直後を指すイテレータ。 + + +## 備考 +`fill`は、処理系定義の書式や派生クラスでの実装において使用できる。空白文字がこの引数の妥当な既定値である。 + +`modifier`の解釈はPOSIXの慣習に従うことが推奨される。また、Cロケールに依存すると規定されている指定子について生成される文字列については、POSIXなどの他の標準を参照することが推奨される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put::put`](put.md) +- [`std::strftime`](/reference/ctime/strftime.md) diff --git a/reference/locale/time_put/op_constructor.md b/reference/locale/time_put/op_constructor.md new file mode 100644 index 0000000000..d239c2c4ab --- /dev/null +++ b/reference/locale/time_put/op_constructor.md @@ -0,0 +1,33 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* time_put[meta class] +* function[meta id-type] + +```cpp +explicit time_put(size_t refs = 0); // (1) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] + +## 概要 +`time_put`ファセットオブジェクトを構築する。 + + +## 効果 +基底クラスを[`locale::facet`](/reference/locale/locale/facet.md)`(refs)`で初期化する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`locale::facet`](/reference/locale/locale/facet.md) +- [`time_put_byname`](/reference/locale/time_put_byname.md) diff --git a/reference/locale/time_put/op_destructor.md b/reference/locale/time_put/op_destructor.md new file mode 100644 index 0000000000..67c809c518 --- /dev/null +++ b/reference/locale/time_put/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* time_put[meta class] +* function[meta id-type] + +```cpp +protected: + ~time_put(); // (1) C++98 +``` + +## 概要 +`time_put`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`time_put`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put`のコンストラクタ](op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/time_put/put.md b/reference/locale/time_put/put.md new file mode 100644 index 0000000000..a5f3e47678 --- /dev/null +++ b/reference/locale/time_put/put.md @@ -0,0 +1,175 @@ +# put +* locale[meta header] +* std[meta namespace] +* time_put[meta class] +* function[meta id-type] + +```cpp +iter_type put(iter_type s, ios_base& str, char_type fill, const tm* t, + const charT* pattern, const charT* pat_end) const; // (1) C++98 +iter_type put(iter_type s, ios_base& str, char_type fill, const tm* t, + char format, char modifier = 0) const; // (2) C++98 +``` +* ios_base[link /reference/ios/ios_base.md] +* tm[link /reference/ctime/tm.md] + +## 概要 +日時を書式化して、出力イテレータ`s`へ出力する。 + +- (1) : 範囲`[pattern, pat_end)`を書式文字列として、`*t`の内容を出力する +- (2) : 書式指定子`format`(と修飾子`modifier`)に従って`*t`の内容を出力する + + +## 効果 +- (1) : `pattern`から`pat_end`までの列をたどり、書式シーケンスの一部である文字を識別する + - 書式シーケンスに含まれない文字は、直ちに`s`へ書き込まれる + - 書式シーケンスが識別されるたびに[`do_put`](do_put.md)が呼び出される。したがって書式要素とその他の文字は、パターンに現れた順に出力へ交互に現れる + - 書式シーケンスの識別は、`str.`[`getloc()`](/reference/ios/ios_base/getloc.md)から取得した[`ctype`](/reference/locale/ctype.md)``への参照`ct`を用いて、各文字`c`を`ct.`[`narrow`](/reference/locale/ctype/narrow.md)`(c, 0)`によって`char`へ変換して行われる + - 各シーケンスの最初の文字は`'%'`であり、その後ろに省略可能な修飾子文字`mod`と、[`std::strftime`](/reference/ctime/strftime.md)で定義される書式指定子文字`spec`が続く。修飾子文字がない場合、`mod`は`0`である + - 識別された妥当な書式シーケンスごとに、[`do_put`](do_put.md)`(s, str, fill, t, spec, mod)`を呼び出す +- (2) : [`do_put`](do_put.md)`(s, str, fill, t, format, modifier)`を呼び出す + + +## 戻り値 +生成した最後の文字の直後を指すイテレータ。 + + +## 備考 +`fill`は、処理系定義の書式や派生クラスでの実装において使用できる。空白文字がこの引数の妥当な既定値である。 + + +## 例 +### 基本的な使い方 +```cpp example +#include +#include +#include +#include +#include + +int main() +{ + std::tm t{}; + t.tm_year = 126; // 2026年 + t.tm_mon = 7; // 8月 + t.tm_mday = 25; + t.tm_hour = 13; + + std::ostringstream oss; + const auto& facet = std::use_facet>(oss.getloc()); + + // (1) 書式文字列を指定する + const char pattern[] = "%Y-%m-%d"; + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', &t, pattern, pattern + 8); + + oss << ' '; + + // (2) 単一の書式指定子を指定する + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', &t, 'H'); + + std::cout << oss.str() << std::endl; +} +``` +* std::time_put[link /reference/locale/time_put.md] +* put[color ff0000] +* std::use_facet[link /reference/locale/use_facet.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] +* std::tm[link /reference/ctime/tm.md] + +#### 出力 +``` +2026-08-25 13 +``` + +### ロケールによる違い +`%x`(日付)・`%A`(曜日名)・`%B`(月名)のように、Cロケールに依存すると規定されている書式指定子は、ストリームのロケールによって生成される文字列が変わる。 + +```cpp example +#include +#include +#include +#include +#include +#include +#include + +// 書式化の処理自体はロケールに依存しない +std::string format_time(const std::locale& loc, const std::tm& t, const std::string& pattern) +{ + std::ostringstream oss; + oss.imbue(loc); + + const auto& facet = std::use_facet>(oss.getloc()); + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', &t, + pattern.data(), pattern.data() + pattern.size()); + + return oss.str(); +} + +int main() +{ + std::tm t{}; + t.tm_year = 126; // 2026年 + t.tm_mon = 7; // 8月 + t.tm_mday = 25; + t.tm_wday = 2; // 火曜日 + + for (const char* name : {"en_US.UTF-8", "ja_JP.UTF-8", "de_DE.UTF-8"}) { + try { + std::locale loc{name}; + + std::cout << name << std::endl; + std::cout << " %x : " << format_time(loc, t, "%x") << std::endl; + std::cout << " %A : " << format_time(loc, t, "%A") << std::endl; + std::cout << " %B : " << format_time(loc, t, "%B") << std::endl; + } + catch (const std::runtime_error&) { + // 指定した名前のロケールが利用できない場合 + std::cout << name << " : not available" << std::endl; + } + } +} +``` +* put[color ff0000] +* std::time_put[link /reference/locale/time_put.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::locale[link /reference/locale/locale.md] +* std::runtime_error[link /reference/stdexcept.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* oss.getloc()[link /reference/ios/ios_base/getloc.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] +* std::tm[link /reference/ctime/tm.md] + +#### 出力例 +``` +en_US.UTF-8 + %x : 08/25/2026 + %A : Tuesday + %B : August +ja_JP.UTF-8 + %x : 2026/08/25 + %A : 火曜日 + %B : 8月 +de_DE.UTF-8 + %x : 25.08.2026 + %A : Dienstag + %B : August +``` + +- `%x`が生成する日付の書式は、米国では月・日・年、日本では年・月・日、ドイツでは日・月・年の順となる。この順序は[`std::time_get::date_order()`](/reference/locale/time_get/date_order.md)で取得できる +- Cロケールに依存すると規定されている書式指定子について生成される文字列は、処理系定義である +- 妥当なロケール名は処理系定義である。指定した名前のロケールが利用できない場合、[`std::locale`](/reference/locale/locale.md)のコンストラクタは[`std::runtime_error`](/reference/stdexcept.md)を送出し、上記の例では`not available`が出力される + + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put::do_put`](do_put.md) +- [`time_get`](/reference/locale/time_get.md) +- [`std::strftime`](/reference/ctime/strftime.md) diff --git a/reference/locale/time_put_byname.md b/reference/locale/time_put_byname.md index b38858ee97..09fb8c0827 100644 --- a/reference/locale/time_put_byname.md +++ b/reference/locale/time_put_byname.md @@ -13,33 +13,65 @@ namespace std { * time_put[link /reference/locale/time_put.md] ## 概要 -(ここに、クラスの概要を記載する) +`time_put_byname`は、名前で指定したロケールの日時の出力を提供する、[`time_put`](/reference/locale/time_put.md)の派生クラスである。 + +[`time_put`](/reference/locale/time_put.md)の仮想関数を、[`locale(const char*)`](locale/op_constructor.md)で同じ名前を指定して構築したロケールのファセットと等価な意味論で実装する。 + +このクラスは[`time_put`](/reference/locale/time_put.md)が提供するインタフェースをそのまま継承しており、独自のメンバ関数は持たない。 + +## メンバ関数 ### publicメンバ関数 | 名前 | 説明 | |----------------------------|-----------------------| -| `(constructor)` | コンストラクタ | +| [`(constructor)`](time_put_byname/op_constructor.md) | コンストラクタ | ### protectedメンバ関数 | 名前 | 説明 | |---------------------------|--------------------| -| `(destructor)` | デストラクタ | +| [`(destructor)`](time_put_byname/op_destructor.md) | デストラクタ | -### メンバ型 +## メンバ型 | 名前 | 説明 | |-----------------------------------------------------------------------|----------------------------------------------------------| | `char_type` | 文字型 `charT` | | `iter_type` | 出力のイテレータ型 `OutputIterator` | -### 例 -```cpp +## 例 +```cpp example +#include +#include + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale loc{std::locale::classic(), new std::time_put_byname{"C"}}; + + std::cout << std::boolalpha + << std::has_facet>(loc) << std::endl; +} ``` +* std::time_put_byname[color ff0000] +* std::locale[link locale.md] +* std::locale::classic()[link locale/classic.md] +* std::has_facet[link has_facet.md] +* std::time_put[link time_put.md] ### 出力 ``` +true ``` -### 参照 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put`](/reference/locale/time_put.md) +- [`locale`](locale.md) diff --git a/reference/locale/time_put_byname/op_constructor.md b/reference/locale/time_put_byname/op_constructor.md new file mode 100644 index 0000000000..9a0cd6da6e --- /dev/null +++ b/reference/locale/time_put_byname/op_constructor.md @@ -0,0 +1,97 @@ +# コンストラクタ +* locale[meta header] +* std[meta namespace] +* time_put_byname[meta class] +* function[meta id-type] + +```cpp +explicit time_put_byname(const char* name, size_t refs = 0); // (1) C++98 +explicit time_put_byname(const string& name, size_t refs = 0); // (2) C++98 +``` +* size_t[link /reference/cstddef/size_t.md] +* string[link /reference/string/basic_string.md] + +## 概要 +名前で指定したロケールの、日時の出力ファセットオブジェクトを構築する。 + +- (1) : ロケール名を`const char*`で受け取る +- (2) : ロケール名を[`string`](/reference/string/basic_string.md)で受け取る + + +## 効果 +- (1) : `name`を名前として[`locale(const char*)`](/reference/locale/locale/op_constructor.md)で構築されるロケールの、[`time_put`](/reference/locale/time_put.md)ファセットと等価な仮想関数の意味論を持つよう構築する。`refs`は基底クラスのコンストラクタへ渡される +- (2) : `time_put_byname(name.c_str(), refs)`と同じ効果を持つ + + +## 例外 +`name`が妥当なロケール名でない場合、もしくはヌルポインタである場合、[`std::runtime_error`](/reference/stdexcept.md)を送出する。 + + +## 備考 +`refs`は、このファセットの参照カウントの初期値である。 + +- `refs == 0`の場合、このファセットを保持する[`locale`](/reference/locale/locale.md)オブジェクトが破棄されるとき、ファセットも破棄される +- `refs == 1`の場合、[`locale`](/reference/locale/locale.md)オブジェクトの破棄によってファセットが破棄されることはない + +妥当なロケール名は処理系定義である。`"C"`と、処理系のネイティブロケールを表す空文字列`""`は、すべての処理系でサポートされる。 + +## 例 +```cpp example +#include +#include +#include +#include +#include + +std::string format(const std::locale& loc) +{ + std::ostringstream oss; + oss.imbue(loc); + + std::tm t{}; + t.tm_year = 126; // 2026年 + + const auto& facet = std::use_facet>(loc); + facet.put(std::ostreambuf_iterator{oss}, oss, ' ', &t, 'Y'); + + return oss.str(); +} + +int main() +{ + // ファセットのデストラクタはprotectedであるため、 + // newで確保してlocaleに所有権を渡す + std::locale a{std::locale::classic(), new std::time_put_byname{"C"}}; + + // 同じ名前で構築したロケール + std::locale b{"C"}; + + // bynameファセットは、同じ名前で構築したロケールのファセットと同じ意味論を持つ + std::cout << std::boolalpha << (format(a) == format(b)) << std::endl; +} +``` +* std::time_put_byname[color ff0000] +* std::locale[link /reference/locale/locale.md] +* std::locale::classic()[link /reference/locale/locale/classic.md] +* std::use_facet[link /reference/locale/use_facet.md] +* std::time_put[link /reference/locale/time_put.md] +* facet.put[link /reference/locale/time_put/put.md] +* oss.imbue[link /reference/ios/basic_ios/imbue.md] +* std::ostreambuf_iterator[link /reference/iterator/ostreambuf_iterator.md] +* oss.str()[link /reference/sstream/basic_ostringstream/str.md] +* std::tm[link /reference/ctime/tm.md] + +### 出力 +``` +true +``` + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put`](/reference/locale/time_put.md) +- [`locale`のコンストラクタ](/reference/locale/locale/op_constructor.md) +- [`locale::facet`](/reference/locale/locale/facet.md) diff --git a/reference/locale/time_put_byname/op_destructor.md b/reference/locale/time_put_byname/op_destructor.md new file mode 100644 index 0000000000..bb245f27ef --- /dev/null +++ b/reference/locale/time_put_byname/op_destructor.md @@ -0,0 +1,28 @@ +# デストラクタ +* locale[meta header] +* std[meta namespace] +* time_put_byname[meta class] +* function[meta id-type] + +```cpp +protected: + ~time_put_byname(); // (1) C++98 +``` + +## 概要 +`time_put_byname`ファセットオブジェクトを破棄する。 + + +## 備考 +このデストラクタは`protected`である。そのため`time_put_byname`オブジェクトを、利用者が直接`delete`することはできない。 + +ファセットの寿命は、それを保持する[`locale`](/reference/locale/locale.md)オブジェクトによって管理される。 + +## バージョン +### 言語 +- C++98 + + +## 関連項目 +- [`time_put_byname`のコンストラクタ](op_constructor.md) +- [`time_put`](/reference/locale/time_put.md) diff --git a/reference/locale/use_facet.md b/reference/locale/use_facet.md index 962b049736..6088556139 100644 --- a/reference/locale/use_facet.md +++ b/reference/locale/use_facet.md @@ -42,7 +42,7 @@ int main() * std::locale[link locale.md] * classic()[link locale/classic.md] * std::ctype[link ctype.md] -* toupper[link ctype/toupper.md.nolink] +* toupper[link ctype/toupper.md] ### 出力 ``` diff --git a/reference/regex/regex_traits/transform.md b/reference/regex/regex_traits/transform.md index 97530b9e59..a95f0ba7e9 100644 --- a/reference/regex/regex_traits/transform.md +++ b/reference/regex/regex_traits/transform.md @@ -24,7 +24,7 @@ return use_facet>(getloc()) * use_facet[link /reference/locale/use_facet.md] * collate[link /reference/locale/collate.md] * getloc()[link getloc.md] -* transform[link /reference/locale/collate/transform.md.nolink] +* transform[link /reference/locale/collate/transform.md] * str.data()[link /reference/string/basic_string/data.md] * str.length()[link /reference/string/basic_string/length.md] diff --git a/reference/regex/regex_traits/translate_nocase.md b/reference/regex/regex_traits/translate_nocase.md index 27bd1bbefb..2ac8c95abc 100644 --- a/reference/regex/regex_traits/translate_nocase.md +++ b/reference/regex/regex_traits/translate_nocase.md @@ -21,7 +21,7 @@ use_facet>(getloc()).tolower(c) * use_facet[link /reference/locale/use_facet.md] * ctype[link /reference/locale/ctype.md] * getloc[link getloc.md] -* tolower[link /reference/locale/ctype/tolower.md.nolink] +* tolower[link /reference/locale/ctype/tolower.md] ## 例