C++ で文字列が数値かどうかを判断する方法

胡金庫 2023年10月12日
  1. 文字列が数値かどうかを調べるには std::isdigit メソッドを使用する
  2. 文字列が数値かどうかを判定するための std::isdigitstd::range::all_of の併用
  3. 文字列が数値かどうかを判定するには find_first_not_of メソッドを用いる
C++ で文字列が数値かどうかを判断する方法

この記事では、与えられた C++ 文字列が数値であるかどうかを調べる方法を説明します。掘り下げる前に、以下のメソッドは半角文字列と 10 進数の整数としか互換性がないことに注意してください。

文字列が数値かどうかを調べるには std::isdigit メソッドを使用する

最初のバージョンは、おそらくこの解決策を実装するための最もわかりやすい方法です。つまり、文字列をパラメータとして関数 isNumber に渡すと、関数 string に含まれるすべての char を繰り返し処理して isdigit メソッドでチェックします。最初の非数値が見つかった場合、関数は偽を返し、見つからなかった場合は真を返します。

#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& str) {
  for (char const& c : str) {
    if (std::isdigit(c) == 0) return false;
  }
  return true;
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}

出力:

Not number
Number
Not number

? x : y 三項条件演算子を介して各文字列に判定を出力することに注意してください。これは if-else の簡潔な変形です。

文字列が数値かどうかを判定するための std::isdigitstd::range::all_of の併用

前のメソッドは強大な C++ にとっては非常に基本的なものでしたので、C++20 のメソッド std::ranges::all_of といくつかのラムダ式を使って、より雄弁な解決策を実装してみましょう。ここでは、ranges::all_of は指定された範囲 s.begin(), s.end() の各要素について、指定されたラムダが真を返すかどうかを調べ、条件が満たされていれば真を返します。

#include <algorithm>
#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& s) {
  return std::ranges::all_of(s.begin(), s.end(),
                             [](char c) { return isdigit(c) != 0; });
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}

文字列が数値かどうかを判定するには find_first_not_of メソッドを用いる

このバージョンでは、組み込みの文字列検索アルゴリズムを利用しています。このアルゴリズムは、引数として渡された string に含まれる文字のうち、最初の文字と等しい文字を探します (ここでは 0123456789 とします)。見つからなかった場合は string::npos が返されるので、isNumber の比較結果を返します。

#include <iostream>

using std::cin;
using std::cout;
using std::endl using std::string;

bool isNumber(const string& str) {
  return str.find_first_not_of("0123456789") == string::npos;
}

int main() {
  string str1 = "231524randstr23";
  string str2 = "23152423";
  string str3 = "a3152423";

  isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
  isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";

  return EXIT_SUCCESS;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ String