- PR -

テキストボックスに数字を入力する際の制御

投稿者投稿内容
junko
常連さん
会議室デビュー日: 2004/03/10
投稿数: 23
投稿日時: 2004-05-11 13:29
お忙しい中詳しい説明をして頂きありがとうございました。
試してみて、後ほど結果を報告させて頂きます。

[/quote]

new Regex(@"^d{1,2}.d{1,6}$|^d{1,2}$"); のうち、
^ … 「文字列の最初」を表す
$ … 「文字列の最後」を表す
つまり、"^なんたらかんたら$"とすると、「なんたらかんたら」という入力文字列そのものに一致する。ついていないと、「なんたらかんたら」を含む文字列に一致する。
| … 検索対象のor演算、つまり、この記号の左か右に一致するもの
d … 十進表記の数値
{1,2} … 1つまたは2つ
つまり、"d{1,2}"で、「十進数1桁または2桁」、
"d{1,2}.d{1,6}"で、「十進数1桁または2桁、続いて小数点、続いて十進数1桁から6桁」となり、「十進数で2桁の整数部と6桁までの小数部」を表す。
"d{1,2}.d{1,6}|d{1,2}"で、「十進数で1〜2桁の整数部と1〜6桁までの小数部、または、十進数で1〜2桁の整数」を含んでいる文字列が対象となる。これに^と$を付けて"^d{1,2}.d{1,6}$|^d{1,2}$"とすることで、「十進数で1〜2桁の整数部と1〜6桁までの小数部、または、十進数で1〜2桁の整数」である文字列が対象となる。

 「(スペース)1」ははじかれるし、「00.00」は通るので、こういう例外的な要素は別に定義する必要があります。
 たとえば、trimした文字列を検査対象とすることで「(スペース)1」などを通すことができます。いったんこの正規表現にマッチすると「floatに変換可能」であることが保証されるので、floatに変換後、ToStringを通すことで「00.00」などの冗長なゼロ表現を検査することができます。

 符号がつくかもしれない場合は、"^[-+]?d{1,2}.d{1,6}$|^[-+]?d{1,2}$"


参照するMSDNのキーワード(キーワードタブの「検索する文字列」に入力):
「正規表現, 代替構成体」
「正規表現, 文字クラス」
「正規表現, 量指定子」
「正規表現, アトミック ゼロ幅アサーション」
[/quote]
junko
常連さん
会議室デビュー日: 2004/03/10
投稿数: 23
投稿日時: 2004-05-11 13:38
この方法だと整数を必ず2桁入力しないと駄目って事はないのでしょうか?
教えて頂いているのに何度も質問してしまいすみません。。。

引用:

Jubeiさんの書き込み (2004-05-11 11:44) より:
諸農です。

テキストボックスに入力された情報をチェックする、
という前提でいいですか?
であれば、

コード:
     string mes = "";
     Regex r = new Regex(@"^d{1,2}.d{1,6}$|^d{1,2}$"); 
     if (r.IsMatch(textBox1.Text)) mes = "OKです";
     else mes = "入力が不適切です";
     MessageBox.Show(mes);



このような感じでチェックが可能でしょう。
チェックをValidatingイベントで行うのであれば、
MessageBoxの代わりにErrorProviderクラスで通知してもいいと思います。

--補足--
正規表現は、私もまだ始めたばかりでパフォーマンスの良いが
書けないのですが

"^d{1,2}.d{1,6}$|^d{1,2}$"

この正規表現の「|」の前半部分で「00.0」〜「00.000000」までを
判定しており、後半部分では「00」を判定しています。
「|」はORの意味です。
「^」と「$」は行頭、行末を意味しています。
「{,}」は最小値と最大値をあらわしています。
「d」は数値を意味しており、これは[0-9]で置き換えることが可能です。

ではでは(^^)/


Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-11 13:55
諸農です。

引用:


この方法だと整数を必ず2桁入力しないと駄目って事はないのでしょうか?
教えて頂いているのに何度も質問してしまいすみません。。。



当たるも八卦、当たらぬも八卦。
簡単なコードですので、一度ご自分で試してください。。(^_^;)

で、Jittaさんからのコメントにあるとおりです。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
junko
常連さん
会議室デビュー日: 2004/03/10
投稿数: 23
投稿日時: 2004-05-11 14:00
ありがとうございます(^○^)
今教えて頂いた通りに書いたら見事に出来ました。
本当にありがとうございました。

[/quote]

当たるも八卦、当たらぬも八卦。
簡単なコードですので、一度ご自分で試してください。。

で、Jittaさんからのコメントにあるとおりです。


[/quote]
junko
常連さん
会議室デビュー日: 2004/03/10
投稿数: 23
投稿日時: 2004-05-17 13:57
private void TextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
Regex r = new Regex(@"^[1-9]?[0-9](?:\.[0-9]{0,6})$");
if (r.IsMatch(TextBox.Text)) MessageBox.Show(this, "OKです", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

else MessageBox.Show(this,"入力が不正です", MessageBoxButtons.OKCancel);
}

↑という風に書いて数字の制御はうまく出来るようになったのですが、
今度は違う問題が発生しました。テキストボックスに一度カーソルをフォーカスした後、
編集等の入力を行わずCanselボタンを押すと何も入力していないにも関わらず
「OKです」のメッセージが出てしまいます。
編集(書き込み)が行われた際だけメッセージが出るようにしたいのですが・・・
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-17 14:21
引用:

junkoさんの書き込み (2004-05-17 13:57) より:


 Validatingイベントの説明をよく読んでください。ErrorProviderを配置して、e.Cancelを設定します。

 また、「検査をしないボタン」などは、CausesValidationプロパティをfalseにします。


 問題は、Form。「×」などで閉じようと思っても閉じられない...
junko
常連さん
会議室デビュー日: 2004/03/10
投稿数: 23
投稿日時: 2004-05-17 14:31
FormはClosingイベントで制御しているので大丈夫です。
ErrorProviderとはどのような物ですか?
CausesValidationプロパティとは?
詳細教えて頂いてもよろしいでしょうか?

別個に用意してあるキャンセルボタンで制御するという事でしょうか?
いつもすみません。

[ メッセージ編集済み 編集者: junko 編集日時 2004-05-17 14:42 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-17 14:42
ErrorProvider クラス
 Validatorが失敗すると、小さい「!」マークがでて、そこがエラーだということをわかりやすくします。

Control.CausesValidation プロパティ
 Validatingイベントの発生有無をコントロールします。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-05-17 14:44 ]

スキルアップ/キャリアアップ(JOB@IT)