C++で指定した文字列が有効な数値かどうかを判定する方法
概念
本記事のテーマは、与えられた文字列が「有効な数値」であるかどうかを検証する方法です。単純な整数だけでなく、小数点や「2e5」のような指数表記(e表記)を含む文字列も正しく判定できるようにします。
| 入力 | 出力 |
|---|---|
| str = "12.5" | true |
| str = "def" | false |
| str = "2e5" | true |
| str = "10e4.4" | false |
このように、"12.5" や "2e5"(指数表記)は数値として有効ですが、"def" のような英字のみの文字列や、"10e4.4" のように e の後ろに小数点が含まれる文字列は無効と判定されます。
判定のアプローチ
文字列が有効な数値かどうかを判定するには、コード上で次のケースを適切に処理する必要があります。
文字列の先頭と末尾にある空白文字は読み飛ばします。
先頭に現れる「+」「-」「.」の各記号を許容します。
文字列を構成するすべての文字が {+, -, ., e, [0-9]} のいずれかに含まれていることを確認します。
「e」の後ろに「.」が出現してはならないことを確認します。
小数点「.」の直後には必ず数字が続かなければなりません。
「e」の直後には「+」「-」、または数字が続かなければなりません。
C++による実装例
// 入力された文字列が有効な数値かどうかを
// 判定するC++プログラム
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int valid_number(string str1){
int i = 0, j = str1.length() - 1;
// 先頭の空白を読み飛ばす
while (i < str1.length() && str1[i] == ' ')
i++;
// 末尾の空白を読み飛ばす
while (j >= 0 && str1[j] == ' ')
j--;
// 空白のみの文字列は無効
if (i > j)
return 0;
// 1文字しかなく、それが数字でない場合は無効
if (i == j && !(str1[i] >= '0' && str1[i] <= '9'))
return 0;
// 先頭の文字が「.」「+」「-」または数字以外なら無効
if (str1[i] != '.' && str1[i] != '+' && str1[i] != '-'
&& !(str1[i] >= '0' && str1[i] <= '9'))
return 0;
// 「.」または「e」がすでに出現したかを管理するフラグ
bool flagDotOrE = false;
for (; i <= j; i++) {
// 数字、+、-、.、e 以外の文字が含まれていれば無効
if (str1[i] != 'e' && str1[i] != '.'
&& str1[i] != '+' && str1[i] != '-'
&& !(str1[i] >= '0' && str1[i] <= '9'))
return 0;
if (str1[i] == '.') {
// 「.」は一度しか使えず、「e」の後にも使えない
if (flagDotOrE == true)
return 0;
// 「.」の直後には数字が必要
if (!(str1[i + 1] >= '0' && str1[i + 1] <= '9'))
return 0;
}
else if (str1[i] == 'e') {
flagDotOrE = true;
// 「e」の直前には数字が必要
if (!(str1[i - 1] >= '0' && str1[i - 1] <= '9'))
return 0;
// 「e」の直後には「+」「-」または数字が必要
if (str1[i + 1] != '+' && str1[i + 1] != '-'
&& !(str1[i + 1] >= '0' && str1[i + 1] <= '9'))
return 0;
}
}
return 1;
}
// 動作確認用のドライバーコード
int main(){
string str1 = "0.1e10";
if (valid_number(str1))
cout << "true";
else
cout << "false";
return 0;
}
出力
true
コードの解説
このプログラムは、まず両端の空白を取り除いたうえで、残った文字列を1文字ずつ走査して検証を行います。
- 前処理: インデックス i と j を使い、先頭と末尾の空白をスキップします。空白しか存在しない場合は無効と判断します。
- 先頭のチェック: 最初の文字は「+」「-」「.」または数字のいずれかでなければなりません。
- ループ内のチェック: 各文字が許可されたセット {+, -, ., e, 数字} に含まれているかを確認し、さらに「.」と「e」の位置関係や前後の文字を検証します。flagDotOrE フラグによって、「e」以降に「.」が再び現れることを防いでいます。
すべての条件を満たした場合のみ、その文字列は有効な数値として関数が 1(true)を返します。
-
Pythonで文字列が有効な数値かどうかを判定する方法
数値や小数点を含む文字列が与えられたとき、その文字列が実際に数値として有効かどうかを判定する方法を解説します。例えば、入力が「2.5」であれば結果は True となり、「xyz」のような文字列であれば False となります。解決のアプローチこの問題を解決するには、以下の手順に従います。プログラミング言語が持つ文字列パース(型変換)の仕組みを利用します。文字列を数値に変換しようと試みます。変換が成功して例外が発生しなければ、その文字列は数値として有効です。逆に、変換時に例外(ValueError など)が発生した場合は、数値ではないと判断できます。実装例以下のコードは、float() 関数と例
-
Pythonで文字列・数値が回文(パリンドローム)かどうかを判定する方法【スライス活用】
本記事では、入力された文字列や数値が回文(パリンドローム)であるかどうかを判定するPythonプログラムの解決策とアプローチについて解説します。 問題の概要 文字列が入力として与えられたとき、それが回文であるかどうかを判定するPython関数を作成する必要があります。 回文とは、文字列を逆から読んでも元の文字列と完全に一致するものを指します。たとえば「78287」や「しんぶんし」などが代表的な例です。 解決のアプローチ 回文判定は、主に以下の2つの方法で実現できます。 スライスによる文字列の反転 負のインデックスを使った比較 本記事では、このうちスライスを使った文字列の反転方法を中心に