「数字」であることをチェックするには?

解決


らりばど  2002-03-28 17:40:05  No: 725  IP: [192.*.*.*]

こんにちわ。らりばどです。
みなさんはこんな時どうしているのでしょうか?
というのを教えていただきたくカキコしました。

環境:Windows2000 + Delphi6

コンソールアプリケーションで引数から数字を取得し、
StrToInt関数を使って数値に変換する処理を考えています。

数字を指定する引数に文字が無いか変換処理の前に事前確認したいのです。

インターネット上では、try文を使った事例が紹介されていましたが、
うまく動作しません。数字でないと実行時エラーが発生します。

(例)
> try
>   PSS := StrToInt(PDS);
> finally
>   writeln('引数は数字ではありません');
> end;

またStrToIntDef関数だと文字があった際に特定の数値を返り値と
することができますが、正負の数ともに変数での使用可能範囲すべてを
引数として扱いたい為に使用できません。

現在のところ、C言語でいうところの「Strspn関数」と同様な関数を
自作しようと思っていますが、なんかスッキリしません。

try構文の使い方が悪いのか?それとももっと簡単で良い方法が
存在するのか?教えて下さい。よろしくお願いします。

編集 削除
Taku  2002-03-28 20:43:52  No: 726  IP: [192.*.*.*]

単純に文字を整数に代入する場合には
try文の中でStrToIntで変換すれば簡単だと思います

但し、例文ではfinallyを使っているため
'PDS'が整数でも、'引数は数字ではありません'を書いてしまい
エラー表示してしまいます

exceptを使えば問題なく処理できると思います。

編集 削除
らりばど  2002-03-29 09:50:00  No: 727  IP: [192.*.*.*]

>Takuさん

レスありがとうございます。
exceptの件ですが、最初exceptで試行してみてダメだったので
finallyにしてみたんですがそれでもダメだったのです。
最終更新時のソースをそのままUPしてしまい、説明不足でした
すみません。

> インターネット上では、try文を使った事例が紹介されていましたが、

確かにこの事例というのもexceptを使っていました。
私んトコの環境だけがおかしいみたいですね。
もしかしてDelphiを再インストールすべきでしょうか???

編集 削除
にしの  2002-03-29 13:58:15  No: 728  IP: [192.*.*.*]

SysUtilsのほかに、usesしているUnitでStrToIntがあると、そちらを使ってしまうことがあります。
i := SysUtils.StrToInt(Edit1.Text);
のようにしてみてください。

try exceptで、例外が発生しなかったのはどういう値のときですか?
こちらでは、次のとおりです。
・'123'は正常。
・'abc'は例外発生。
・'1a'は例外発生。
・'1,000'は例外発生。
・'2147483647'は正常。
・'2147483648'は例外発生。
・'-2147483648'は正常。
・'-2147483649'は例外発生。
・'0x100'は正常。
・'$100'は正常。
・'$abcdef'は正常。
・'0xabcdef'は正常。
・'$defg'は例外発生。
・'0xdefg'は例外発生。

もしかして、16進数表記でエラーになってほしい、ということでしょうか。

編集 削除
らりばど  2002-04-03 08:58:12  No: 729  IP: [192.*.*.*]

急な出張でしばらく事務所を空けていました。
レスが遅くなり申し訳ありません。

  >にしのさん

usesしているunitはSysUtilsが基本です。
先日別スレッドで質問させていただいた自作ユニットが1つ。
もちろん同名関数は定義していません。

try exceptで、例外が発生する事例としては、
・-a
・0a0
の2つを処理させた場合です。
それ以外は確認していません。
(もちろん正常な数字文字列は正しく数値に変換されます。)

編集 削除
にしの  2002-04-03 10:44:54  No: 730  IP: [192.*.*.*]

> try exceptで、例外が発生する事例としては、
> ・-a
> ・0a0
> の2つを処理させた場合です。

それであっています。
2つとも数値に変換できないので例外が発生します。
これらを数値として認識したいということですか?

例外は、次のようにして扱います。

try
  i := StrToIntDef(Text1.Text);
except
  ShowMessage('数値に変換されません。0を代入します');
  i := 0;
end;

もしかして、デバッガ上でのダイアログのことを言っていますか?
コンパイルしたEXEではでませんよね。
メニューの、[ツール][デバッガオプション]の、[言語固有の例外]タブにある、
「Delphi言語の例外で停止」のチェックを外してみてください。

編集 削除
にしの  2002-04-03 10:45:40  No: 731  IP: [192.*.*.*]

間違えました。
StrToIntDefでなく、StrToIntでした。

編集 削除
らりばど  2002-04-04 11:23:17  No: 732  IP: [192.*.*.*]

>にしのさん

> もしかして、デバッガ上でのダイアログのことを言っていますか?
> コンパイルしたEXEではでませんよね。

いやそれがEXEで出るんです。

例外の記述については間違いありません。
try〜except構文を使っています。
コンパイルでは文法エラーは検出されません。
デバッガ上のダイアログが出るのは頷けます。
ですがEXEでも表示されるのです。

デバッガオプションについては、この後試行してみます。

編集 削除
らりばど  2002-04-08 18:47:25  No: 733  IP: [192.*.*.*]

解決しました。

結果的には「気付いた時には問題なく動くようになっていた」という
自分でもよく判っていない状況です。
試していませんが↓こんなところが原因ではないかと思います。
私の推測は正しいのでしょうか?

ソース修正
  try〜exceptを追記

コンパイル
  実行時引数には、エラーとなる引数を指定。
  エラー(ダイアログ表示)となるがキャンセル連打で抜ける。

(疑問)この時点ではEXEは置換わっていないのでは?

別件の修正。
  try〜exceptは記述したまま

コンパイル
  実行時引数には、エラーとならない引数を指定。
  もちろん問題なく終了。
  (想定)この時点でEXEが置換わる?

その後、数値判定はうまく判定できるようになる。

こんなことでお騒がせしてしまって本当に申し訳ありません。

編集 削除
らりばど  2002-04-13 13:50:45  No: 734  IP: [192.*.*.*]

解決時のチェックを入れ忘れていました。
すみません。

編集 削除