C++ で文字列が数値かどうかを判断する方法
胡金庫
2023年10月12日
-
文字列が数値かどうかを調べるには
std::isdigit
メソッドを使用する -
文字列が数値かどうかを判定するための
std::isdigit
とstd::range::all_of
の併用 -
文字列が数値かどうかを判定するには
find_first_not_of
メソッドを用いる
この記事では、与えられた 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::isdigit
と std::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;
}
著者: 胡金庫