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

  1. 文字列が数値かどうかを調べるには std::isdigit メソッドを使う
  2. 文字列が数値かどうかを判定するための std::isdigitstd::range::all_of の併用
  3. 文字列が数値かどうかを判定するには find_first_not_of メソッドを用いる

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

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

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

#include <iostream>

using std::cout;
using std::cin;
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 <iostream>
#include <algorithm>

using std::cout;
using std::cin;
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::cout;
using std::cin;
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;
}

関連記事 - C++ String

  • C++ で文字列をトリムする方法
  • C++で文字列の中の部分文字列を検索する方法
  • comments powered by Disqus