最終更新日時: 2026年01月20日 11時35分12秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<string>

# std::to_string(C++11)

    namespace std {
      string to_string(int val);                          // (1) C++11
      constexpr string to_string(int val);                // (1) C++26

      string to_string(unsigned int val);                 // (2) C++11
      constexpr string to_string(unsigned int val);       // (2) C++26

      string to_string(long val);                         // (3) C++11
      constexpr string to_string(long val);               // (3) C++26

      string to_string(unsigned long val);                // (4) C++11
      constexpr string to_string(unsigned long val);      // (4) C++26

      string to_string(long long val);                    // (5) C++11
      constexpr string to_string(long long val);          // (5) C++26

      string to_string(unsigned long long val);           // (6) C++11
      constexpr string to_string(unsigned long long val); // (6) C++26

      string to_string(float val);                        // (7) C++11
      string to_string(double val);                       // (8) C++11
      string to_string(long double val);                  // (9) C++11
    }

## 概要

数値`val`を`string`型文字列に変換する。

- (1) : `int`型の値を`string`型に変換する
- (2) : `unsigned int`型の値を`string`型に変換する
- (3) : `long`型の値を`string`型に変換する
- (4) : `unsigned long`型の値を`string`型に変換する
- (5) : `long long`型の値を`string`型に変換する
- (6) : `unsigned long long`型の値を`string`型に変換する
- (7) : `float`型の値を`string`型に変換する
- (8) : `double`型の値を`string`型に変換する
- (9) : `long double`型の値を`string`型に変換する

## 戻り値

- C++11まで 各数値型に対して、`sprintf(buf, fmt, val)`によって生成された文字列の`string`オブジェクトを返す。使用されるバッファサイズは未規定。

  各型で使用されるフォーマットは以下のようになる：

  型 | フォーマット
  --- | ---
  `int` | `"%d"`
  `unsigned int` | `"%u"`
  `long` | `"%ld"`
  `unsigned long` | `"%lu"`
  `long long` | `"%lld"`
  `unsigned long long` | `"%llu"`
  `float` | `"%f"`
  `double` | `"%f"`
  `long double` | `"%Lf"`

- C++26から

      return format("{}", val);

## 例

    #include <iostream>
    #include <string>

    int main()
    {
      std::string s1 = std::to_string(123);
      std::cout << s1 << std::endl;

      std::string s2 = std::to_string(3.14);
      std::cout << s2 << std::endl;
    }

### 出力

    123
    3.140000

## 実装例

    #include <cstdio>
    #include <string>
    #include <limits>

    std::string to_string(int val)
    {
      char buffer[std::numeric_limits<int>::digits10 + 1
              + 2]; // '-' + '\0'
      std::sprintf(buffer, "%d", val);
      return buffer;
    }

    std::string to_string(unsigned int val)
    {
      char buffer[std::numeric_limits<unsigned int>::digits10 + 1
              + 1]; // '\0'
      std::sprintf(buffer, "%u", val);
      return buffer;
    }

    std::string to_string(long val)
    {
      char buffer[std::numeric_limits<long>::digits10 + 1
              + 2]; // '-' + '\0'
      std::sprintf(buffer, "%ld", val);
      return buffer;
    }

    std::string to_string(unsigned long val)
    {
      char buffer[std::numeric_limits<unsigned long>::digits10 + 1
              + 1]; // '\0'
      std::sprintf(buffer, "%lu", val);
      return buffer;
    }

    std::string to_string(long long int val)
    {
      char buffer[std::numeric_limits<long long int>::digits10 + 1
              + 2]; // '-' + '\0'
      std::sprintf(buffer, "%lld", val);
      return buffer;
    }

    std::string to_string(unsigned long long int val)
    {
      char buffer[std::numeric_limits<unsigned long long int>::digits10 + 1
              + 1]; // '\0'
      std::sprintf(buffer, "%llu", val);
      return buffer;
    }

    std::string to_string(float val)
    {
      char buffer[std::numeric_limits<float>::max_exponent10 + 1
              + 6   // fixed precision (printf's default)
              + 3]; // '-' + '.' + '\0'
      std::sprintf(buffer, "%f", val);
      return buffer;
    }

    std::string to_string(double val)
    {
      char buffer[std::numeric_limits<double>::max_exponent10 + 1
              + 6   // fixed precision (printf's default)
              + 3]; // '-' + '.' + '\0'
      std::sprintf(buffer, "%f", val);
      return buffer;
    }

    std::string to_string(long double val)
    {
      char buffer[std::numeric_limits<long double>::max_exponent10 + 1
              + 6   // fixed precision (printf's default)
              + 3]; // '-' + '.' + '\0'
      std::sprintf(buffer, "%Lf", val);
      return buffer;
    }

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.5.4 ✅
- ICC: ?
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅, 2017 ✅
  - 2010は、不完全な実装。以下の型のみ多重定義されている。
    - `long long`
    - `unsigned long long`
    - `long double`

## 関連項目

名前 | 参照
--- | ---
`to_wstring` | 数値を`wstring`に変換する
`to_chars` | ロケール依存しない高速な変換

## 参照

- N2408 Simple Numeric Access Revision 2
- P2587R3 `to_string` or not `to_string`
  - C++26から`sprintf`ベースの仕様をやめて`std::format()`ベースの仕様になった
- P3391R2 `constexpr std::format`
  - C++26から整数バージョンが`constexpr`に対応した