入力チェック への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 masaX  (社会人) 投稿日時 2017/6/8 11:28:18
魔界の仮面弁士様
ありがとうございます。

なるほど、この単純なコードでは間違った検証をしてしまう場合が多いですね(汗)
勉強になりました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/6/8 10:11:07
ちょっと気になったので、masaX さんのコードについて追加検証してみました。
コントロールパネルの地域設定に依存する部分もありますが:

(a)「1234」  が 1234 に解釈され、4文字扱いになる。(全角文字)
(b)「+5555」     が 5555 に解釈され、4文字扱いになる。(正の符号の先導)
(c)「-987」      が -987 に解釈され、4文字扱いになる。(負の符号の先導)
(d)「(275)」     が -275 に解釈され、4文字扱いになる。(丸括弧による負数表記)
(e)「9753.10」   が 9753 に解釈され、4文字扱いになる。(小数表記)
(f)「1.3579E3」  が 1358 に解釈され、4文字扱いになる。(正数となる指数表記)
(g)「-333333E-3」が -333 に解釈され、4文字扱いになる。(負数となる指数表記)
(h)「&H9A4」     が 2468 に解釈され、4文字扱いになる。(16進数表記)
(i)「&o1750」    が 1000 に解釈され、4文字扱いになる。(8進数表記)
(j)「1,2,34,.56」が 1235 に解釈され、4文字扱いになる。(桁区切り記号)
(k)「\1,234」    が 1234 に解釈され、4文字扱いになる。(通貨記号)
(l)「  5432  」  が 5432 に解釈され、4文字扱いになる。(先導空白あるいは後続空白)
(m)「&H80000000」が 2147483648 に解釈され、CInt 時に OverflowException の例外が発生する。
(n)「-∞」       が Double.NegativeInfinity に解釈され、CInt 時に OverflowException の例外が発生する。


ここまでにあった回答以外の手段として、他にも
 ・正規表現を使った判定方法
 ・Like 演算子を使った判定方法
 ・Integer.TryParse を使った上で変換後の値の大小を調べる方法
 ・MaskedTextBox コントロールを使った入力検査
など、いろいろな方法が考えられます。

処理タイミングについても、キー入力時(KeyPress 等)、テキスト変更時(TextChanged 等)、
入力検証時(Validating 等)、ボタンクリック時(Click 等)と様々ですし、時には、
これらを組み合わせてチェックすることもあります。

「4 桁の数値を得られれば、入力文字列の形式にはこだわらない」のか、
「4 桁の数字(≠数値)で構成された文字列であることを期待する」のか、
最終的に求める処理にあわせて使い分けてみてください。
投稿者 masaX  (社会人) 投稿日時 2017/6/7 19:35:54
ボタンを押した時の検証で良ければ
低レベルなコードかも知れませんが、単純に

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If IsNumeric(TextBox1.Text) = True Then  '入力が数値かどうか?
            Dim tx As String = CStr(CInt(TextBox1.Text)) '数値に変換してから文字列に変換(0から始まる文字だった場合を考慮して)
            If Len(tx) <> 4 Then  '4文字かどうか
                MsgBox("4桁の数値を入力してください")
                Exit Sub
            End If
        Else
            MsgBox("数値を入力してください")
            Exit Sub
        End If
        MsgBox("OK")
    End Sub

こんなのでどうですか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/6/1 11:48:25
TextBox ではなく NumericUpDown を使うようにして、
デザイン時にプロパティ設定を
 Maximum = 9999
 Minimum = 1000
にしておくという手法もあるかと思います。

この場合、入力された値を
 Dim s As String = TextBox1.Text
のかわりに
 Dim d As Decimal = NumericUpDown1.Value
で取得できます。
投稿者 daive  (社会人) 投稿日時 2017/6/1 10:31:10
>文字列をshift-jisにコード変換してからバイト数を数えればいいかと。
>この考え方はVB6の時代から変わりません。
この考え方は、危険です。

Shift_JIS 一つとっても、亜種があり(MS、IBM、Appleなど、汎用機のフォントはメーカ亜種の塊)
油断していると、嵌められます。
古い処では、文字コードとフォントの相対の変更で、籠、篭のコードが変更になったり、

98時代の4分1角、2分1角まで考えると、悪夢です。

UTF、UNICODEには、Shift-JISに対応しない
文字コードがあり、単純な例では、
Windowsのファイル名としては扱えても、
VB6、VBA6/7のDIR関数では、問題を起こす文字があったりします。
⇒ここ暫くは、悩まされないが、出ると拒否しているのが、外字対応です。

私の場合は、現状では、半角カナは使用禁止としています。(2分1角は当然禁止)
― ‐ - なんて Shift-JIS では、ろくに区別しなかったけれど、今では区別します。

投稿者 (削除されました)  () 投稿日時 2017/5/31 11:43:48
(削除されました)
投稿者 金吾中納言  (社会人) 投稿日時 2017/5/31 11:43:45
文字列をshift-jisにコード変換してからバイト数を数えればいいかと。
この考え方はVB6の時代から変わりません。

System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(テキストボックスの値)

VBのデフォルトはuniコードなので、そのままGetByteCountでチェックしても、
1バイト文字も2byteとして計算されます。
投稿者 daive  (社会人) 投稿日時 2017/5/25 17:01:37
検索ワード例
vb.net 2010 textbox validation
↑で、グーグル検索してみて下さい。
Validating 、 Validated を使いたくない場合は、
別な方法もあります。

エラーにして、、、
さて、エラー状態が解消されない場合は、どうするんだろう?
元の値に戻すのか、近い範囲で、補正するのか?
UI は、1面だけ見てもダメで、想定範囲内だけではなく、
想定範囲外では、如何あるべき?
から、考慮する必要があります。
投稿者 fd  (高校生) 投稿日時 2017/5/25 14:48:49
vb2010

テキストボックスとボタンがあります。
テキストボックスに数字を入力してボタンを押下したら
テキストボックスに入力した数値が4桁ではない場合
エラーにしたいのですが調べても分かりません
良かったら教えていただきたいです。