Namespaces
Variants

std:: num_put

From cppreference.net
ヘッダーで定義 <locale>
template <

class CharT,
class OutputIt = std:: ostreambuf_iterator < CharT >

> class num_put ;

クラス std::num_put は、数値を文字列としてフォーマットするための規則をカプセル化します。具体的には、 bool long unsigned long long long unsigned long long (C++11以降) double long double void * の型、およびこれらに暗黙的に変換可能なすべての型( int float など)がサポートされています。標準のフォーマット出力演算子(例: cout << n ; )は、数値のテキスト表現を生成するために、I/Oストリームのロケールの std::num_put ファセットを使用します。

cpp/locale/locale/facet std-num put-inheritance.svg

継承図

std::num_put の特殊化が標準ライブラリによって提供されることが保証されていない場合(下記参照)、その put() および do_put() の動作は指定通りに保証されません。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Specializations、Nested types、Data members、Member functions、Protected member functions、Example、Defect reports、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、ID、リンク先は一切変更していません - 数値や書式設定は完全に保持されています

特殊化

標準ライブラリは以下の特殊化を提供することが保証されています(これらは あらゆるロケールオブジェクトで実装が必須 とされています):

ヘッダーで定義 <locale>
std :: num_put < char > 数値のナロー文字列表現を生成
std :: num_put < wchar_t > 数値のワイド文字列表現を生成

さらに、標準ライブラリは以下の型要件を満たすすべての特殊化を提供することも保証されています:

ネスト型

定義
char_type CharT
iter_type OutputIt

データメンバ

メンバー 説明
std::locale::id id [static] facet の識別子

メンバー関数

新しい num_put ファセットを構築する
(public member function)
do_put を呼び出す
(public member function)

プロテクテッドメンバー関数

num_put ファセットを破棄する
(protected member function)
[virtual]
数値をフォーマットして出力ストリームに書き込む
(virtual protected member function)

#include <iostream>
#include <iterator>
#include <locale>
#include <string>
int main()
{
    double n = 1234567.89;
    std::cout.imbue(std::locale("de_DE.UTF-8"));
    std::cout << "文字列への直接変換:\n"
              << std::to_string(n) << '\n'
              << "ドイツ語ロケールを使用した出力:\n"
              << std::fixed << n << '\n'
              << "アメリカ英語ロケールを使用した出力:\n";
    // ファセットを直接使用
    std::cout.imbue(std::locale("en_US.UTF-8"));
    auto& f = std::use_facet<std::num_put<char>>(std::cout.getloc());
    f.put(std::ostreambuf_iterator<char>(std::cout), std::cout, ' ', n);
    std::cout << '\n';
}

出力例:

文字列への直接変換:
1234567.890000
ドイツ語ロケールを使用した出力:
1.234.567,890000
アメリカ英語ロケールを使用した出力:
1,234,567.890000

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 427 C++98 num_put はあらゆる CharT を受け入れることが保証されていた
(iostreamコンポーネントのインスタンス化が可能な
文字要件を満たすもの)
char
wchar_t およびその他の実装定義の
文字型のみを受け入れることが保証される
LWG 2392 C++98 文字型 CharT のみが
num_put による受け入れが保証されていた
実装定義の文字コンテナ型の
受け入れを保証できる

関連項目

数値の区切り規則を定義する
(クラステンプレート)
入力文字シーケンスから数値を解析する
(クラステンプレート)
(C++11)
整数値または浮動小数点値を string に変換する
(関数)
(C++11)
整数値または浮動小数点値を wstring に変換する
(関数)